Ошибки чтения и записи EEPROM на программаторе
Прежде чем модуль можно диагностировать или закодировать, его надо прочитать — а затем, часто, записать. Оба шага отказывают характерными способами. Здесь каждый отказ сопоставлен с причиной и с настройкой или процедурой, которая его лечит, — от модуля, которого вообще не видно, до записи, которая «проходит» и тихо исчезает.
Модуль не определяется
| Проверка | Почему |
|---|---|
| Посадка и колыбель | модуль должен сесть до упора; используйте адаптер под его форм-фактор — SFP в колыбели QSFP не увидится |
| Время включения | модулям нужно до ~2 с (SFP) или дольше (CMIS) после вставки, прежде чем двухпроводная шина ответит |
| Сигнал присутствия | MOD_ABS / ModPrsL должен сработать; погнутый контакт или модуль без сигнала выглядят отсутствующими |
| Состояние low-power (CMIS) | идентификация читается в LowPwr, но некоторые хосты/программаторы ждут Ready для полного доступа |
| Скорость шины | начинайте со 100 кГц или ниже; часть модулей отвечает NACK на 400 кГц |
| Мёртвый модуль | ни DDM, ни идентификации на любой скорости — подтвердите на второй плате, прежде чем списывать |
Чтение возвращает FFh, 00h или мусор
| Симптом | Причина | Решение |
|---|---|---|
| Сплошные FFh | NACK по I²C — нет устройства по этому адресу или нет такой страницы | проверить адрес (A0h идентификация / A2h диагностика у SFP; один A0h со страницами у QSFP/CMIS) |
| Сплошные 00h | модуль без питания / в сбросе; или действительно чистая EEPROM | проверить питание колыбели, присутствие модуля; чистые модули существуют (некодированный сток) |
| Длина верная, содержимое чужое | читается не та страница | записать байт выбора страницы (127) и перечитать; у CMIS также выбор банка (126) |
| Искажённые / сдвинутые байты | шина слишком быстрая, длинный кабель, конфликт с хостом | опуститься до ≤ 100 кГц; короткие провода; читать на столе, а не в живом коммутаторе |
| A2h не читается, A0h в порядке | модуль без диагностики или защищённый блок диагностики | проверить бит 6 байта 92 A0h (DDM реализован); некоторые защищённые типы отвечают только по A0h |
| Значения меняются между чтениями | живые мониторы — норма; либо данные не готовы | байты DDM и должны меняться; проверяйте бит готовности данных, прежде чем верить снимку |
Запись отказывает сразу
WRITE FAIL, NACK на данных или байт читается обратно неизменным:
| Причина | Как распознать | Что делать |
|---|---|---|
| Нужен пароль (контроллер прошивки) | запись отвергается, пока по адресу пароля не окажется верное значение (SFP A2h 0x7B–0x7E, QSFP 123–126, CMIS 122–125) | ввести пароль модуля в Защищённой памяти и паролях; известные пароли вендоров применяются из базы |
| Аппаратная защита записи | только чтение независимо от пароля, переживает перезагрузки | пин WP должна управлять плата-программатор — софтом не обойти; см. Типы защиты от записи |
| Тайминги | перебои, частично записанные страницы | замедлить частоту (для надёжной записи EEPROM часто нужен ~1 кГц), выдерживать время цикла записи (5–10 мс) между байтами/страницами, добавить паузы между блоками |
| Область только для чтения | конкретные байты никогда не меняются (контрольные суммы, пороги у некоторых, вендорская область) | у EEPROM есть защищённая область по замыслу; пишите только разрешённые поля |
| Неверное состояние | CMIS-модули могут требовать LowPwr или деактивированный data-path перед записью | сначала перевести модуль в нужное состояние |
| Страница не выбрана | верное смещение записано на не той странице | выставить байт 127 (и 126) перед записью и проверить, прочитав байт выбора страницы обратно |
Запись «прошла», но не держится
- Откатывается после перезагрузки — модуль хранит запись во временной памяти и требует команду сохранения вендора; без неё возвращается старый образ. Делается сценарием программирования (защита типа 4).
- Откатывается сразу — микроконтроллер зеркалит EEPROM из своего хранилища и перезаписывает ваши байты; нужен алгоритм производителя (тип 5).
- Часть байтов держится, часть нет — частично защищённая карта; пишите по полям и проверяйте каждое.
Хост отвергает модуль после успешной записи
| Причина | Решение |
|---|---|
| Устарели контрольные суммы — CC_BASE (байт 63), CC_EXT (95), CC_DMI (A2h 95), QSFP 191/223 | пересчитать; CodingBox делает это автоматически при записи (Карта памяти) |
| Идентификация стала противоречивой — например, вендор сменён, а коды соответствия или длина волны подразумевают другое железо | держать идентификацию согласованной с реальной оптикой (Скорость и режимы, Несовпадения физического уровня) |
| Записана раскладка не того типа модуля | XFP записан как SFP или путаница со страницами QSFP — восстановить из резервной копии |
Модуль мёртв после записи
Мусор поверх констант калибровки, порогов или вендорской области (где некоторые контроллеры хранят свою конфигурацию) может убить модуль. Путь восстановления: вернуть резервную копию, снятую CodingBox перед записью, из базы кодов, затем записать только нужные поля.
Золотые правила
- Сначала прочитать и сохранить — каждой записи должно предшествовать полное чтение, попадающее в базу.
- Определить тип защиты до первой попытки записи (Типы защиты от записи).
- Не спешить — частота и паузы между байтами решают большинство «случайных» отказов.
- Писать только то, что нужно — поля, а не целые страницы, если это не восстановление образа.
- Проверять перечитыванием после перезагрузки по питанию.
В CodingBox
CodingBox читает модули с правильным адресом и страничностью для каждого форм-фактора, показывает сырые и декодированные байты в редакторе EEPROM, пересчитывает контрольные суммы при записи, автоматически сохраняет резервную копию и поддерживает ввод пароля и сценарии программирования для защищённых модулей и модулей с командой сохранения (Запись модуля). Если подозревается неисправность платы — см. продуктовое Устранение неполадок.
Механика шины за этими отказами — адреса, выбор страницы, время цикла записи, растяжение такта: Двухпроводной интерфейс.
Почему модуль отвечает именно так — память, эмулируемая MCU, окно загрузки, растяжение такта, защищённые области: Контроллер и прошивка.