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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.