Forum: Compiler & IDEs Procyon AVR Lib: Bug in I2C mit GCC 4.1.1?


von Hartmut S. (hsemken)


Lesenswert?

Mahlzeit.

Macht doch immer wieder Spass, Bugs zu suchen - und dann auch nicht zu 
finden. ich gebs langsam auf.

Szenario: zwei Mega8 verbunden über TWI/I2C, einer ist Master, einer 
Slave.
Code sind jeweils die Procyon AVR Lib i2c routinen plus eine triviale 
main-Schleife.

Übersetzt wird das ganze mit GCC 4.1.1 aus WINAVR 20070122 (jaa, ich 
weiss, Windoofs ist für Mädchen, aber ich werde seit 15 Jahren nicht 
warm mit GDB :-)

Master Write funktioniert prima, Daten kommen am Slave an und werden 
korrekt ausgegeben (uart oder LCD).
Master Read dagegen geht nicht. Das heisst, es geht ein bischen.
Wenn man nur ein Byte vom Slave liest, die Übertragung sich aslo auf 
SLA+R und ein Byte beschränkt, dann klappts. Auch mit einem testhalber 
eingesetzten PCF8574 genau wie mit dem Mega8.

Versucht man aber, mehr als ein Byte (mit 2, 3, 4 und 5 probiert) zu 
lesen, dann wird nocht SLA+R und das erste Byte korrekt übertragen.
Danach aber ist Ruhe auf der Taktleitung. Es kommen einfach keine Takte 
mehr.
Das TWI auf dem Master shiftet aber dennoch Bits rein, die man dann als 
0xFF lesen kann.

Das Lesen passiert in einer Schleife, die für alle Lesebytes durchlaufen 
wird (d.h. für alle bis auf das letzte, das letzte wird ausserhalb der 
Schleife empfangen mit NACK statt ACK wie in der Schleife).

Wieso sollte also der erste Schleifendurchlauf funktionieren, alle 
weiteren aber nicht?
Mach ich was falsch oder GCC oder die Library?

Als Gegenprobe habe ich mal den TWI-Master-Code aus AVR315 verwendet. 
Und der funktioniert interessanterweise.

Ich habe jetzt den erzeugten Assembler-Code noch nicht so genau 
verglichen - will erstmal dumm in die runde fragen, ob jemand ds Problem 
schon hatte und vielleicht eine Lösung teilen will :-) :-)?

merci
Hartmut "hase" Semken

von Frank J. (frajo)


Lesenswert?

Wenn Du sequentiel lesen willst, mußt Du vom ersten bis vorletzten Byte 
das Bit TWEA im Register TWCR auf 1 setzen damit ACK erkannt wird. Beim 
letzten Byte ist dann TWEA 0 und die Übertragung endet.

von hsemken (Gast)


Lesenswert?

Genau das macht die Schleife in der Procyon lib ja auch: alle bytes bis 
auf das letzte werden mit derselben Funktion gelesen, das letzte dann 
ausserhalb der Schleife, wobei eben nur kein ACK gesendet wird.

Aber wieso funktioniert das nicht mit >1 Byte?

Moment, mir fällt grad auf, dass ja bei Len=1 immer nur mit NACK gelesen 
wird, ist das der Grund? geht das eventuell einfach gar nicht mir ACK?

Danke für die Idee, dsa probiere ich morgen mal durch.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.