STM32 I2C1 Startbit nicht auf SR1-Register gesetzt
Frage
Ich versuche, die STM32 zu reden zu meinem i2c EEprom zu programmieren, aber es scheint, wie jedes Mal wenn ich sage:
I2C_GenerateSTART(I2C1, ENABLE);
while( !(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) ); the code hangs here
ging ich mit dem Debugger durch und ich fand, dass die SR1 0 Flag-Bit (das ist der Anfang ist das Bit erzeugt Flag) nicht gesetzt ist, weshalb der Code hängt. Ich kann im Oszilloskop sehen, dass die Start-Bit erzeugt wurde und das funktioniert manchmal. es bricht in der Regel, wenn ich mehrere schreibt in einer Reihe zu tun versucht. Ich überprüfte die HW ist alles sieht gut aus ich die Frequenz überprüft, dass ich auf dem I2C-Bus leite es 100Khz gut innerhalb der 24lc1025 eeprom.
irgendwelche Ideen,
Dank
Lösung
Da Sie sagen, dass dies in der Regel bricht, wenn Sie in einer Reihe mehrere schreibt tun, möchten Sie vielleicht, um sicherzustellen, dass Sie nicht diese Notiz in der STM32 Datenblatt für das STOP
Bit im I2C_CR1 Steuerregister verstößt:
Hinweis: Wenn die
STOP
,START
oderPEC
Bit gesetzt ist, führen Sie die Software darf keine Schreib Zugang zuI2C_CR1
vor diesem Bit wird durch die Hardware gelöscht. Andernfalls besteht die Gefahr von eine zweiteSTOP
,START
oderPEC
Anfrage zu setzen.
Wenn Sie die STOP
gesetzt Bit Sie brauchen, um sicherzustellen, dass die Hardware es gelöscht hat, bevor Sie das nächste START
Bit schreiben.
Andere Tipps
Überprüfen Sie die Errata für Ihr Gerät (erhalten sie von der ST-Website). Der STM32 hat viele Fehler in der I2C-Implementierung. Die errata gibt Software Abhilfen für sie.
Auch wenn die Treiber-Quelldateien verwenden typischerweise mit STM32-Plattformen zur Verfügung gestellt, vergessen Sie nicht, durch die Header zu lesen! Sie können sehr hilfreich sein, vor allem für Anfänger (wie mich), die nicht sicher sind, wo ich anfangen soll.
In diesem Fall würden Sie suchen stm32f4xx_i2c.c