Hallo, ich hab gerade ein paar Schwierigkeiten mit TWI bei den Atmel-ICs (AT91SAM9260). Die Seite mit der Zusammenfassung von einigen Buggs hab ich mir angeschaut. http://www.mikrocontroller.net/articles/AT91-TWI Im Moment versuche ich aus einem Eeprom Daten auszulesen. Jedoch bekomm ich keine Rückmeldung nachdem ich die Kommunikation gestartet habe. -> daher wird nach einer Weile das NACK Bit gesetzt im Status-Register. Meine Init-Function lautet:
1 | /* Configure TWI PIOs */
|
2 | AT91F_TWI_CfgPIO (); |
3 | |
4 | /* Configure PMC by enabling TWI clock */
|
5 | AT91F_TWI_CfgPMC (); |
6 | |
7 | /* Reset the TWI */
|
8 | AT91C_BASE_TWI->TWI_CR = AT91C_TWI_SWRST; |
9 | |
10 | /* Configure TWI in master mode */
|
11 | AT91F_TWI_Configure (AT91C_BASE_TWI); |
12 | |
13 | /* Set TWI Clock Waveform Generator Register */
|
14 | AT91F_SetTwiClock(); |
15 | |
16 | //TWI NACK Bug workaround
|
17 | AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, |
18 | AT91C_ID_TWI, |
19 | 7, |
20 | AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE, |
21 | (void (*)(void))dummy_irq); |
22 | *AT91C_TWI_IER = (1<<0); |
23 | *AT91C_TWI_CR = AT91C_TWI_MSEN; |
Read-Function:
1 | void AT91F_AT24C_ReadPage (struct at24c *ptAt24c, |
2 | char *Buffer, |
3 | unsigned int NumOfBytes, |
4 | unsigned int PageNumber, |
5 | unsigned int AddressOffSet) |
6 | {
|
7 | unsigned int WordAddress; |
8 | unsigned int SlaveAddress; |
9 | unsigned int Count ; |
10 | unsigned int status=0; |
11 | unsigned int timeout = 0; |
12 | |
13 | |
14 | /* Addr: 1010 101(R/W) */
|
15 | SlaveAddress = (0xAA<<16); |
16 | |
17 | /* pagenbr = 2, pagesize = 256; offset am anfang 0 */
|
18 | WordAddress = (PageNumber*ptAt24c->PageSize) + AddressOffSet ; |
19 | |
20 | |
21 | /* Enable Master Mode of the TWI */
|
22 | //AT91C_BASE_TWI->TWI_CR = AT91C_TWI_MSEN ;
|
23 | |
24 | /* Set the TWI Master Mode Register */
|
25 | AT91C_BASE_TWI->TWI_MMR = SlaveAddress | AT91C_TWI_MREAD | AT91C_TWI_IADRSZ_2_BYTE; |
26 | //AT91C_BASE_TWI->TWI_MMR = SlaveAddress | AT91C_TWI_MREAD;
|
27 | |
28 | |
29 | /* Set the internal address to access the wanted page */
|
30 | AT91C_BASE_TWI->TWI_IADR = WordAddress ; |
31 | |
32 | /* Send the Start + slave address + Internal Address */
|
33 | AT91C_BASE_TWI->TWI_CR = AT91C_TWI_START | AT91C_TWI_STOP; |
34 | |
35 | |
36 | while(!(*AT91C_AIC_IPR & (1<<AT91C_ID_TWI))){ //TX Complete TWI irq polling |
37 | timeout++; |
38 | if(timeout >= 10000000){ |
39 | // twi_stop();
|
40 | return; //Exit on TXCOMP timeout |
41 | }
|
42 | }
|
43 | twi_nack_wait(); |
44 | |
45 | status = AT91C_BASE_TWI->TWI_SR; |
46 | if(status & AT91C_TWI_NACK){ //Slave exist and send ACK? |
47 | // twi_stop();
|
48 | return; //Exit on NACK -> jedes pkt muss ackd werden |
49 | }
|
50 | |
51 | //.....
|
Bei der letzten Status-Abfrage ist bei mir stets das NACK Bit im Zusammenhang mit dem TXCOMP gesetzt. Zusätzlich sind TXRDY und SVREAD gesetzt - aber nicht RXRDY. Vielleicht hat jmd. von euch einen Rat für mich. Bernd