Vendor-Request E3: I²C-RW

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-ParameterBitsNameInhaltBedingung
wValueL7:0ADRLAdresse oder Adresse Low-Byte
ALEN=2: Zweites Byte, ALEN=3: Erstes Byte
ALEN ≥ 1
wValueH7:0ADRHAdresse High-Byte
ALEN=2: Erstes Byte, ALEN=3: Zweites Byte
ALEN ≥ 2
wIndexL0I2CDungenutztUSB-Transferrichtung (IN/OUT) legt Richtungsbit fest
7:1I2CAI²C-Adressemuss ≠ 0 sein
wIndexH1:0ALENAnzahl Adress-Bytes (oder Daten-Bytes, wer will)
3 = Vertauschung Low- und High-Byte
selten 0, meistens 1 oder 2
2NOSTOPVerhindert die Stoppsequenz am EndeNur für Spezialfälle!
3NOSTARTVerhindert die Startsequenz am Anfang
7:4PLENSeitenlänge für serielle EEPROMs nur beim Schreiben sowie Aktivierung von Verify
WertBedeutung
0automatische Auswahl
  • 8-Byte-Page für serielle EEPROMs (Adresse 1010xxx) mit 1-Byte-Adresse
  • 32-Byte-Page für serielle EEPROMs (Adresse 1010xxx) mit 2-Byte-Adresse
  • Keine Paginierung für alle anderen Fälle
1..9Seitenlänge = 1 shl (PLEN–1) = 2PLEN–1, also 1 .. 256 Byte. Mit der Seitenlänge wird automatisch pro Seite die Adresse wiederholt und Verify ausgeführt.

Beispiele

Paginierung

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.