芯片型号:BCM50220S也可是BCM54220S
适用场景:SFP光接口
遇到的问题:
博通的光口是需要使用RDB扩展寄存器进行设置后才能设置为光口模式,但是默认设置好后的状态看似是固定速率如1000BASE-X或者100BASE-FX,此时他们的并不是强制模式,而是自协商模式依旧发送的是C码流。这会会导致对端为强制1000MFULL的模式的是I码流下,有几率导致接口无法link up,这就会在实际商业的应用场景中会发生不稳定的情况。
千兆光口自协商过程:
1) 两端都设置为自协商模式
双方互相发送/C/码流,如果连续接收到3个相同的/C/码且接收到的码流和本端工作方式相匹配,则返回给对方一个带有Ack应答的/C/码,对端接收到Ack信息后,认为两者可以互通,设置端口为UP状态
2) 一端设置为自协商,一端设置为强制
自协商端发送/C/码流,强制端发送/I/码流,强制端无法给对端提供本端的协商信息,也无法给对端返回Ack应答,故自协商端DOWN。但是强制端本身可以识别/C/码,认为对端是与自己相匹配的端口,所以直接设置本端端口为UP状态
3) 两端均设置为强制模式
双方互相发送/I/码流,一端接收到/I/码流后,认为对端是与自己相匹配的端口,直接设置本端端口为UP状态
如何解决此问题:
通常调试PHY芯片驱动,我们会使用标准控制寄存器Fiber Control register 0x00进行设置自协商关闭,但是此寄存器如果执行了举例1000M FULL关闭自协商=0x140,如果使其马上生效同时我们还会或一个bit_15进行PHY 复位。但是如果这样执行了会导致之前我们切换的RDB MODE_CONTROL Register 0x21 BIT0(1’b1 = Select 1000BASE-X or SGMII registers 0x0 to 0x0F)和BIT_2和BIT_1(2’b01 = RGMII to Fiber)恢复为默认值也就是copper模式。
所以使用此方式是无法设置强制1000M FULL模式。
那么如何解决:
一共需要设置俩步,分别是:
1、将Fiber Control register 0x00 设置为0x140强制1000M FULL 但是不能对其进行bit_15或进行PHY复位。
2、将RDB MISC_1000X_CONTROL_1 Register 0x236设置bit1=0关闭自协商如下图:
这俩步骤执行后就是标准的强制1000M FULL,link 不稳定的问题也会解决。
这是根据官方手册自行摸索的方法,大家如果还有更好的解决方法也可以一起交流。