Двухпроводной интерфейс: адреса, страницы, банки, тайминги
Каждый съёмный модуль управляется по одним и тем же двум проводам — последовательной тактовой линии и линии данных — по протоколу I²C, который спецификации называют двухпроводным интерфейсом (TWI). Различие между SFP, QSFP, XFP и CMIS — в том, как поверх него организовано адресное пространство: отдельные устройства, страничная память или банки страниц. Это взгляд на уровне протокола, на который опираются программаторы, хосты и CodingBox.
Физический уровень
- Две линии с открытым стоком, SCL и SDA, подтянутые на стороне хоста; логика 3,3 В.
- Модуль всегда ведомый; хост (или программатор) — ведущий, он генерирует такты.
- Модуль может растягивать такт (держать SCL низким), пока микроконтроллер достаёт данные — спецификации допускают до 500 мкс.
- Присутствие и выбор — отдельные пины, а не транзакции шины: MOD_ABS (SFP), ModPrsL и ModSelL (класс QSFP и CMIS). ModSelL позволяет нескольким модулям делить одну шину; у SFP пина выбора нет, поэтому хосты дают каждой клетке свою шину или мультиплексор.
Адресное пространство по спецификациям
| Семейство | Адреса устройств (8-бит запись / 7-бит) | Организация | Выбор страницы |
|---|---|---|---|
| SFP, SFP+, SFP28 (SFF-8472) | A0h / 50h идентификация, A2h / 51h диагностика | A0h: 256 плоских байт; A2h: 128 плоских + необязательная страничная верхняя половина | байт 127 A2h, если бит 4 байта 64 A0h установлен |
| XFP (INF-8077i) | A0h | 128 плоских + страничные верхние «таблицы» | байт 127 |
| QSFP+, QSFP28 (SFF-8636) | A0h | 128 плоских + страничные верхние 128 | байт 127 |
| QSFP-DD, OSFP, SFP-DD… (CMIS) | A0h | 128 плоских + банки × страницы верхних 128 | байт 126 банк, байт 127 страница |
Итак, SFP требует двух адресов устройств и без страниц для базовых вещей; всё после XFP использует один адрес и страницы. Некоторые старые SFP выставляют бит 2 байта 92 A0h («нужна смена адреса») и требуют вендорской последовательности, прежде чем A2h ответит.
Транзакции
| Операция | Последовательность | Примечания |
|---|---|---|
| Случайное чтение | START · адрес+W · смещение · START · адрес+R · данные… · STOP | повседневное чтение; смещение автоинкрементируется |
| Последовательное чтение | продолжать тактировать после первого байта | заворачивается 255 → 0 в пределах текущего вида устройства/страницы |
| Чтение по текущему адресу | START · адрес+R · данные | продолжает с последнего смещения — хрупко, если вмешался другой ведущий |
| Запись байта | START · адрес+W · смещение · данные · STOP | затем ждать t_WR |
| Страничная запись | START · адрес+W · смещение · данные × n · STOP | ограничена устройством памяти (обычно 4–16 байт) и не должна пересекать его внутреннюю границу страницы |
| Опрос подтверждения | выдавать START + адрес+W, пока модуль не ответит ACK | самый быстрый способ узнать, что цикл записи завершён |
Чтение верхней страницы — всегда две транзакции: записать байт выбора страницы (127, а для банков CMIS ещё 126), затем читать 128–255. Выбор сохраняется до смены, поэтому залежавшийся выбор страницы — классический источник чтений «чужого содержимого».
Скорость
| Спецификация | Такт |
|---|---|
| SFF-8472 (SFP) | базово 100 кГц; часть модулей терпит 400 кГц |
| INF-8077i (XFP) | 100 кГц |
| SFF-8636 ред. 2.x (QSFP) | до 400 кГц |
| CMIS / аппаратные спецификации QSFP-DD, OSFP | до 400 кГц |
Медленнее — всегда законно. Для записи большинство программаторов опускаются далеко ниже номинала — в единицы килогерц, — потому что циклы записи EEPROM и модули с микроконтроллером-посредником куда чувствительнее к таймингам, чем чтение.
Тайминги, которые важны
| Параметр | Типичный предел | Смысл |
|---|---|---|
| t_init (SFP) | 300 мс | от включения / снятия TX_DISABLE до полной работоспособности модуля и ответа шины |
| t_init (QSFP) | 2 с | до завершения инициализации и сброса Data_Not_Ready |
| MgmtInit (CMIS) | ≤ 2 с по аппаратным спецификациям | до выхода модуля из MgmtInit и валидной идентификации |
| t_WR | 40 мс | максимальный цикл записи байта или последовательной записи; опрашивать ACK или ждать |
| t_clock_hold | 500 мкс | максимальное растяжение такта модулем |
| ton_IntL | 200 мс | от события флага до выставления IntL |
| Готовность данных | байт 110 бит 0 (SFP), байт 2 бит 0 (QSFP) | пока установлен — мониторам не верить |
Грабли и их лечение
| Симптом | Причина на уровне протокола | Лечение |
|---|---|---|
| Сплошные FFh | нет ACK — неверный адрес устройства, страница не реализована, модуль отсутствует | проверить A0h vs A2h, биты страницы, посадку |
| Чужое содержимое | залежавшийся выбор страницы/банка | писать 127 (и 126) перед каждым доступом к верхней странице |
| Искажённые байты | слишком быстрый такт, длинные провода, конфликт с хостом, опрашивающим DDM | замедлить, короткий кабель, читать на столе, а не в живом коммутаторе |
| Запись «прошла», читается старое | писали слишком быстро, проигнорировали t_WR, пересекли границу страничной записи | побайтная запись или мелкие блоки с паузами; опрос ACK |
| Шина висит, SCL или SDA прижаты к нулю | прерванная транзакция | выдать девять импульсов SCL, затем STOP; перезапустить модуль по питанию |
| В коммутаторе работает, на программаторе мёртв | модуль ждёт снятия LPMode или пина выбора | соблюдать ModSelL/LPMode; выждать t_init |
Столовая диагностика этих случаев собрана в Ошибках чтения и записи EEPROM; схемы защиты, работающие поверх шины (пароли, аппаратный WP, команды сохранения), — в Типах защиты от записи.
Чтение в живой системе
Хост опрашивает DDM каждые несколько секунд и реагирует на флаги; второй ведущий на той же шине (клипса программатора, внутриполосная утилита) вызывает коллизии, записи не по адресу и, в худшем случае, убитый модуль из-за страничной записи, попавшей на неверное смещение. Читать на месте — если очень надо; писать — на столе.
В CodingBox
CodingBox обрабатывает адресную модель для каждого форм-фактора автоматически — A0h/A2h для SFP, страницы для QSFP и XFP, банк + страница для CMIS, — позволяет задавать скорость шины и тайминги записи в профиле программатора и проверяет каждую запись обратным чтением (Запись модуля).