Interfaz de dos hilos: direcciones, páginas, bancos y tiempos
Todo módulo enchufable se gestiona a través de los mismos dos hilos — una línea de reloj serie y una línea de datos serie — mediante el protocolo I²C que las especificaciones llaman interfaz de dos hilos (TWI). Lo que difiere entre los módulos SFP, QSFP, XFP y CMIS es cómo se organiza el espacio de direcciones sobre esta base: dispositivos separados, memoria paginada o bancos de páginas. Este material es la visión a nivel de protocolo en la que se apoyan tanto los programadores como los hosts y CodingBox.
Capa física
- Dos líneas de drenador abierto, SCL y SDA, con resistencias de pull-up en el lado del host; lógica de 3,3 V.
- El módulo siempre es el esclavo; el host (o el programador) es el maestro y genera el reloj.
- Los módulos pueden estirar el reloj (mantener SCL en bajo) mientras un microcontrolador obtiene los datos — las especificaciones permiten hasta 500 µs.
- La presencia y la selección son pines independientes, no transacciones de bus: MOD_ABS (SFP), ModPrsL y ModSelL (clase QSFP y CMIS). ModSelL permite que varios módulos compartan un bus; el SFP no tiene pin de selección, por lo que los hosts dan a cada jaula su propio bus o un multiplexor.
Espacio de direcciones por especificación
| Familia | Direcciones de dispositivo (escritura de 8 bits / 7 bits) | Organización | Selección de página |
|---|---|---|---|
| SFP, SFP+, SFP28 (SFF-8472) | A0h / 50h identidad, A2h / 51h diagnóstico | A0h: 256 bytes planos; A2h: 128 planos + mitad superior paginada opcional | byte 127 de A2h, si el bit 4 del byte 64 de A0h está activado |
| XFP (INF-8077i) | A0h | 128 planos + "tablas" superiores paginadas | byte 127 |
| QSFP+, QSFP28 (SFF-8636) | A0h | 128 planos + 128 superiores paginados | byte 127 |
| QSFP-DD, OSFP, SFP-DD… (CMIS) | A0h | 128 planos + bancos × páginas de 128 superiores | byte 126 banco, byte 127 página |
Por eso un SFP necesita dos direcciones de dispositivo y ninguna paginación para lo básico; todo lo posterior al XFP usa una dirección y paginación. Algunos SFP antiguos activan el bit 2 del byte 92 de A0h ("cambio de dirección requerido") y necesitan una secuencia del fabricante antes de que A2h responda.
Transacciones
| Operación | Secuencia | Notas |
|---|---|---|
| Lectura aleatoria | START · dirección de dispositivo+W · desplazamiento de byte · START · dirección de dispositivo+R · datos… · STOP | la lectura habitual; el desplazamiento se autoincrementa |
| Lectura secuencial | continuar el reloj después del primer byte | da la vuelta en 255 → 0 dentro de la vista actual de dispositivo/página |
| Lectura de dirección actual | START · dirección de dispositivo+R · datos | continúa desde el último desplazamiento — frágil si otro maestro intervino |
| Escritura de byte | START · dirección+W · desplazamiento · dato · STOP | después esperar t_WR |
| Escritura de página | START · dirección+W · desplazamiento · dato × n · STOP | limitada por el dispositivo de memoria (típicamente 4–16 bytes) y no debe cruzar su límite interno de página |
| Sondeo de confirmación | emitir START + dirección+W hasta que el módulo confirme (ACK) | la forma más rápida de saber que un ciclo de escritura terminó |
Leer una página superior siempre son dos transacciones: escribir el byte de selección de página (127, y 126 para los bancos de CMIS), después leer 128–255. La selección persiste hasta que se cambia, por lo que una selección de página obsoleta es una fuente clásica de lecturas con "contenido incorrecto".
Velocidad
| Especificación | Reloj |
|---|---|
| SFF-8472 (SFP) | 100 kHz de referencia; algunos módulos toleran 400 kHz |
| INF-8077i (XFP) | 100 kHz |
| SFF-8636 rev 2.x (QSFP) | hasta 400 kHz |
| Especificaciones de hardware CMIS / QSFP-DD / OSFP | hasta 400 kHz |
Más lento siempre es válido. Para las escrituras, la mayoría de los programadores bajan mucho el reloj nominal — a los pocos kilohercios — porque los ciclos de escritura de la EEPROM y los módulos mediados por microcontrolador son mucho más sensibles a la temporización que las lecturas.
Temporización que importa
| Parámetro | Límite típico | Significado |
|---|---|---|
| t_init (SFP) | 300 ms | desde el encendido / la desactivación de TX_DISABLE hasta que el módulo está totalmente operativo y el bus responde |
| t_init (QSFP) | 2 s | hasta que se completa la inicialización y se borra Data_Not_Ready |
| MgmtInit (CMIS) | ≤ 2 s según las especificaciones de hardware | hasta que el módulo sale de MgmtInit y la identidad es válida |
| t_WR | 40 ms | ciclo de escritura máximo para una escritura de byte o secuencial; sondear ACK o esperar |
| t_clock_hold | 500 µs | estiramiento de reloj máximo por parte del módulo |
| ton_IntL | 200 ms | desde el evento del indicador hasta que se activa IntL |
| Datos listos | byte 110, bit 0 (SFP), byte 2, bit 0 (QSFP) | no confiar en los monitores mientras esté activado |
Fallos habituales y sus soluciones
| Síntoma | Causa en el protocolo | Solución |
|---|---|---|
| Todo FFh | sin ACK — dirección de dispositivo incorrecta, página no implementada, módulo ausente | comprobar A0h frente a A2h, bits de página, asentamiento |
| Contenido incorrecto | selección de página/banco obsoleta | escribir 127 (y 126) antes de cada acceso a página superior |
| Bytes corruptos | reloj demasiado rápido, cables largos, contención con un host que sondea DDM | reducir la velocidad, cable corto, leer en el banco de pruebas y no en un switch en producción |
| La escritura "tiene éxito" pero se lee lo antiguo | se escribió demasiado rápido, se ignoró t_WR, se cruzó un límite de escritura de página | escrituras de byte o fragmentos pequeños con esperas; sondeo de ACK |
| El bus se cuelga, SCL o SDA atascados en bajo | transacción interrumpida | generar nueve pulsos de SCL, después STOP; apagar y encender el módulo |
| Funciona en el switch, muerto en el programador | el módulo espera que se libere LPMode o un pin de selección | respetar ModSelL/LPMode; permitir t_init |
Los diagnósticos de banco para estos casos están recopilados en Errores de lectura y escritura de EEPROM; los esquemas de protección que se apoyan sobre el bus (contraseñas, WP por hardware, comandos de guardado) están en Tipos de protección contra escritura.
Leyendo en un sistema en producción
Un host sondea DDM cada pocos segundos y reacciona a los indicadores; un segundo maestro en el mismo bus (una pinza de programador, una herramienta en banda) provoca colisiones, escrituras mal dirigidas y, en el peor de los casos, un módulo inutilizado por una escritura de página que cae en el desplazamiento equivocado. Lea en el sitio si debe hacerlo; escriba en el banco.
En CodingBox
CodingBox gestiona el modelo de direcciones por factor de forma automáticamente — A0h/A2h para SFP, paginación para QSFP y XFP, banco + página para CMIS —, permite ajustar la velocidad de bus y la temporización de escritura por perfil de programador, y verifica cada escritura leyendo de vuelta (Escribir un módulo).