mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT91 TWI NACK wird gesetzt


Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
    /* Configure TWI PIOs */
    AT91F_TWI_CfgPIO ();

    /* Configure PMC by enabling TWI clock */
    AT91F_TWI_CfgPMC ();

    /* Reset the TWI */
    AT91C_BASE_TWI->TWI_CR = AT91C_TWI_SWRST;

    /* Configure TWI in master mode */
    AT91F_TWI_Configure (AT91C_BASE_TWI);

    /* Set TWI Clock Waveform Generator Register */
    AT91F_SetTwiClock();

  //TWI NACK Bug workaround
    AT91F_AIC_ConfigureIt (   AT91C_BASE_AIC,
                              AT91C_ID_TWI,
                              7,
                              AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE,
                              (void (*)(void))dummy_irq);
    *AT91C_TWI_IER = (1<<0);
    *AT91C_TWI_CR = AT91C_TWI_MSEN;

Read-Function:
void AT91F_AT24C_ReadPage (struct at24c *ptAt24c,
                            char *Buffer,
                            unsigned int NumOfBytes,
                            unsigned int PageNumber,
                            unsigned int AddressOffSet)
{
  unsigned int WordAddress;
  unsigned int SlaveAddress;
  unsigned int Count ;
  unsigned int status=0;
  unsigned int timeout = 0;


  /* Addr: 1010 101(R/W) */
  SlaveAddress = (0xAA<<16);

  /* pagenbr = 2, pagesize = 256; offset am anfang 0 */
  WordAddress = (PageNumber*ptAt24c->PageSize) + AddressOffSet ;


   /* Enable Master Mode of the TWI */
   //AT91C_BASE_TWI->TWI_CR = AT91C_TWI_MSEN ;

   /* Set the TWI Master Mode Register */
   AT91C_BASE_TWI->TWI_MMR =  SlaveAddress | AT91C_TWI_MREAD | AT91C_TWI_IADRSZ_2_BYTE;
   //AT91C_BASE_TWI->TWI_MMR =  SlaveAddress | AT91C_TWI_MREAD;


   /* Set the internal address to access the wanted page */
   AT91C_BASE_TWI->TWI_IADR = WordAddress ;

   /* Send the Start + slave address + Internal Address */
   AT91C_BASE_TWI->TWI_CR = AT91C_TWI_START | AT91C_TWI_STOP;


   while(!(*AT91C_AIC_IPR & (1<<AT91C_ID_TWI))){                                 //TX Complete TWI irq polling
    timeout++;
    if(timeout >= 10000000){
//      twi_stop();
      return;                                                     //Exit on TXCOMP timeout
    }
  }
  twi_nack_wait();

  status = AT91C_BASE_TWI->TWI_SR;
  if(status & AT91C_TWI_NACK){                                           //Slave exist and send ACK?
//    twi_stop();
    return;      //Exit on NACK  -> jedes pkt muss ackd werden 
  }

 //..... 


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

Autor: Jens D. (jens) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Du hast das AT91F_TWI_Open(); mit AT91F_SetTwiClock(); vertauscht.
Ich könnte das ganze auch mal zusammen fassen :D.

Des weiteren musst du darauf achten, dass die Interrupte aktiv sind (Im 
CPU Register das I Bit)

Ich weis gerade leider nicht, wie identisch das TWI vom SAM7 zum RM9 
ist.

Jens

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Du hast das AT91F_TWI_Open(); mit AT91F_SetTwiClock(); vertauscht.

wie meinst du das genau? in TWI_Open steht doch alles drinnen u.a. auch 
das setzen der clock?

>Des weiteren musst du darauf achten, dass die Interrupte aktiv sind

die interrupts sind aktiv.... sowohl fürs senden als auch fürs 
empfangne....

>Ich weis gerade leider nicht, wie identisch das TWI vom SAM7 zum RM9
>ist.

soweit ich das überblicke ist da kein großer / wenn überhaupt ein 
unterschied vorhanden. Beim Versuch vom Beschreiben eines Eeproms wird 
auch das Startbyte und die Adresse vom Eeprom geschickt, allerdings 
kommt danach kein ACK vom Eeprom an...


Gruß
Bernd

Autor: Jens D. (jens) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du mal versucht ein "twi scan" laufen zu lassen?

Evtl. kannst du mal ins irc kommen, bin gerade da und hab ein System zum 
Testen ;)

Jens

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hast du mal versucht ein "twi scan" laufen zu lassen?

einen Scan hab ich noch nicht laufen lassen - werd ich morgn mal 
ausprobieren... Die Adresse für den EEPROM AT24HC02B lautet 1010 A2 A1 
A0 R/W, wobei A2 = A0 = 1 und A1 = 0 ist. somit schreibe ich 0x55 ins 
Register rein.

