Guten Morgen!
Hat hier vielleicht schon jemand mal das TWI Interface vom AT91SAM7
programmiert (z.B. in C). Bin grad dabei das ganze zu versuchen, hab
aber jede Menge Probleme. z.B. kann ich einen PIO vom SAM7 aus als
Master ansprechen - klappt aber nur ca. 10-300 mal. Dannach gibts kein
TXRDY mehr. Auch am Oszi sieht man nichts mehr. Wenn man TXRDY
ignoriert und nach einem Timeout TWI neu initialisiert aendert das auch
nichts mehr...
Vielleicht hat ja wer Erfahrung mit dem SAM7 TWI Interface...
Viele Gruesse,
Schmidi
Wenn Du mal Code postet kann man Dir auch besser helfen.
Code-Beispiele für TWI findest Du z. B. auf www.at91.com
Dort
KIT->AT91SAM7S64-IAR
auswählen. Dort gibt es Source-Code für Flash, ADC, Interrupt, PDC und
auch für TWI
> Was hab ich daran falsch gemacht?
Ok, fangen wir mal an:
1. Vernünftige Fehlerbeschreibung.
"Funktioniert nicht" ist nicht sehr aussagekräftig. Ich nehme mal an,
daß Du das ganze mit einem Oszi überprüfst, aber nicht einmal ein
Clock-Signal siehst. Richtig?
2. Start. Dann Stop. Dann Daten lesen?????
Bist Du sicher, daß es das ist was Du willst?
Dann veränderst Du auch noch in der for-Schleife die Schleifenvariable
i. Das willst Du bestimmt nicht. So wie es da steht wird die Schleife
vermutlich nur einmal ausgeführt (Wenn pTWI->TWI_THR 0xFF liefer; wie
ich jetzt einfach mal annehme).
3. Kein Initialisieren des TWI
Ist Dir die Methode
void AT91F_TWI_Open(void)
aus dem Beispiel entgangen? Und warum hast Du nicht die anderen Methoden
verwendet (AT91F_TWI_ReadByte, AT91F_TWI_WriteByte)? Die machen doch
genau das was Du willst
Hallo Dirk.
Mal wieder ein Dankeschön an dich zwecks deines Beitrags.
Dirk Dörr wrote:
> 1. Vernünftige Fehlerbeschreibung.> "Funktioniert nicht" ist nicht sehr aussagekräftig. Ich nehme mal an,> daß Du das ganze mit einem Oszi überprüfst, aber nicht einmal ein> Clock-Signal siehst. Richtig?
Richtig g> 2. Start. Dann Stop. Dann Daten lesen?????>> Bist Du sicher, daß es das ist was Du willst?
Habe auf www.at91.com im Forum nach TWI working gesucht und das, was da
kam schien genau so gemeint zu sein.
> Dann veränderst Du auch noch in der for-Schleife die Schleifenvariable> i. Das willst Du bestimmt nicht. So wie es da steht wird die Schleife> vermutlich nur einmal ausgeführt (Wenn pTWI->TWI_THR 0xFF liefer; wie> ich jetzt einfach mal annehme).>> 3. Kein Initialisieren des TWI>> Ist Dir die Methode>> void AT91F_TWI_Open(void)>> aus dem Beispiel entgangen?
Genau die habe ich jetzt verwendet. Nur meckert jetzt natürlich der
Linker, weil er in keiner Datei die vordefinierten Funktionen
AT91F_TWI_CfgPIO ();
AT91F_TWI_CfgPMC ();
AT91F_TWI_Configure (AT91C_BASE_TWI);
AT91F_SetTwiClock();
findet.
Nun stehe ich wieder da wie der Ochs' vorm Berg.
Habe meinen Quellcode jetzt auch etwas verändert. Wenn dir das hilft,
kann ich ihn gerne wieder posten.
Gruß
der Praktikant
Hi,
sicher hilft der Quellcode. Ich habe aber im Moment nicht viel Zeit.
> AT91F_SetTwiClock();
ist auch in der libtwi.c
Der Rest stammt aus dem Standard-Headerfile lib_AT91SAM7S64.h.
Okay, obiges Problem gelöst.
Nur meckert der Compiler nun an der lib_AT91SAM7S256.h rum.
Die neue fehlermeldung bezüglich des lib_AT91SAM7S256.h ist:
lib_AT91SAM7S256.h(52): error: #77-D: this declaration has no storage
class or type specifier
lib_AT91SAM7S256.h(52): error: #65: expected a ";"
lib_AT91SAM7S256.h(2297): warning: #12-D: parsing restarts here after
previous syntax error
lib_AT91SAM7S256.h(2300): error: #169: expected a declaration
D:\Keil\ARM\RV30\INC\stdio.h(301): error: #20: identifier "size_t" is
undefined
D:\Keil\ARM\RV30\INC\stdio.h(382): error: #20: identifier "size_t" is
undefined
D:\Keil\ARM\RV30\INC\stdio.h(402): error: #20: identifier "size_t" is
undefined
D:\Keil\ARM\RV30\INC\stdio.h(529): error: #20: identifier "size_t" is
undefined
D:\Keil\ARM\RV30\INC\stdio.h(554): error: #20: identifier "size_t" is
undefined
D:\Keil\ARM\RV30\INC\stdio.h(689): error: #20: identifier "size_t" is
undefined
D:\Keil\ARM\RV30\INC\stdio.h(690): error: #20: identifier "size_t" is
undefined
D:\Keil\ARM\RV30\INC\stdio.h(690): error: #20: identifier "size_t" is
undefined
D:\Keil\ARM\RV30\INC\stdio.h(705): error: #20: identifier "size_t" is
undefined
D:\Keil\ARM\RV30\INC\stdio.h(706): error: #20: identifier "size_t" is
undefined
D:\Keil\ARM\RV30\INC\stdio.h(721): error: #20: identifier "size_t" is
undefined
D:\Keil\ARM\RV30\INC\stdio.h(722): error: #20: identifier "size_t" is
undefined
D:\Keil\ARM\RV30\INC\stdio.h(722): error: #20: identifier "size_t" is
undefined
was zum Geier ist denn da schon wieder los?
Gruß
der Praktikant
Vorschlag:
Wenn Du mit dem WinARM gcc arbeitest:
Nimm eines der Beispiele für den Sam7S64. Ändere es so, daß es für
Deinen ARM passt. Dann füge die libtwi.c + h zu Deinem Projekt und
verwende sie.
Schritt für Schritt.
Hallo!
Ist mein Projekt, das Display per I2C (TWI) anzusteuern denn mit einem
AVR (ATmega8 bzw. ATmega128) einfacher zu realiesieren. Bzw. wie würdet
ihr ein Display vorzugsweise ansteuern?!
Und wie sieht es mit der Handhabeung des AD-Wandlers bei AVRs aus?!
Klappt das sowohl bei ARM als auch bei AVR gleich problemlos. Denn mit
meinem AT91SAM7S256 hatte und habe ich sehr große Probleme, das zu
realisieren....
Gruß
der Praktikant
Hallo Philip,
es stimmt zwar, daß ein AVR einfacher anzusteuern ist als z. B. ein SAM7
aber ich fürchte Du wirst auch dann Deine Probleme haben.
Dir fehlt es schlicht an Programmiererfahrung. Vielleicht solltest Du
erst einmal ein gutes C-Buch mit Übungen besorgen und Dir am PC die
Grundlagen erarbeiten bevor Du es weiter mit µCs versuchst.
Wenn Du aber doch noch Dein LCD Problem lösen willst, stell einfach mal
Dein komplettes Projekt als Zip ein.
Gruß
Dirk
Hallo,
ich versuche mich auch gerade am I2C des AT91SAM7X256, aber bisher sehe
ich auf dem Oszi nur den Takt und das Adress-Byte. Nach Fünf weiteren
Clocks stellt der Controller dann den Sendevorgang ein. Momentan
verwende ich die Realisierung aus dem Atmel Softwarepackage 1.5 --> Weiß
jemand, ob die mittlerweile funktioniert? Im ersten Abschnitt dieses
Artikels steht das ja etwas schwammig:
http://www.mikrocontroller.net/articles/AT91-TWI