I2C

Aus m-wiki
Zur Navigation springen Zur Suche springen

Einführung

Die I2C-Schnittstelle wird in vielen IoT-Geräten verwendet. So auch im Raspi und Arduino. Der Bus muss jeweils mit einem 4.7k Widerstand zur Betriebsspannung abgeschlossen werden. Jeweils SCL (Serial Clock) und SDA (Serial Data) separat. Diese geschieht direkt beim Master. Je nach Gerät hat dieses auch integrierte PullUp-Widerstände in der korrekten Höhe, wie etwa der FPGA Max1000.

Adresse

Da es sich um eine Master-Slave-Schnittstelle handelt, braucht jedes Gerät eine eigene Adresse. Normalerweise besitzt daher der Empfangsbaustein eine Grundadresse, welche dann mit Lötpunkten erhöht werden kann, welche jeweils eine binäre Zahl bedeuten. Die Lötpunkte sind meist mit A0 bis Ax beschriftet. Bei 3 Lötpunkten sind entsprechend 23 = 8 Adressen möglich, wobei A2 dann für die 4 steht. Somit besitzt ein Gerät mit Adresse 70 und geschlossenen Lötpunkten A0 und A2 die Adresse 70 + 1 + 4 = 75. Auf Grund dieses Aufbaus können an einem System mit gleichem Chip nur eine maximale Anzahl angeschlossen werden, da sonst doppelte Adressen resultieren.

HT16K33 (LED-Driver)

Detaillierter Beschrieb des Herstellers: Datei:Ht16K33v110.pdf

Merkmale

Dieser Baustein besitzt folgende Merkmale:

  • Betriebsspannung von 5V.
  • Anschluss über I2C.
  • Reset wenn VDD für min. 20 Milliseunden auf 0V.
  • I2C-Adresse lässt sich über die Lötbrücken A0, A1 und A2 auf die Adressen 0x70 bis 0x77 einstellen.
  • Die Anschlüsse können bei Bedarf durchgeschlauft werden.
  • Der Baustein arbeitet mit 400kHz.
  • Das Modul lässt sich mit einem "S"-Bit-Befehl in den Standby-Betrieb bringen und von dort wieder holen.
  • Es gibt einen 16x8-Bit RAM-Speicher, welcher die Zustände der LEDs speichert und sich entsprechend auslesen lässt
  • Dimmen der LED in 16 Stufen über PWM möglich. Leider geht dies nur jeweils fürs gesamte Board, so dass man es nicht für einzelne LEDs nutzen kann.
  • Blinken der LED wäre in 3 Stufen möglich, doch leider auch nur das gesamte Board. Entsprechend kann man nur Effekte hervorrufen, wenn man einzelne LEDs über den Code blinken lässt, doch hier muss man herausfinden, wie schnell und genau dies funktioniert.
  • Einlesen einer Matrix-Tastatur mit 3x13 Tastenreihen
  • Ein Frame (Ansteuerung aller LED-Reihen) braucht rund 10ms, so dass max. 100Hz möglich sind.

Ansteuerung

Um Werte für die LEDs zu übermitteln, muss folgende Ansteuerung verwendet werden, wobei das Grafik-RAM direkt an der Speicheradresse 0 beginnt: <Geräteadresse><Register/Speicheradresse><LED-Muster> Die Speicherbreite ist jeweils 1 Byte gross. Pro Befehl werden jeweils 8 LEDs angesteuert (Pro Bit wird mitgeteilt, ob das jeweilige LED gesetzt werden soll oder gelöscht). Um alle LEDs zu adressieren, braucht es daher 16 Schreiboperationen.

Das Memory für die Tastatur wäre ab Speicheradresse 40 einzulesen und das Interrupt-Register wäre auf Adresse 60.