Tweedraadsinterface: adressen, pagina’s, banken en timing
Elke insteekmodule wordt beheerd via dezelfde twee draden — een seriële klok en een seriële datalijn — met het I²C-protocol dat de specificaties de tweedraadsinterface (TWI) noemen. Wat tussen SFP-, QSFP-, XFP- en CMIS-modules verschilt, is hoe de adresruimte daarboven is georganiseerd: afzonderlijke apparaten, gepagineerd geheugen of banken van pagina's. Dit materiaal beschrijft het protocolniveau waarop programmers, hosts en CodingBox vertrouwen.
Fysieke laag
- Twee open-drainlijnen, SCL en SDA, met pull-upweerstanden aan de hostzijde; 3,3 V-logica.
- De module is altijd de slave; de host (of programmer) is de master en genereert de klok.
- Modules kunnen de klok rekken (SCL laag houden) terwijl een microcontroller gegevens ophaalt — de specificaties staan maximaal 500 µs toe.
- Aanwezigheid en selectie zijn afzonderlijke pinnen, geen bus-transacties: MOD_ABS (SFP), ModPrsL en ModSelL (QSFP-klasse en CMIS). ModSelL laat meerdere modules één bus delen; SFP heeft geen selectiepin, dus hosts geven elke cage een eigen bus of een multiplexer.
Adresruimte per specificatie
| Familie | Apparaatadressen (8-bit schrijven / 7-bit) | Organisatie | Paginaselectie |
|---|---|---|---|
| SFP, SFP+, SFP28 (SFF-8472) | A0h / 50h identiteit, A2h / 51h diagnostiek | A0h: 256 platte bytes; A2h: 128 platte bytes + optionele gepagineerde bovenste helft | A2h byte 127, als A0h byte 64 bit 4 is ingesteld |
| XFP (INF-8077i) | A0h | 128 platte bytes + gepagineerde bovenste "tabellen" | byte 127 |
| QSFP+, QSFP28 (SFF-8636) | A0h | 128 platte bytes + gepagineerde bovenste 128 bytes | byte 127 |
| QSFP-DD, OSFP, SFP-DD… (CMIS) | A0h | 128 platte bytes + banken × pagina's van de bovenste 128 bytes | byte 126 bank, byte 127 pagina |
Een SFP heeft dus twee apparaatadressen nodig en geen paginering voor de basis; alles na XFP gebruikt één adres en paginering. Sommige oudere SFP's stellen A0h byte 92 bit 2 ('adreswijziging vereist') in en vereisen een fabrikantsequentie voordat A2h antwoordt.
Transacties
| Bewerking | Reeks | Opmerkingen |
|---|---|---|
| Lezen op willekeurig adres | START · apparaatadres+W · byte-offset · START · apparaatadres+R · gegevens… · STOP | de gebruikelijke leesbewerking; de offset wordt automatisch verhoogd |
| Sequentieel lezen | na de eerste byte de klok blijven genereren | loopt bij 255 → 0 terug binnen de huidige apparaat-/paginaweergave |
| Lezen vanaf huidig adres | START · apparaatadres+R · gegevens | gaat verder vanaf de laatste offset — kwetsbaar als een andere master ingreep |
| Byte schrijven | START · adres+W · offset · gegevens · STOP | wacht daarna op t_WR |
| Pagina schrijven | START · adres+W · offset · gegevens × n · STOP | beperkt door het geheugenapparaat (gewoonlijk 4–16 bytes) en mag de interne paginagrens niet overschrijden |
| ACK-polling | START + adres+W versturen totdat de module ACK geeft | de snelste manier om vast te stellen dat een schrijfcyclus is voltooid |
Het lezen van een bovenste pagina bestaat altijd uit twee transacties: schrijf de paginaselectiebyte (127 en 126 voor CMIS-banken) en lees vervolgens 128–255. De selectie blijft staan tot zij verandert; daarom is een achtergebleven paginaselectie een klassieke oorzaak van lezingen met ‘onjuiste inhoud’.
Snelheid
| Specificatie | Klok |
|---|---|
| SFF-8472 (SFP) | basislijn van 100 kHz; sommige modules verdragen 400 kHz |
| INF-8077i (XFP) | 100 kHz |
| SFF-8636 rev 2.x (QSFP) | tot 400 kHz |
| CMIS / QSFP-DD / OSFP-hardware-specificaties | tot 400 kHz |
Langzamer is altijd toegestaan. Voor schrijfbewerkingen verlagen de meeste programmers de klok ver onder de nominale waarde, tot lage kilohertzwaarden, omdat EEPROM-schrijfcycli en modules die door een microcontroller worden aangestuurd veel gevoeliger zijn voor timing dan leesbewerkingen.
Timing die ertoe doet
| Parameter | Typische limiet | Betekenis |
|---|---|---|
| t_init (SFP) | 300 ms | vanaf inschakelen / opheffen van TX_DISABLE totdat de module volledig operationeel is en de bus antwoordt |
| t_init (QSFP) | 2 s | totdat de initialisatie is voltooid en Data_Not_Ready wordt gewist |
| MgmtInit (CMIS) | ≤ 2 s volgens de hardwarespecificaties | totdat de module MgmtInit verlaat en de identiteit geldig is |
| t_WR | 40 ms | maximale schrijfcyclus voor een byte of sequentiële schrijfbewerking; ACK pollen of wachten |
| t_clock_hold | 500 µs | maximale klokrekking door de module |
| ton_IntL | 200 ms | vanaf vlaggebeurtenis tot IntL wordt geactiveerd |
| Gegevens gereed | byte 110 bit 0 (SFP), byte 2 bit 0 (QSFP) | vertrouw de meetwaarden niet zolang de bit is ingesteld |
Valkuilen en oplossingen
| Symptoom | Protocoloorzaak | Oplossing |
|---|---|---|
| Alle FFh | geen ACK — verkeerd apparaatadres, pagina niet geïmplementeerd, module afwezig | controleer A0h versus A2h, paginabits en plaatsing |
| Onjuiste inhoud | achtergebleven pagina-/bankselectie | schrijf 127 (en 126) vóór elke toegang tot een bovenste pagina |
| Beschadigde bytes | klok te snel, lange leidingen, contentie met een host die DDM pollt | vertraag, gebruik een korte kabel en lees op de werkbank, niet in een actieve switch |
| Schrijven ‘slaagt’, leest oude waarde terug | te snel geschreven, t_WR genegeerd, grens van een paginaschrijfbewerking overschreden | schrijf bytes of kleine blokken met wachttijden; ACK-polling |
| Bus hangt, SCL of SDA blijft laag | onderbroken transactie | geef negen SCL-pulsen, dan STOP; schakel de module uit en weer in |
| Werkt in switch, niet op programmer | module verwacht dat LPMode is opgeheven of een selectiepin | respecteer ModSelL/LPMode; houd rekening met t_init |
De diagnoses op de werkbank hiervoor staan verzameld in EEPROM-lees- en schrijffouten; beschermingsmechanismen boven op de bus (wachtwoorden, hardware-WP, opslagopdrachten) staan in Typen schrijfbeveiliging.
Lezen in een live systeem
Een host pollt DDM elke paar seconden en reageert op vlaggen; een tweede master op dezelfde bus (een programmerclip, een in-bandtool) veroorzaakt botsingen, verkeerd geadresseerde schrijfbewerkingen en in het slechtste geval een module die door een paginaschrijfbewerking op de verkeerde offset onbruikbaar wordt. Lees op locatie als het moet; schrijf op de werkbank.
In CodingBox
CodingBox verwerkt het adresmodel per vormfactor automatisch: A0h/A2h voor SFP, paginering voor QSFP en XFP, bank + pagina voor CMIS. U kunt de bussnelheid en schrijftiming per programmerprofiel instellen; elke schrijfbewerking wordt geverifieerd door terug te lezen (Een module schrijven).