Problem mit der I2C-EEPROM-Kommunikation

Ich habe eine STM32L-MCU, die mit M24LR64E, einem I2C-EEPROM, verbunden ist. Früher hatte ich dieses Setup funktioniert, aber dann habe ich einige Dinge geändert (Layout, Firmware) und irgendwie habe ich den I2C geschraubt und es funktioniert jetzt nicht.

Ich verwende es mit dem I2C_DutyCycle_2-Modus bei 100 kHz, 4,7 k Pull-up sowohl auf SDA- als auch auf SCL-Leitungen. Alles auf dem Board arbeitet mit 3,3 V. Unten ist eine Aufnahme beider SCL/SDA-Leitungen auf meinem Oszilloskop, leider habe ich keinen Logikanalysator zum Spielen.

Aufnahme vom Beginn der I2C-Daten

Die meisten I2C-Aufnahmen, die ich bei Google gefunden habe, scheinen mit quadratischen Anstiegs- / Abfallsignalen sehr "schön" zu sein, und meine sieht ganz anders aus.

Irgendwelche Vorschläge? Sieht das angehängte Bild für einen I2C-Bus gut aus?

Vielen Dank.

Sieht so aus, als gäbe es sicherlich ein Problem. Wie lang sind die Busspuren jetzt? Gibt es einen Serienwiderstand oder eine Shunt-Kapazität auf dem Bus? Sind Sie sicher, dass Sie 4,7k-Widerstände verwenden? (Haben Sie sie gemessen?) Bleibt das Problem bestehen, wenn Sie das EEPROM trennen? Können Sie bitte eine vergrößerte (kürzere Zeitskala) Aufnahme von ein paar Taktzyklen posten?
Die Busspuren sind mit einem cm Länge etwas kürzer als vorher. Der Bus beginnt am MCU-Pin, geht zum Pullup-Widerstand und endet am EEPROM-Pin. Widerstände sind 1210 SMD und die Busbreite beträgt 0,2 mm. Ja, ich habe sie außerhalb des Stromkreises gemessen. Ich werde jetzt das Eeprom entlöten und die Signale testen, danke. Ich bekomme auch die gezoomten Aufnahmen. Vielen Dank.
Hier ist eine Aufnahme des Starts, i36.tinypic.com/2hg6cmo.jpg . Genau die gleiche Aufnahme wie auf dem Hauptposten, aber mit kürzerer Zeitskala.
Zwei weitere Aufnahmen mit dem von der Platine abgelöteten EEPROM: i37.tinypic.com/2hycpwg.jpg i36.tinypic.com/ay7pde.jpg
Okay danke. Aus diesen Aufnahmen sieht es so aus, als ob es in jedem Zyklus einen Schurkenfehler gibt, zumindest auf der Taktlinie. Bei einer Buslänge von 1 cm sollte es bei 100 kHz kein Problem geben, es sei denn, es liegt ein wirklicher Fehler vor, und die Anstiegs- / Abfallzeiten sehen in Ordnung aus, daher denke ich, dass die Firmware genau betrachtet werden muss. Können Sie bitte die relevanten Bits posten - den I2C-Setup-Code und die Sende-/Empfangsroutinen? Idealerweise funktioniert der Code davor und danach nicht mehr. Alles andere, von dem Sie glauben, dass es sich lohnt, es hinzuzufügen (z. B. haben Sie die Haupt- / Peripherietaktfrequenz geändert?)
Messen Sie mit der 10x- oder 1x-Sondeneinstellung?
10x auf beiden Kanälen

Antworten (1)

Fest. Dank Oli Glaser habe ich die Uhrkonfigurationsroutine repariert und die Oszilloskopaufnahmen sehen jetzt sehr gut aus, aber das Hauptproblem (MCU liest das EEPROM nicht) blieb bestehen. Nach stundenlangem Debug, Trial/Error, Datenblättern, Erratas, Foren usw. stellte ich fest, dass ich irgendwie die SLAVE DEVICE ADDRESS in meinem Code geändert hatte, sodass das EEPROM nicht antwortete, weil ich es nicht richtig anrief!

Für jeden zukünftigen Leser sollte die 7-Bit-Geräteadresse für dieses Gerät 0x53 oder 1010011b sein (Vergessen Sie nicht die richtige Verschiebung nach links und setzen Sie das Lese-/Schreibbit, um das vollständige Byte zu erhalten).

Vielen Dank für all die Hilfe und wie erwartet habe ich VIEL aus dieser Ausgabe gelernt!