编程器读写 EEPROM 时的错误
模块在被诊断或编码之前必须先被读取——之后往往还要被写入。这两步都有各自典型的失败方式。本页把每种失败映射到其成因,以及能解决它的设置或操作步骤,从模块完全不被识别,到写入“成功”却悄悄消失。
模块未被检测到
| 检查项 | 原因 |
|---|---|
| 插接与适配座 | 模块必须完全插入连接器;使用对应封装形式的转接器——把 SFP 插进 QSFP 适配座是不会被看到的 |
| 上电时间 | 模块插入后需要最多约 2 秒(SFP)或更长(CMIS)时间,双线总线才会应答 |
| 模块在位信号 | MOD_ABS / ModPrsL 必须被拉低;引脚弯曲或没有该信号的模块会显示为“不在位” |
| 低功耗状态(CMIS) | LowPwr 状态下身份信息可读,但部分主机/编程器要求 Ready 状态才能完整访问 |
| 总线速度 | 从 100 kHz 或更低开始;部分模块在 400 kHz 下会返回 NACK |
| 模块已损坏 | 任何速度下都没有 DDM、没有身份信息——在第二块板卡上确认后再判定为损坏 |
读出 FFh、00h 或乱码
| 症状 | 原因 | 解决办法 |
|---|---|---|
| 全为 FFh | I²C NACK——该地址上没有设备,或该页不存在 | 检查地址(SFP 上 A0h 身份信息与 A2h 诊断信息;QSFP/CMIS 上单一 A0h 加分页) |
| 全为 00h | 模块未上电 / 处于复位状态;或 EEPROM 确实为空 | 检查适配座供电、模块是否在位;未编码的空白模块确实存在 |
| 长度正确,内容错误 | 读取的页不是预期的页 | 写入页选字节(127)后重新读取;CMIS 上还要检查 bank 选择(126) |
| 字节错乱 / 错位 | 总线过快、线缆过长、与主机争用总线 | 降到 ≤ 100 kHz;使用短线;在工作台上读取,而不是在带电交换机中读取 |
| A2h 读取失败,A0h 正常 | 模块不带诊断功能,或诊断区块受保护 | 检查 A0h 字节 92 第 6 位(是否实现 DDM);部分受写保护的类型只响应 A0h |
| 数值在多次读取间变化 | 实时监测数据——属正常现象;或数据尚未就绪 | DDM 字节本就会变化;在信任某次快照前先检查数据就绪位 |
写入直接失败
WRITE FAIL、数据 NACK,或字节读回后未改变:
| 原因 | 如何识别 | 该怎么做 |
|---|---|---|
| 需要密码(带固件控制器) | 在密码地址(SFP A2h 0x7B–0x7E,QSFP 123–126,CMIS 122–125)写入正确值之前,写操作会被拒绝 | 在保护存储区与密码中输入模块密码;数据库中的已知厂商密码会自动应用 |
| 硬件写保护 | 无论密码如何都是只读,断电重启后依然如此 | WP 引脚必须由编程器板卡驱动——软件本身无法做到;参见写保护类型 |
| 时序问题 | 间歇性失败,部分页写入不完整 | 放慢时钟(通常约 1 kHz 才能可靠写入 EEPROM),遵守字节/页之间的写周期时间(5–10 ms),增加块间延时 |
| 只读区域 | 特定字节永远不变(校验和、部分器件的阈值、厂商区) | EEPROM 按设计存在受保护区域;只写模块允许写入的字段 |
| 状态不对 | CMIS 模块可能要求先进入 LowPwr,或先停用数据通路,才接受写入 | 先把模块切换到所需状态 |
| 页未选中 | 你在错误的页上写了正确的偏移量 | 写入前设置字节 127(及 126),并通过读回页选字节来验证 |
写入“成功”但没有生效
- 断电重启后回滚——模块把写入内容存放在临时存储区,需要厂商的保存命令;没有它,旧镜像会恢复。可通过编程脚本处理(写保护类型 4)。
- 立即回滚——微控制器从自己的存储中镜像 EEPROM 内容,并覆盖你写入的字节;需要使用厂商的算法(类型 5)。
- 部分字节生效,其余不生效——存储器映射部分受保护;应逐字段写入并逐一验证。
写入成功后主机仍拒绝模块
| 原因 | 解决办法 |
|---|---|
| 校验和过期——CC_BASE(字节 63)、CC_EXT(95)、CC_DMI(A2h 95)、QSFP 191/223 | 重新计算;CodingBox 在写入时会自动完成(存储器映射) |
| 身份信息现在自相矛盾——例如厂商变了,但合规代码或波长仍暗示着不同的硬件 | 保持身份信息与实际光学器件一致(速率与模式问题、物理层不匹配) |
| 按错误的模块类型布局写入——把 XFP 当 SFP 写,或 QSFP 页搞混 | 从备份恢复 |
模块写入后损坏
覆盖校准常数、阈值或厂商专用区域(部分控制器在此保存自己的配置)的垃圾数据,会直接把模块变砖。恢复方法:从 CodingBox 在写入前保存到 code database 的备份恢复,然后只写入你真正想改的字段。
黄金法则
- 先读后写——每次写入之前都应该先做一次完整读取并存入数据库。
- 在第一次写入前确定保护类型 (写保护类型)。
- 放慢速度——时钟和字节间时序能解决大多数“随机”失败。
- 只写你想改的内容——除非是恢复镜像,否则只写字段,不要整页覆盖。
- 断电重启后重新读取以验证。
在 CodingBox 中
CodingBox 会按封装形式使用正确的地址和分页方式读取模块,在 EEPROM editor 中显示原始字节和解码结果,写入时自动重新计算校验和,自动保存备份,并支持带密码或保存命令的受保护模块的密码输入和编程脚本(写入模块)。如果怀疑是板卡级故障,参见产品的故障排查。
这些故障背后的总线机制——地址、页选、写周期时间、时钟拉伸: 双线接口。
为什么模块会这样应答——MCU 模拟的存储器、启动窗口、时钟拉伸、受保护区域: 控制器与固件。