Moin,
ich bin gerade auf der Fehlersuche an der I2C/TWI Schnittstelle am
ATSAME70N20. Ich hänge nur mit 2 Pullups (4,7K) und Oszi an der
Schnittstelle und sehe 3,3V. Ich nutze die TWIHS0 an PA3 und PA4, dazu
aktuell noch den Systemtakt mit 12MHz.
Ich bin ein bisschen Ideenlos warum gar nichts passiert. (Weder Takt
noch Daten).
Hier mein Code:
1 | #include "I2C.h"
|
2 | #include "sam.h"
|
3 | #include "same70n20.h"
|
4 |
|
5 | #define I2C_CLK_SPEED 100000
|
6 | #define I2C_MODULE TWIHS0
|
7 |
|
8 | void I2C_Master_Init(void){
|
9 | /* Enable TWI peripheral clock */
|
10 | PMC->PMC_PCER0 = PMC_PCER0_PID19;
|
11 |
|
12 | /* Configure PIOA Pins for I2C */
|
13 | PIOA->PIO_PDR = (PIO_PDR_P3 | PIO_PDR_P4);
|
14 | PIOA->PIO_ABCDSR[0] &= ~(PIO_ABCDSR_P3 | PIO_ABCDSR_P4);
|
15 | PIOA->PIO_ABCDSR[1] &= ~(PIO_ABCDSR_P3 | PIO_ABCDSR_P4);
|
16 |
|
17 | /* Configure TWI clock waveform generator */
|
18 | I2C_MODULE->TWIHS_CWGR = TWIHS_CWGR_CLDIV(((SystemCoreClock / (2 * I2C_CLK_SPEED))) - 3) |
|
19 | TWIHS_CWGR_CHDIV(((SystemCoreClock / (2 * I2C_CLK_SPEED))) - 3) |
|
20 | TWIHS_CWGR_CKDIV(0);
|
21 | /* Enable TWI module */
|
22 | I2C_MODULE->TWIHS_CR = TWIHS_CR_SWRST;
|
23 | I2C_MODULE->TWIHS_CR = TWIHS_CR_SVDIS;
|
24 | I2C_MODULE->TWIHS_CR = TWIHS_CR_MSEN;
|
25 | }
|
26 |
|
27 | uint8_t I2C_write_data(uint8_t* data, uint8_t length, uint8_t sendStopCondition, uint8_t address) {
|
28 | //Set slave address
|
29 | I2C_MODULE->TWIHS_MMR = TWIHS_MMR_IADRSZ(0);
|
30 | I2C_MODULE->TWIHS_MMR |= TWIHS_MMR_DADR(address);
|
31 | I2C_MODULE->TWIHS_MMR &=~ TWIHS_MMR_MREAD;
|
32 | I2C_MODULE->TWIHS_CR = TWIHS_CR_MSEN;
|
33 |
|
34 | for (uint8_t i = 0; i < length; i++){
|
35 | //send data
|
36 | I2C_MODULE->TWIHS_THR = data[i];
|
37 | while(!(I2C_MODULE->TWIHS_SR & TWIHS_SR_TXRDY));
|
38 | }
|
39 |
|
40 | //if we have to send stop condition (instead of a new start condition)
|
41 | if(sendStopCondition){
|
42 | /* Send stop condition */
|
43 | I2C_MODULE->TWIHS_CR = TWIHS_CR_STOP;
|
44 | while (!(I2C_MODULE->TWIHS_SR & TWIHS_SR_TXCOMP));
|
45 | }
|
46 | return I2C_NO_ERROR_DETECTED;
|
47 | }
|
Hat jemand von euch noch eine zündende Idee?
Gruß
Hannes