4. SFP+硬件接口:金手指定义、I2C管理接口、TX_DISABLE、LOS、MOD_ABS等控制信号
各位好,我是老周。今天咱们聊聊SFP+模块的硬件接口。说实话,这章内容看着琐碎,但恰恰是硬件工程师最容易翻车的地方。我见过不少项目,光路设计得漂漂亮亮,结果因为金手指接触不良或者I2C时序不对,整板子调不通。嗯,咱们从最基础的金手指开始讲起。
4.1 金手指定义:20个引脚,一个都不能少
SFP+模块的金手指,说白了就是20个镀金触点。为什么是20个?这是MSA(多源协议)定死的标准。我个人习惯,拿到一个新模块,第一件事就是拿万用表量一遍金手指的对地阻抗,防止出厂就有短路。
这20个引脚,我按功能分成四类:
- 电源类:VccT、VccR,分别给发射和接收供电。注意,SFP+是3.3V供电,电流大概300mA左右。
- 高速信号类:TD+/-、RD+/-,这是差分对,走10Gbps信号。
- 控制信号类:TX_DISABLE、LOS、MOD_ABS、RS0、RS1等。
- 管理接口类:SCL、SDA,就是I2C总线。
这里有个坑,我提醒一下:VccT和VccR虽然是同一个电压,但建议在PCB上分开走线。为什么?发射电路开关噪声大,容易串到接收端。我在一个10G项目里吃过这个亏,后来加了个磁珠才搞定。
金手指引脚速查表(部分关键引脚)
| 引脚号 | 名称 | 功能 | 方向 |
|---|---|---|---|
| 1 | VeeT | 发射地 | 电源 |
| 2 | TX_FAULT | 发射故障告警 | 输出 |
| 3 | TX_DISABLE | 发射关断 | 输入 |
| 4 | MOD_DEF2 (SDA) | I2C数据线 | 双向 |
| 5 | MOD_DEF1 (SCL) | I2C时钟线 | 输入 |
| 6 | MOD_ABS | 模块在位检测 | 输出 |
| 7 | RS0 | 速率选择0 | 输入 |
| 8 | LOS | 信号丢失告警 | 输出 |
| 9 | RS1 | 速率选择1 | 输入 |
| 10 | VeeR | 接收地 | 电源 |
4.2 I2C管理接口:模块的“大脑”
SFP+模块内部有个EEPROM,通过I2C总线访问。地址是0xA0(写)和0xA1(读)。这里面存了厂商信息、速率能力、告警阈值等。说白了,这就是模块的身份证。
我写了个简单的I2C读取函数,大家参考一下:
// 读取SFP+模块的厂商名称(地址0x00-0x0F)
uint8_t sfp_read_vendor(uint8_t *buf) {
uint8_t addr = 0xA0; // 器件地址
uint8_t reg = 0x00; // 寄存器地址
i2c_start();
i2c_write(addr); // 发送写命令
i2c_write(reg); // 发送寄存器地址
i2c_stop();
i2c_start();
i2c_write(addr | 0x01); // 发送读命令
for(int i=0; i<16; i++) {
buf[i] = i2c_read();
if(i != 15) i2c_ack();
}
i2c_nack();
i2c_stop();
return 0;
}
经验之谈:I2C总线上一定要加4.7kΩ上拉电阻。我曾经图省事用了10kΩ,结果在长走线时信号上升沿变缓,导致通信不稳定。另外,SCL和SDA的走线长度尽量相等,避免时序偏移。
4.3 TX_DISABLE:发射关断,关键时刻能救命
TX_DISABLE引脚,高电平有效。拉高时,模块的激光器停止发光。这个功能在调试时特别有用。你想想看,插上模块后光口直接怼到眼图仪上,万一激光器开着,可能烧毁仪器前端。
我的习惯是:上电默认拉高TX_DISABLE,等系统初始化完成、确认一切正常后,再拉低开启发射。这个顺序千万别搞反。
注意:TX_DISABLE只是关断激光器驱动电流,模块内部的其他电路仍在工作。如果需要彻底断电,得控制VccT的电源开关。
4.4 LOS:信号丢失告警
LOS(Loss of Signal)是模块输出的告警信号。当接收光功率低于阈值时,LOS引脚拉高。这个阈值一般在-30dBm左右,具体看模块规格书。
LOS信号在系统里怎么用?我一般接在FPGA的中断引脚上。一旦LOS变高,FPGA立即停止数据收发,并上报网管。这样做的好处是:避免系统在无光状态下持续发送无效数据,浪费带宽。
这里有个细节:LOS信号是OC(开漏)输出,需要外部上拉。上拉电阻选4.7kΩ到10kΩ都行,但注意上拉电压要和主控芯片的IO电平匹配。
4.5 MOD_ABS:模块在位检测
MOD_ABS引脚,模块内部接地。当模块插入笼子时,这个引脚被拉低。主控芯片检测到低电平,就知道模块插好了。
这个信号简单,但容易出问题。我遇到过一种情况:模块插到位了,但MOD_ABS还是高。查了半天,发现是金手指氧化导致接触不良。后来我们在设计时,在MOD_ABS引脚上加了一个100nF的电容到地,用来滤除抖动,效果不错。
4.6 知识体系总览
下面这张图,是我画的SFP+硬件接口知识结构。你看一眼,心里就有谱了。
4.7 避坑指南:我踩过的几个雷
做硬件这么多年,我在SFP+接口上栽过不少跟头。挑几个典型的说说:
- 金手指氧化:模块插拔几次后,金手指表面氧化,导致接触电阻变大。后来我们要求产线在模块出厂前做镀金厚度检测,厚度必须≥0.5μm。
- I2C地址冲突:一个I2C总线上挂了多个SFP+模块,地址都是0xA0,冲突了。解决办法是加I2C多路复用器,或者每个模块单独拉一组I2C总线。
- TX_DISABLE上电时序:有次模块上电瞬间,TX_DISABLE引脚电平不确定,导致激光器误开启。后来加了10kΩ下拉电阻,确保默认低电平。
- LOS信号抖动:光功率刚好在阈值附近时,LOS信号会频繁跳变。我在FPGA里做了100ms的去抖滤波,问题解决。
最后说一句:SFP+接口设计,说白了就是处理好电源完整性、信号完整性和控制逻辑。你把这三点拿捏住了,模块就能稳定工作。我当年第一次调通SFP+模块时,看到眼图张开的那一刻,心里那个爽啊。
公众号:蓝海资料掘金营,微信deep3321