4. 光模块通信协议:IEEE 802.3标准族、SFF-8472数字诊断监控接口、CMIS协议

光模块不是个闷头干活的哑巴设备。它得跟交换机、路由器这些主机设备“说话”。怎么说话?靠的就是通信协议。

我个人习惯把光模块的协议分成三个层次来看:物理层怎么连、诊断信息怎么读、高级管理怎么做。正好对应今天要讲的三个核心协议族。

4.1 IEEE 802.3标准族:光模块的“普通话”

IEEE 802.3,说白了就是以太网的标准。光模块作为以太网物理层的一部分,必须遵守这个标准里的各种规定。

你想想看,一个10G的光模块插到10G的端口上,为什么能通?就是因为两边都遵守了802.3ae(10G以太网标准)里定义的速率、编码、电气特性。

802.3标准族里跟光模块直接相关的,主要有这几个:

  • 802.3z:1000BASE-X,千兆以太网的光纤版本。定义了8B/10B编码、1000Mbps速率。
  • 802.3ae:10GBASE-R/W,万兆以太网。定义了64B/66B编码、10.3125Gbps线速率。
  • 802.3ba:40G/100G以太网。引入了多通道(Lane)的概念,比如4×10G或者10×10G。
  • 802.3bs:200G/400G以太网。用上了PAM4调制和更复杂的FEC。

核心要点:IEEE 802.3标准主要规定了光模块的电气接口协议接口。比如XFI、SFI、CAUI这些接口的名字,都是802.3标准里定义的。

我在项目中遇到过一件事:有个客户说他们的光模块在交换机上偶尔丢包。查了半天,发现是模块的TX Disable引脚时序没按802.3标准来。标准里规定这个引脚必须要有去抖滤波,他们直接接了GPIO,结果上电瞬间误触发。嗯,这种坑踩过一次就记住了。

4.2 SFF-8472:数字诊断监控接口

光模块坏了怎么办?总不能拆开用示波器量吧?

SFF-8472就是干这个的。它定义了一套数字诊断监控接口(DDM/DOM),让主机可以通过I2C总线读取光模块的内部状态。

说白了,就是给光模块装了个“黑匣子”。

SFF-8472定义的关键监控参数:

参数 地址偏移 精度 典型范围
温度(Temperature) 0x60-0x61 ±3°C -40 ~ +85°C
供电电压(Vcc) 0x62-0x63 ±3% 3.0 ~ 3.6V
偏置电流(Bias Current) 0x64-0x65 ±10% 0 ~ 100mA
发射光功率(Tx Power) 0x66-0x67 ±3dB -10 ~ +5dBm
接收光功率(Rx Power) 0x68-0x69 ±3dB -30 ~ 0dBm

这些数据怎么读?通过I2C总线,地址0xA0(写)或0xA1(读)。SFF-8472把光模块的EEPROM分成了两个区域:

  • Lower Memory(0x00-0x7F):128字节,包含实时诊断值和告警标志。
  • Upper Memory(0x80-0xFF):128字节,包含校准常数、序列号、厂商信息等。

避坑指南:我曾经遇到过一批模块,读出来的温度值比实际高了20°C。后来发现是校准系数没写对。SFF-8472允许厂商自定义校准算法,但很多小厂直接用了默认值。所以读诊断数据时,一定要先检查校准系数是否有效。

4.3 CMIS协议:光模块的“操作系统”

IEEE 802.3管物理层,SFF-8472管监控。那谁来管光模块的配置、模式切换、固件升级这些高级功能?

CMIS(Common Management Interface Specification)就是干这个的。它由OIF(光互联论坛)制定,现在已经是QSFP-DD、OSFP这些高速光模块的标准管理接口。

我建议你把CMIS理解成光模块的“操作系统”。它定义了一套完整的寄存器地图和状态机,让主机可以:

  • 配置模块的工作模式(比如4×25G还是2×50G)
  • 查询模块的能力(支持哪些速率、哪些FEC类型)
  • 控制模块的功耗状态(低功耗模式、休眠模式)
  • 执行固件升级(通过I2C或SPI)

CMIS的核心概念:

  • Bank机制:因为寄存器地址空间有限(0x00-0xFF),CMIS引入了Bank切换。通过写Bank Select寄存器,可以访问不同的寄存器页。
  • 状态机:模块有多个状态(ModuleState),比如LowPower、PowerUp、Ready、Fault。主机通过写控制寄存器来驱动状态切换。
  • Data Path配置:可以独立配置每个通道的速率、编码、FEC类型。

举个例子:一个QSFP-DD光模块,支持8×25G和4×50G两种模式。通过CMIS,主机可以写寄存器0x10(Data Path Configuration)来切换。写0x01表示8×25G,写0x02表示4×50G。就这么简单。

4.4 三个协议的关系

这三个协议不是互相替代的,而是分层协作的关系。我画了一张图来说明:

光模块通信协议分层架构 IEEE 802.3 标准族 物理层电气接口 · 速率定义 · 编码方式 · FEC类型 负责:信号怎么传、传多快、怎么纠错 SFF-8472 数字诊断监控接口 温度 · 电压 · 偏流 · 发射功率 · 接收功率 · 告警 负责:模块状态怎么读、告警怎么报 CMIS 通用管理接口规范 模式配置 · 通道管理 · 功耗控制 · 固件升级 负责:模块怎么配、怎么管、怎么升级

从这张图可以看得很清楚:

  • 底层是IEEE 802.3,管物理层的事。没有它,光模块连信号都发不出去。
  • 中间层是SFF-8472,管监控的事。没有它,你只能靠猜来判断模块好坏。
  • 顶层是CMIS,管管理的事。没有它,高速模块的复杂配置根本玩不转。

注意:不是所有光模块都支持CMIS。早期的SFP、SFP+模块主要用SFF-8472。QSFP-DD、OSFP这些新模块才强制要求CMIS。选型时一定要确认清楚。

4.5 实际项目中的经验

我记得有一次调试400G光模块,主机一直报模块未就绪。查了三天,最后发现是CMIS状态机没走对。主机在模块还在LowPower状态时就发了配置命令,模块根本不响应。

正确的流程应该是:

  1. 主机上电后,等待模块进入LowPower状态(通过读ModuleState寄存器确认)。
  2. 主机写控制寄存器,让模块进入PowerUp状态。
  3. 模块内部初始化完成后,自动进入Ready状态。
  4. 主机再配置Data Path和通道参数。
  5. 最后使能输出,模块开始正常工作。

这个流程,说白了就是CMIS标准里定义的状态机。不看文档直接上手,很容易踩坑。

我的建议:做光模块软件开发,手边一定要常备三份文档:IEEE 802.3对应章节、SFF-8472最新版、CMIS最新版。遇到问题先查文档,别急着改代码。很多时候,问题出在你没按标准来,而不是标准错了。

好了,关于光模块的通信协议,今天就聊到这儿。这三个协议族,是光模块从“能用”到“好用”的关键。理解了它们,你就能真正听懂光模块在说什么了。


公众号:蓝海资料掘金营,微信deep3321