Hallo,
vielleicht kann mir ja jemand helfen:
Ich benutze einen STM32F415RGT6 und will I2C nutzen. Hier ein
Minimalbeispiel wie ich das Modul aktiviere:
Der Mikrocontroller hängt jedes mal bei der letzten Abfrage. Die
Statusregister des I2C sind nach dem Senden der Adresse wie folgt
gesetzt:
I2C1 -> SR1 = 1024
I2C1 -> SR2 = 3
das bedeutet, dass das Bit für Acknowledge Failure (AF) dauerhaft
gesetzt ist, der Master also nicht erkennt, dass der Slave ein ACK
gesendet hat. Das ganze ist unabhängig vom Slave, vom I2C-Peripheral und
von der Busgeschwindigkeit. Der Slave setzt das ACK jedoch (Siehe Anhang
f415.png)
Lade ich den selben Code (lediglich auf 400 khz, das ist aber
irrelevant) auf ein STM32F407-Disco Board hoch, funktioniert alles
einwandfrei. (Siehe Anhang f407.png)
Was mache ich falsch? Oder ist das Board einfach im Eimer? Alle anderen
Peripherals funktionieren einwandfrei.
Vielen Dank!
Hallo,
nein leider nicht dazu. Vielleicht verbirgt sich das auch hinter einem
anderen Problem, aber ich konnte nichts finden. An welcher Stelle muss
ich ansetzen, wenn ein und das selbe Programm auf zwei (sehr sehr
ähnlichen) MCUs unterschiedliche Resultate liefert? Nur am Code kann es
dann ja nicht liegen, der produziert ja in einem Fall das richtige
Resultat.
Oh ja, gut gesehen, ist aber tatsächlich mit drin, scheint beim
rauskopieren verlorengegangen zu sein, entschuldige bitte, es gibt
nichts nervigeres als Fehler in falsch reinkopiertem Code zu suchen.
Okay, das Problem hat sich gelöst, bzw. eher offenbart. Der Code
funktioniert auf dem STM32F415 dann, wenn ich nicht mit dem Logic
Analyzer den Bus aufzeichne. Auf dem F407 ist es unabhängig davon ob der
Logic Analyzer dranhängt oder nicht.
Warum kann das so sein?
Klingt nicht sehr logisch. Wenn der logic analysiert das Problem sein
soll, müsste er ja stärker als die Treiberstufen sein, um den Pegel
halten zu können. Und warum sollte er das nur beim ack tun und nicht
auch bei den restlichen Daten? Wie groß sind denn deine Pull-Up
Widerstände an den i2c Leitungen?