Wichtige Information zu I2C beim STM32F4xx

I2C beim STM32F4xx: Niemals mit internen Pull-up-Widerständen betreiben

Es hat mich einige Zeit gekostet, ein Problem mit I2C zu lösen! Bei der Erweiterung des I2C-Teils der MCAL-Bibliothek hatte ich die Idee, einen I2C-Adressscanner zu implementieren: Die Funktion heißt uint8_t i2cFindSlaveAddr(i2c, scanAddr);. Was war das Problem?

Ich hatte zwei I2C-Komponenten (1x LC-Display mit dem PCF8574T, I2C-Adresse 0x4E) und eine weitere elektronische Schaltung mit dem PCF8574AN (I2C-Adresse 0x70). i2cFindAddress() wurde die I2C-Adresse des Displays problemlos erkannt und als Ergebnis zurückgegeben. Bei der Schaltung mit dem PCF8574AN wurde die Adresse aber nicht erkannt, obwohl ein Beispielprojekt mit der Adresse 0x70 einwandfrei funktionierte. Hierzu muss gesagt werden, dass die I2C-Peripheriekomponente so konfiguriert war, dass die SDA- und die SCL-Leitung über den MCU-internen Pull-up-Widerstand mit Vcc verbunden waren.

Recherchen im Internet brachten irgendwann sehr versteckt den Hinweis, es doch einmal mit externen Pull-up-Widerständen zu testen. Hierfür müssen die Pins PB8/PB9 (ich habe die Funktion mit I2C1 getestet) dann im Open-Drain-Modus konfiguriert werden. Nach dieser geringfügigen Änderung funktionierte das Programm dann auf Anhieb!

Das Beispielprogramm verwendet die aktuelle Version der MCAL-Bibliothek, die Sie von https://gitlab.com/rjesse/mcal-stm.git herunterladen können. Das Beispiel selber steht derzeit noch im Download-Bereich dieser Webseite für Sie bereit.

Anmerkung:

Wundern Sie sich bitte nicht, wenn das Beispiel den Namen Kap17-I2C-Address-Finder hat! Ich arbeite derzeit an der zweiten Auflage des STM32-Buches, und hier haben sich die Kapitelnummern geringfügig verschoben. In der ersten Auflage des Buches wurde I2C noch in Kapitel 16 behandelt.