Der Vendor-Request E3 (EEPROM) hat über den USB-Parameter wIndex eine erhebliche Erweiterung erfahren, damit jedes erdenkliche I²C-Gerät einfach zugreifbar wird.
USB-Parameter | Bits | Name | Inhalt | Bedingung | |||||
---|---|---|---|---|---|---|---|---|---|
wValueL | 7:0 | ADRL | Adresse oder Adresse Low-Byte ALEN=2: Zweites Byte, ALEN=3: Erstes Byte | ALEN ≥ 1 | |||||
wValueH | 7:0 | ADRH | Adresse High-Byte ALEN=2: Erstes Byte, ALEN=3: Zweites Byte | ALEN ≥ 2 | |||||
wIndexL | 0 | I2CD | ungenutzt | USB-Transferrichtung (IN/OUT) legt Richtungsbit fest | |||||
7:1 | I2CA | I²C-Adresse | muss ≠ 0 sein | ||||||
wIndexH | 1:0 | ALEN | Anzahl Adress-Bytes (oder Daten-Bytes, wer will) 3 = Vertauschung Low- und High-Byte | selten 0, meistens 1 oder 2 | |||||
2 | NOSTOP | Verhindert die Stoppsequenz am Ende | Nur für Spezialfälle! | ||||||
3 | NOSTART | Verhindert die Startsequenz am Anfang | |||||||
7:4 | PLEN | Seitenlänge für serielle EEPROMs nur beim Schreiben sowie Aktivierung von Verify
|
wValue=0504h, wIndex=0398h, wLength=0
(ohne Datenphase!)
wValue=04h, wIndex=0198h, wLength=1, Daten[]={05}
wValue=01h, wIndex=0198h, wLength=1; zurück Daten[]={RTHB}
Serielle EEPROMs stellen beim Schreiben eine Sonderrolle dar, weil es bei ihnen nicht möglich ist, größere Datenmengen in einem Rutsch hineinzustecken. (Beim Lesen ist alles OK.) Um dem Anwender nicht die Last aufzubürden, die erforderlichen Portionen selbst zusammenstellen zu müssen, nimmt diese I²C-Universalroutine selbständig das Stückeln vor, als Extrawurst für diese häufige I²C-Peripherie.
Serielle EEPROMs werden wesentlich schneller in „Seiten“ als einzelbyteweise programmiert. (Die einzelbyteweise Programmierung war bisher bei Cypress und CeSys implementiert.) Leider ist die Seitenlänge (= Bytes, die in einem Rutsch gebrannt werden können) von EEPROM-Typ und -Hersteller abhängig. Ein gängiger größter gemeinsamer Teiler ist 8 Bytes für 1-Byte-EEPROMs und 32 Bytes für 2-Byte-EEPROMs. Dieser wird so automatisch anhand der Adress-Byte-Anzahl ausgewählt (mit Paginierung = 0). Mit dem Paginierungs-Parameter hat der Anwender es in der Hand, bei bekanntem Ziel-EEPROM größere Seiten auszuwählen und somit schneller zu brennen. Auf Wunsch kann mit PLEN = 1 auch einzelbyteweise gebrannt werden.
Die zu brennenden Daten können eine beliebige Startadresse und eine beliebige Länge aufweisen; die Firmware „weiß“, dass die Paginierung an Adressgrenzen erfolgt.
Wichtig: USB-bedingt findet immer eine Paginierung aller 64 Bytes (= Größe EP0) auf, beim Schreiben und beim Lesen! Müssen Geräte angesprochen werden, die nicht in dieses Konzept passen (bspw. EEPROMs mit 3-Byte-Adressen), so muss man alles „zu Fuß“ ausführen und die Blöcke stets ≤ 64 Bytes halten.