Hallo zusammen,
ich habe ein Problem mit dem I2C eines STM32F103 in Verbindung mit einem
EEPROM 24C02. Die I2C-Routinen habe ich nach der Application Note AN2824
implementiert. Das merkwürdige Verhalten zeigt sich während der Laufzeit
der Funktion "I2C_Receivebuffer".
Will ich den EEPROM komplett auslesen mit:
I2C_reset(EEPROM_I2C_DEVICE);// STOP wuerde meist auch reichen
31
returnstatus;
32
}
Leider schlägt die Leseoperation fehl, vermutlich weil der STM32 den
Empfang des zweiten Bytes mit NACK beantwortet. So sieht der Verkehr auf
dem I2C aus:
(Wie man sieht, befinden sich im hinteren Teil des EEPROMs nur
Test-Muster, die einen guten Wiedererkennungswert auf dem Bus haben.)
Andere Daten werden von der Funktion "I2C_Receivebuffer" korrekt
empfangen (und mit einem Ack belegt), z.B. hier die Kommunikation mit
einem TMC222:
1
24640: sC0aFCa
2
24640: sC1aE0aD7a96aD7a96a00aF8aFFnp
3
24641: sC0aFCa
4
24641: sC1aE0aD7a96aD7a96a00aF8aFFnp
der das gleiche Muster aufweist (Gesendet I2C-Adresse + 1 Byte, Anwort
"lange" Bytefolge.
Den Bustakt habe ich testweise schon auf 100 kHz gesenkt; mit dem AVR
läuft aber auch alles bei 250 kHz noch korrekt.
Und jetzt stehe ich da, wie der Ochse vom Berg.
Hat jemand einen Ansatzpunkt?
Viele Grüße
W.T.
Beide Funktionen sind:
Start ->Addr->Byte0 -> Start -> Addr+1 -> Byte1 ....
nur die eine Funktion quittiert Byte1 mit ACK und die andere mit NACK.
Absolut reproduzierbar.
Hallo Walter,
Glückwunsch :) Kannst du bitte noch dein Gesammtprojekt hochladen,
sodass auch andere Nutzer von deinem Erfolg profitieren können? ;-)
Wäre sehr nett. :)
Gruß Julian
Die 7 MSB Bits stellen die Addresse dar und das LSB READ/WRITE,
wenn ich das richtig verstanden habe?!
Auch in der Funktionn Sendbuffer wird nicht mehr geshiftet, bin ich auf
dem falschen Dampfer? :D
Julian S. schrieb:> Hallo, kannst du mir bitte erklären, warum du die EEPROM_I2C_ADDRESSE> nicht um eins nach links shiften musst?
Ganz einfach: Sie ist schon im Define linksbündig. Da man
nicht-linksbündige Version nirgendwo gebrauchen kann, bietet sich das
an. Aber laß uns solche Sachen in Deinem Thread diskutieren - da paßt
das besser hinein. Hier in diesem geht es um die geschlossene
Problemstellung "Kein ACK beim EEPROM lesen".
Wahrscheinlich habe ich es gefunden: Nach der Initialisierung schlägt
das erste Lesem immer fehl, wenn mehr als ein Byte gelesen wird. Der
Grund ist mir noch schleierhaft.
Schlägt das Lesen fehl, wird ein Bus-Reset gemacht (freitakten) und der
I2C neu initialisiert.
Damit ist jedes Lesen vom EEPROM das erste Mal nach der Initialisierung.
Mache ich ein Dummy-Lesen eines einzelnen Bytes vor dem Lesen eines
Blocks funktioniert alles.
Danke für's Lesen!
@Julian: Ich mache das jetzt wieder schön, dann kannst Du gern meine
I2C-Routinen nutzen.
Viele Grüße
W.T.
Ist schon 'ne Zeit her, dass ich das für einem STM32F103 geschrieben
habe. Aber soweit ich mich erinnere, war es mehr ein Abschreiben von den
StdPeriph_Examples. Als EEPROM hatte ich ein 24AA01 eingesetzt. Kannst
ja mal nachschauen, ob diese beiden EEPROM kompatibel sind. In diesem
Fall würde ich mal in den Backups nachschauen.
@Julian: Soo...im Anhang finden sich jetzt die funktionsfähigen EEPROM-
und I2C-Routinen. Ob als hilfreiche Schnipsel oder als warnendes
Beispiel darf sich jeder selbst aussuchen.
@Mehmet: Mich würde es schon interessieren, ob das Fehl-Lesen, das
auftritt, wenn das erste Lesen nach der Initialisierung mehr als ein
Byte ist, "normal" ist. Aber dafür jemanden in altem Quelltext
herumwühlen lassen kann man wohl niemandem zumuten.
Viele Grüße
W.T.