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项目里吃过这个亏,后来加了个磁珠才搞定。

金手指引脚速查表(部分关键引脚)

引脚号名称功能方向
1VeeT发射地电源
2TX_FAULT发射故障告警输出
3TX_DISABLE发射关断输入
4MOD_DEF2 (SDA)I2C数据线双向
5MOD_DEF1 (SCL)I2C时钟线输入
6MOD_ABS模块在位检测输出
7RS0速率选择0输入
8LOS信号丢失告警输出
9RS1速率选择1输入
10VeeR接收地电源

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+硬件接口知识结构。你看一眼,心里就有谱了。

SFP+硬件接口 金手指定义 20引脚,VccT/VccR 差分对TD+/RD+ I2C管理接口 SCL/SDA,地址0xA0 EEPROM读写 控制信号 TX_DISABLE LOS / MOD_ABS 核心:电源 + 信号 + 管理 + 控制 四类接口协同工作,缺一不可

4.7 避坑指南:我踩过的几个雷

做硬件这么多年,我在SFP+接口上栽过不少跟头。挑几个典型的说说:

  • 金手指氧化:模块插拔几次后,金手指表面氧化,导致接触电阻变大。后来我们要求产线在模块出厂前做镀金厚度检测,厚度必须≥0.5μm。
  • I2C地址冲突:一个I2C总线上挂了多个SFP+模块,地址都是0xA0,冲突了。解决办法是加I2C多路复用器,或者每个模块单独拉一组I2C总线。
  • TX_DISABLE上电时序:有次模块上电瞬间,TX_DISABLE引脚电平不确定,导致激光器误开启。后来加了10kΩ下拉电阻,确保默认低电平。
  • LOS信号抖动:光功率刚好在阈值附近时,LOS信号会频繁跳变。我在FPGA里做了100ms的去抖滤波,问题解决。

最后说一句:SFP+接口设计,说白了就是处理好电源完整性、信号完整性和控制逻辑。你把这三点拿捏住了,模块就能稳定工作。我当年第一次调通SFP+模块时,看到眼图张开的那一刻,心里那个爽啊。


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