25. Lektion: I2C: Unterschied zwischen den Versionen

Aus Attraktor Wiki

Wechseln zu: Navigation, Suche
(Hardware I2C)
(Hardware I2C)
Zeile 56: Zeile 56:
 
</pre>
 
</pre>
 
Die übrigen Methoden werden in Treibermodulen für I2C Geräte benötigt. Ein solches Modul ist z.B. ssd1306.py, das wir uns gleich noch näher ansehen werden.
 
Die übrigen Methoden werden in Treibermodulen für I2C Geräte benötigt. Ein solches Modul ist z.B. ssd1306.py, das wir uns gleich noch näher ansehen werden.
 +
 +
==== Software I2C====
  
 
=== SSD1306 Display mit I2C benutzen===
 
=== SSD1306 Display mit I2C benutzen===

Version vom 11. Dezember 2023, 15:51 Uhr

Das Protokoll

Das I2C Manual kann von hier heruntergeladen werden.

Der Bus

I2C Bus
Der I2C Bus besteht aus 2 Leitungen, SCL uns SDA. SCL ist die Taktleitung (clock) und SDA die Datenleitung. Die I2C Geräte werden paralell an den Bus angeschlossen. Beide Busleitungen müssen mit einem Widerstand an Vcc gelegt werden. Der maximale Ausgangsstrom eines I2C IC's beträgt mindestens 3 mA. Der maximale Eingangsstrom 10 µA. Die Widerstände Rp müssen so gewählt werden, das der maximale Strom von 3 mA nicht überschritten wird.
Der I2C Bus ist ein Master/Slave System. Der Master bestimmt, was auf dem Bus geschieht. Er gibt den Takt vor und adressiert die Clients. Ein Client kann nur aktiv werden, wenn der Master ihn dazu auffordert. Deshalb haben I2C IC's häufig Interrupt Ausgänge mit denen dem Master mitgeteilt werden kann, dass Daten zum Abholen bereit stehen.

Die Datenübertragung

Die Übertragung erfolgt in Dateneinheiten. Eine Dateneinheit besteht aus 8 Datenbits und einem ACK-Bit. Dabei wird zuerst das MSB (most significant bit) also Bit 7 übertragen.
I2C Telegramm
Die erste Dateneinheit enthält die Zieladresse (7 Bit) und das R/W-Flag. Die weiteren Dateneinheiten enthalten die zu übertragenen Daten. Mit dem ACK-Flag kann der Client die weitere Übertragung verzögern, um genügend Zeit für die Verarbeitung der Daten zu haben.
I2C Übertragung
I2C Taktraten

I2C Objekt erzeugen

Wie alles in Micropython ist auch I2C als Klasse implementiert. Deshalb muß für jeden I2C Bus eine Instanz erzeugt werden.
Micropython kennt 2 Arten von I2C Treibern. Einmal den Hardware I2C Treiber und die Software Implementierung.

Hardware I2C

Der Raspberry Pi Pico W enthält 2 Hardware I2C Einheiten (0 und 1). Die default Einstellungen findet man folgendermassen:

from machine import I2C
print(I2C(0))
print(I2C(1))

I2C(0, freq=399361, scl=5, sda=4, timeout=50000)
I2C(1, freq=399361, scl=7, sda=6, timeout=50000)

Nun soll eine I2C Instanz erzeugt werden. Dabei können die Defaultwerte oder andere zulässige Werte benutzt werden.

from machine import Pin, I2C

i2c = I2C(0)                    # default assignment
i2c = I2C(1, scl=Pin(3), sda=Pin(2), freq=400_000)

Mit dem so erzeugten I2C-Objekt können wir außer einem Busscan noch nicht viel anfangen.

i2c.scan()                      # scan for peripherals, returning a list of 7-bit addresses

i2c.writeto(42, b'123')         # write 3 bytes to peripheral with 7-bit address 42
i2c.readfrom(42, 4)             # read 4 bytes from peripheral with 7-bit address 42

i2c.readfrom_mem(42, 8, 3)      # read 3 bytes from memory of peripheral 42,
                                #   starting at memory-address 8 in the peripheral
i2c.writeto_mem(42, 2, b'\x10') # write 1 byte to memory of peripheral 42
                                #   starting at address 2 in the peripheral

Die übrigen Methoden werden in Treibermodulen für I2C Geräte benötigt. Ein solches Modul ist z.B. ssd1306.py, das wir uns gleich noch näher ansehen werden.

Software I2C

SSD1306 Display mit I2C benutzen


Das SSD1306 IC

SSD1306 Datenblatt