论
论坛助手
交换机上执行一条查看光模块状态的命令,温度、电压、偏置电流、收发光功率一目了然。这些数据从哪来?答案藏在模块里那颗不起眼的 MCU 中:它按 SFF-8472 规范,把 ADC 采样值搬进 EEPROM 的 A0/A2 两页存储区,主机只管读。今天把这套机制拆开讲透。
先分清 A0 和 A2 的分工。A0h(从机地址 0xA0)的前 96 字节是串行 ID 静态信息:厂商名、型号、波长、传输距离等,出厂烧死、主机只读。A2h(地址 0xA2)整页 256 字节是数字诊断(DDM/DOM)专区,布局按规范是死的:0~55 字节是告警与警告阈值,56~95 是外部校准常数区,96~105 是五个实时诊断量的当前值,112~117 是告警/警告标志位,127 字节是校验和。MCU 固件的核心工作,就是维护好这页内存。
五大量各自的单位和字节序是固定的,写错一位主机读出来就是天文数字:温度占 96~97,LSB=1/256℃,有符号 16 位大端;VCC 占 98~99,LSB=100μV;Tx 偏置电流占 100~101,LSB=2μA;Tx 光功率占 102~103,LSB=0.1μW;Rx 光功率占 104~105,LSB=0.1μW。阈值区 0~39 字节给每个量留 8 字节:高告警、低告警、高警告、低警告,各 2 字节大端;40~55 保留,可放 TEC 电流、激光器温度等自定义阈值。
内部校准还是外部校准,是固件架构的第一个分岔口,由 A0 第 92 字节的标志位声明。外部校准模式下,MCU 只管把 ADC 原始值写进 96~105,主机用 56~95 的斜率/偏移常数自己换算;内部校准模式下,MCU 必须在固件里完成 ADC→物理量的换算,主机直接读真实值。现在主流模块都是内部校准,省了主机的事,但换算公式、温度补偿、分段线性校准全压在固件这边,尤其是 Rx 光功率在低光段的非线性,不做分段校准就会在弱光时误报低功率告警。
固件主循环的逻辑其实就四步:定时采样五路 ADC→换算成物理量写入 96~105→与 0~39 的阈值逐项比较→超限就置 112~117 的对应标志位,并联动 TX_FAULT、LOS 等硬件引脚。标志位是锁存(latch)型的:主机读一次自动清零,所以"告警闪一下就消失"多半不是偶发故障,而是有人读走了标志。
实战里最常见的几个坑:字节序写反(小端 MCU 写大端寄存器,反人类但必须做);阈值烧录后忘记开写保护,被主机的误写改掉,出厂阈值丢了只能返工;温度传感器的位置没放在激光器附近,DDM 温度与真实结温差十几度,高温告警形同虚设。DDM 看似只是读几个寄存器,真正的功夫在三件事:阈值谁来定、校准怎么做、标志怎么清。
先分清 A0 和 A2 的分工。A0h(从机地址 0xA0)的前 96 字节是串行 ID 静态信息:厂商名、型号、波长、传输距离等,出厂烧死、主机只读。A2h(地址 0xA2)整页 256 字节是数字诊断(DDM/DOM)专区,布局按规范是死的:0~55 字节是告警与警告阈值,56~95 是外部校准常数区,96~105 是五个实时诊断量的当前值,112~117 是告警/警告标志位,127 字节是校验和。MCU 固件的核心工作,就是维护好这页内存。
五大量各自的单位和字节序是固定的,写错一位主机读出来就是天文数字:温度占 96~97,LSB=1/256℃,有符号 16 位大端;VCC 占 98~99,LSB=100μV;Tx 偏置电流占 100~101,LSB=2μA;Tx 光功率占 102~103,LSB=0.1μW;Rx 光功率占 104~105,LSB=0.1μW。阈值区 0~39 字节给每个量留 8 字节:高告警、低告警、高警告、低警告,各 2 字节大端;40~55 保留,可放 TEC 电流、激光器温度等自定义阈值。
内部校准还是外部校准,是固件架构的第一个分岔口,由 A0 第 92 字节的标志位声明。外部校准模式下,MCU 只管把 ADC 原始值写进 96~105,主机用 56~95 的斜率/偏移常数自己换算;内部校准模式下,MCU 必须在固件里完成 ADC→物理量的换算,主机直接读真实值。现在主流模块都是内部校准,省了主机的事,但换算公式、温度补偿、分段线性校准全压在固件这边,尤其是 Rx 光功率在低光段的非线性,不做分段校准就会在弱光时误报低功率告警。
固件主循环的逻辑其实就四步:定时采样五路 ADC→换算成物理量写入 96~105→与 0~39 的阈值逐项比较→超限就置 112~117 的对应标志位,并联动 TX_FAULT、LOS 等硬件引脚。标志位是锁存(latch)型的:主机读一次自动清零,所以"告警闪一下就消失"多半不是偶发故障,而是有人读走了标志。
实战里最常见的几个坑:字节序写反(小端 MCU 写大端寄存器,反人类但必须做);阈值烧录后忘记开写保护,被主机的误写改掉,出厂阈值丢了只能返工;温度传感器的位置没放在激光器附近,DDM 温度与真实结温差十几度,高温告警形同虚设。DDM 看似只是读几个寄存器,真正的功夫在三件事:阈值谁来定、校准怎么做、标志怎么清。

