I2C: Unterschied zwischen den Versionen

Aus m-wiki
Zur Navigation springen Zur Suche springen
 
Zeile 34: Zeile 34:
Das Memory für die Tastatur wäre ab Speicheradresse 40 einzulesen.
Das Memory für die Tastatur wäre ab Speicheradresse 40 einzulesen.


=== Display Setup Register ===
==== Display Setup Register ====
Bevor die Ansteuerung beginnt, muss man das die Display Setup Register korrekt setzen. Die Register werden jeweils mit folgenden Sequenzen beschrieben (die ersten 4 Bits sind jeweils die Adresse). In der Beschreibung werden jeweils die Datenbits D8-D15 verwendet. Da es sich um einen 2 Byte-Befehl handelt, bleibt das dritte Byte mit den "Nutzdaten" leer. Bei der Angabe von X ist der Wert des Bits irrelevant.
Bevor die Ansteuerung beginnt, muss man das die Display Setup Register korrekt setzen. Die Register werden jeweils mit folgenden Sequenzen beschrieben (die ersten 4 Bits sind jeweils die Adresse). In der Beschreibung werden jeweils die Datenbits D8-D15 verwendet. Da es sich um einen 2 Byte-Befehl handelt, bleibt das dritte Byte mit den "Nutzdaten" leer. Bei der Angabe von X ist der Wert des Bits irrelevant.
   
   

Aktuelle Version vom 17. März 2024, 00:16 Uhr

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 = 0><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. Diese können direkt in einem Transfer erfolgen, da der Controller direkt zur nächste Adresse springt und vom letzten RAM-Platz direkt wieder zum Platz 0.

Das Memory für die Tastatur wäre ab Speicheradresse 40 einzulesen.

Display Setup Register

Bevor die Ansteuerung beginnt, muss man das die Display Setup Register korrekt setzen. Die Register werden jeweils mit folgenden Sequenzen beschrieben (die ersten 4 Bits sind jeweils die Adresse). In der Beschreibung werden jeweils die Datenbits D8-D15 verwendet. Da es sich um einen 2 Byte-Befehl handelt, bleibt das dritte Byte mit den "Nutzdaten" leer. Bei der Angabe von X ist der Wert des Bits irrelevant.

<Geräteadresse><Register/Speicheradresse>

Adresse Bedeutung Bitmuster Bemerkungen
20H Stand-By 0 0 1 0 X X X S Ist S=0 wird der Oszillator abgeschaltet und der Chip geht auf Standby, bis S wieder auf 1 gesetzt wird.
A0H Modus 1 0 1 0 X X act row/int
  • (X, 0) -> Der INT/ROW output pin wird als ROW driver output gesetzt. -> für den LED-Betrieb so setzen
  • (0, 1) -> Der INT/ROW output pin wird als INT output, active low gesetzt. -> für Tastaturen einlesen
  • (1, 1) -> Der INT/ROW output pin wird als INT output, active high gesetzt. -> für Tastaturen einlesen
80H Aktivierung und Blinkfrequenz 1 0 0 0 X B1 B0 D
  • D aktiviert das Display, wenn aktiv (1)
  • B1 und B0 setzen die Blinkfrequenz: (0,0) -> off, (0,1) -> 2Hz, (1,0) -> 1Hz, (1,1) -> 0.5Hz
E0H Dimmung 1 1 1 0 P3 P2 P1 P0 Mit P0-P3 stellt man ein, wie stark eine Zeile (das Display?) leuchten soll. Es ist nicht klar, ob man die Werte pro Zeile mitgibt oder fürs gesamte Display. Das Bitmuster startet bei 0 0 0 0, was 1/16 Leuchtstärke bedeutet und geht bis 1 1 1 1, was konstante Ansteuerung heisst.
60H Key-Scan-Interrupt D7 D6 D5 D4 D3 D2 D1 D0 Interrupt-Register für die Key-Scans. Bei LED nicht gebraucht.