>Evtl. kannst du mal ins irc kommen, bin gerade da und hab ein System zum
>Testen ;)

was ist denn das irc?

Gruß
Bernd

Autor: Jens D. (jens) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
IRC = InternetRelayChat

Click Links mal auf Chat "http://www.mikrocontroller.net/chat/" und such 
in dem Chan nach "Jens"

Gruss Jens

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab dich gestern abend leider nicht mehr erreicht im chat - hab erst 
später nachschauen können...

Den Scan hab ich gerade ausprobiert; mit dem Ergebnis, dass bei vielen 
Werten / Adressen kein NACK ankommt bzw. verlorengeht - und bei 
mehrmaligen Probieren, diese Werte auch etwas variieren.

Die Wartefunktion wird auf jeden Fall durchlaufen und nicht 
weg-optimiert.

Gruß
Bernd

Autor: Jens D. (jens) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es kann sein, dass der AT91RM9260 ein etwas anderes TWI Interface 
besitzt.
Ich bin im Momennt im Chat

Jens

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist mir hier am arbeitsrechner grad nicht möglich, dem Chat 
beizutreten... hab zwar die Sicherheitseinstellungen entsprechend 
angepasst aber funktioniert nicht.

Auf jeden Fall hab ich die Waitfunktion nochmals vergrößert (was die 
Zeit angeht) -> und jetzt bekomm ich bei jeder Adresse ein NACK 
geliefert...


Gruß
Bernd

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was mich etwas stutzig macht, ist die Frequenz für TWI:
#define AT91B_MAIN_OSC         (18432000)                // Exetrnal Main Oscillator MAINCK
#define AT91B_PROCESSOR_CLOCK  ((AT91B_MAIN_OSC/14)*74) // Output PLL Clock (100 MHz)
#define AT91B_MASTER_CLOCK     (AT91B_PROCESSOR_CLOCK) // Output PLL Clock (100 MHz)
#define AT91C_TWI_CLOCK   8000 /* in Hz*/
void AT91F_SetTwiClock(void){
  int sclock;
  /* Here, CKDIV = 1 and CHDIV=CLDIV  ==> CLDIV = CHDIV = 1/4*((Fmclk/FTWI) -6)*/
 
  sclock = (10*AT91B_MASTER_CLOCK /AT91C_TWI_CLOCK);
  if (sclock % 10 >= 5)
    sclock = (sclock /10) - 5;
  else
    sclock = (sclock /10)- 6;
  sclock = (sclock + (4 - sclock %4)) >> 2;  // div 4
  AT91C_BASE_TWI->TWI_CWGR  = ( 1<<16 ) | (sclock << 8) | sclock;
}

Mit 8k Hz sehe ich die richtig-losgesendete Adresse an SDA; wenn ich 
jetzt allerdings 100k Hz verwende, sehe ich lediglich noch das Startbyte 
- die Adresse kann nicht mehr dargestellt werden (obwohl der Slave 
ebenfalls bis 400k Hz gehen kann. Definiere ich den Wert der TWI_Clock 
falsch?

Die  Clock des Prozessors müsste ca. den obigen Werten übereinstimmen, 
da ansonsten auch keine Ausgabe über RS232 möglich wäre.


Gruß
Bernd

Autor: Jens D. (jens) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sollte passen.
Ich habe eben mal das Datenblatt von deinem RM9200 mit dem vom SAM7S 
verglichen.

Das TWI Interface scheint anders zu sein.
Leider habe ich kein Board mit dem RM9200 da, um dies zu testen.

Woher kommst du? Evtl. könnte ich mir das mal anschauen.
Jens

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich arbeite mit dem AT91SAM9260 controller / nicht mit dem RM9200.... 
weiß jetzt nicht genau wie sehr sich da unterschiede auftun im zuge von 
TWI aber ansonsten sind die beiden Controller schon sehr 
unterschiedlich.

Wohnen tue ich in Paderborn.

Gruß
Bernd

Autor: Jens D. (jens) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich meinte die RM9200 er Reihe.
Das TWI Inteface wird zumindest bei der Serie identich sein.

Jens

Autor: Thomas Kusch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jens und Bernd,

ich wollte diese Woche mit der Inbetriebnahme des TWIs bei einem SAM9260 
beginnen und habe bei der Recherche den Wiki-Artikel gefunden. Dort 
heisst es, die Lib wuerde noch nicht laufen. Was ist denn das Problem 
bei dem 9260?

Gruss
Th.Kusch

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.