第一章:光模块基础认知
大家好,我是老张。在光通信行业摸爬滚打了十几年,从最早的1G模块做到现在的400G、800G,踩过的坑比走过的路还多。今天咱们就来聊聊光模块的那些基础事儿。
说实话,很多人一上来就急着写代码、调寄存器,结果连光模块怎么工作的都没搞明白。我见过太多工程师拿着SFF-8472协议文档,却不知道DDM里的温度值到底准不准。嗯,咱们先把地基打牢。
1.1 光模块分类
光模块的分类方式很多,我习惯从三个维度去看:
- 按封装形式:SFP、SFP+、QSFP、QSFP-DD、OSFP 等
- 按传输速率:1G、10G、25G、100G、400G、800G
- 按传输距离:SR(短距)、LR(长距)、ER(超长距)、ZR(极长距)
举个例子,你手里拿的SFP+模块,封装是SFP+,速率是10G,距离可能是300米(SR)或者10公里(LR)。
关键点:封装决定了你能插到什么设备上,速率决定了你的业务带宽,距离决定了你的组网方案。这三者缺一不可。
1.2 光模块工作原理
光模块说白了就是一个光电转换器。发射端把电信号转成光信号,接收端把光信号转回电信号。听起来简单,但里面的门道可不少。
我画了一张图,帮你理清光模块内部的核心逻辑:
从图上你能看到,光模块内部其实有三个核心部分:发射链路、接收链路和MCU控制单元。MCU负责通过I2C总线与主机通信,同时也负责DDM数据的采集和上报。
我的经验:很多新手以为光模块就是个简单的光电转换器,其实MCU在里面扮演的角色非常关键。我曾经遇到过一个案例,模块的光功率明明正常,但主机读到的DDM值全是0,最后发现是MCU的I2C地址配置错了。这种坑,踩一次就记住了。
1.3 关键光学参数
做光模块固件开发,这几个光学参数你必须烂熟于心:
| 参数名称 | 单位 | 说明 | 典型范围 |
|---|---|---|---|
| 发射光功率 (Tx Power) | dBm | 激光器输出的光信号强度 | -3 ~ +5 dBm (LR模块) |
| 接收光功率 (Rx Power) | dBm | 探测器接收到的光信号强度 | -20 ~ 0 dBm |
| 偏置电流 (Bias Current) | mA | 驱动激光器的电流值 | 10 ~ 80 mA |
| 温度 (Temperature) | °C | 模块内部温度 | -40 ~ 85 °C |
| 电压 (Voltage) | V | 模块供电电压 | 3.13 ~ 3.47 V |
这里我要特别说一下发射光功率和偏置电流的关系。你想想看,激光器老化后,同样的偏置电流产生的光功率会下降。所以固件里通常会做APC(自动功率控制)环路,通过调整偏置电流来维持恒定的光功率。
注意:偏置电流不是越大越好!我曾经见过一个模块,因为APC环路参数没调好,偏置电流一直往上飙,最后激光器直接烧了。嗯,那批模块返修率高达30%,教训深刻。
1.4 DDM/DOM 概念
DDM(Digital Diagnostic Monitoring)和DOM(Digital Optical Monitoring)其实是一回事,都是指光模块的数字诊断监控功能。说白了,就是模块能实时告诉你它的工作状态。
SFF-8472协议里定义了DDM的具体实现方式。模块内部通过ADC采样,把模拟量(光功率、电压、温度、偏置电流)转换成数字量,然后通过I2C总线暴露给主机读取。
我整理了一个DDM数据在内存中的映射关系:
// SFF-8472 DDM 内存映射 (A2h 页)
// 地址 96-97: 温度 (16位有符号数, 256分之一度)
// 地址 98-99: 电压 (16位无符号数, 100微伏)
// 地址 100-101: 偏置电流 (16位无符号数, 2微安)
// 地址 102-103: 发射光功率 (16位无符号数, 0.1微瓦)
// 地址 104-105: 接收光功率 (16位无符号数, 0.1微瓦)
// 读取温度示例
uint16_t raw_temp = i2c_read_word(0xA2, 96);
int16_t temp_c = (int16_t)raw_temp; // 有符号转换
float temperature = temp_c / 256.0f; // 单位: 摄氏度
核心要点:DDM数据是光模块固件开发的基础。你写的每一行代码,最终都要能正确读取和解析这些数据。我建议你在开发初期就搭建好DDM的测试环境,用示波器抓I2C波形,确保数据读写的时序没问题。
说到DDM,还有一个概念叫"告警阈值"。模块内部会预设一组阈值,比如温度超过85°C就报高温告警。这些阈值存储在EEPROM里,主机可以读取也可以修改。
我个人习惯在固件里做两级告警:警告(Warning)和告警(Alarm)。比如温度到80°C先报Warning,到85°C再报Alarm。这样给运维人员留出了处理时间。
避坑指南:我曾经遇到过一个问题,模块上报的温度值总是比实际环境温度高10°C。查了半天,发现是ADC的参考电压不准。后来我在固件里加了一个校准系数,问题就解决了。所以,量产前一定要做DDM校准,别偷懒。
好了,第一章的内容就到这里。光模块的基础认知是后续所有开发工作的前提。你理解了分类、工作原理、关键参数和DDM概念,后面学SFF-8472协议、写固件代码就会轻松很多。
公众号:蓝海资料掘金营,微信deep3321