Für die bastelnden Vereinskollegen habe ich nützliche Informationen zum I2C Bus gesammelt. Meine eigenen Erfahrungen mit meinem I2C-Modul Zoo habe ich in einen zweiten Artikel hier verfrachtet.
Zum Nachlesen:
- Dreiteilige Serie im Elektor-Heft (Teil 2: 2017/7 pp. 38-43; Teil 1: 2017/5 pp. 42-45)
- https://learn.sparkfun.com/tutorials/i2c
- Mikrocontroller.net I2C
- I2C – What’s That?
- Wikibooks Artikel
- Wikipedia article on I2C
- Standards doc – Phillips Semiconductor became NXP a few years back; this is the official standards doc for I2C.
- I2C primer – The official primer on I2C and related technologies.
- Linux tools for I2C – A nice set of tools for working with I2C and related buses in embedded Linux environments, like pcDuino or Raspberry Pi
- Arduino Playground – I2cScanner
Probleme aus der Praxis:
- Manche I2C Devices erfordern 5v, andere laufen an 3.3V (akzeptieren aber auch 5V), andere sind nicht 5V-tolerant. Man lese immer das Datenblatt genau!
- Je nach Pegel ist der Einsatz eines Level Shifters nötig. Verschiedene Lösungen sind möglich (s.unten).
- Fertig aufgebaute Module enthalten häufig schon die benötigten Pullup-Widerstände. Dies kann zu Problemen führen. Manchmal gibt es auftrennbare Lötbrücken zu den Pullups..
- Man behalte die Buskapazität bei langen Leitungen im Auge. Bei Bedarf kontrolliere man die Signalform mit einem Oszilloskop.
- Softwareseitig variiert die Ansteuerung (I2C in Hardware oder in SW realisiert). Dies hat einen Einfluss auf die maximale Busgeschwindigkeit.
- Bei vermuteten logischen Problem hilft ein Bus Pirate oder auf höherer Ebene das geniale, aber wenig bekannte Realterm (Adapter nötig).
Ein schönes Trivial-Problem aus der Praxis: mit einem ESP8266 Board konnte ich ein BlinkM I2C Modul nicht ansprechen. Allerdings fand ein anderer I2C Scanner das Modul…Warum? In seinem Code wurde der SDA/SCL Pin gar nicht explizit gesetzt (Wire-begin()). Laut Doku beim ESP wäre der default SDA = D1 = GPIO5 und SCL = D2 = GPIO4 so anzugeben: Wire.begin(2,1). In meinem Code stand das so, da ich Ports immer explizit festlege (keine Annahmen, sondern die Voraussetzungen immer ausschreiben).
Lösung: es ist ein Dokumentationsfehler der Wire Library für ESP: in der Wire.begin Anweisung muss die GPIO Nummer stehen, also Wire.begin(4,5). Man merkt das daran, dass man mit Wire.begin(2,1) komische Zeichen im Arduino IDE Serial Monitor hat, Java Fehler…
Level Shifting
- Ausführliche Diskussion im Mikrocontroller.net mit vielen IC-Vorschlägen
- Verschiedene Möglichkeiten laut http://playground.arduino.cc/Main/I2CBi-directionalLevelShifter
- Insbesondere diese standard Methode mit einem MOSFET Level Shifter mit einem IRF3711.
- Adafruit 4-channel I2C-safe Bi-directional Logic Level Converter – BSS138
- Adafruit 74AHCT125 – Quad Level-Shifter (3V to 5V) – 74AHCT125 up-shift, unidrectional
- Adafruit TXB0104 Bi-Directional Level Shifter – TXB0104
Update 20170717