CodingBox Документация

Двухпроводной интерфейс: адреса, страницы, банки, тайминги

Каждый съёмный модуль управляется по одним и тем же двум проводам — последовательной тактовой линии и линии данных — по протоколу 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)A0h128 плоских + страничные верхние «таблицы»байт 127
QSFP+, QSFP28 (SFF-8636)A0h128 плоских + страничные верхние 128байт 127
QSFP-DD, OSFP, SFP-DD… (CMIS)A0h128 плоских + банки × страницы верхних 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_WR40 мсмаксимальный цикл записи байта или последовательной записи; опрашивать ACK или ждать
t_clock_hold500 мксмаксимальное растяжение такта модулем
ton_IntL200 мсот события флага до выставления 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, — позволяет задавать скорость шины и тайминги записи в профиле программатора и проверяет каждую запись обратным чтением (Запись модуля).