第3章:链路脉冲与FLP Burst:Base Page格式、时钟恢复、时序与错误检测
速率协商的基础,说白了就是靠一串串脉冲信号来完成握手。这一章我们聚焦在物理层最核心的交互单元——FLP Burst(Fast Link Pulse Burst)。很多新手总以为速率协商就是软件配置,其实硬件上这些脉冲时序一旦对不上,芯片根本不会进入下一阶段。我调试过几块板子,最后查出是FLP Burst的CRC校验给配错了。嗯,一个字节的差错,整条链路就没法建起来。
3.1 从链路脉冲到FLP Burst
先理清两个概念:单次链路脉冲(Link Pulse)是物理层在空闲时定期发送的短脉冲,用来检测链路是否连接。而FLP Burst就是多个这种脉冲组成的一个“帧”。你想想看,单脉冲只告诉你“我在”,而FLP Burst则携带了速率协商的全部信息——Base Page、Next Page等等。
为什么叫Burst?因为它是一连串非常密集的脉冲,比空闲脉冲频率高得多。我见过不少初学者混淆了两种脉冲的周期,导致接收端采样点完全错位。记住:空闲脉冲周期典型值2ms,而FLP Burst内部的脉冲间隔只有大概2ns(取决于速率标准)。
3.2 Base Page格式:一个20位的控制帧
Base Page是FLP Burst里最核心的数据载体,固定20位。它的结构可以分成三段:前导码、数据字段和校验字段。我们把位序讲清楚:
| 位索引 | 字段名 | 长度(位) | 说明 |
|---|---|---|---|
| 0-7 | Preamble | 8 | 固定值0x55,用于接收端时钟同步 |
| 8-15 | Preamble扩展 | 8 | 0xFF,用于帧界定 |
| 16-17 | Start-of-Frame | 2 | 固定“01”,标识数据开始 |
| 18-37 | Data Payload | 20 | 实际协商能力,如速率、流控等 |
| 38-47 | CRC | 10 | 对Data Payload的校验码 |
关键点:Base Page的20个数据位并不是一次发送完,而是分散在FLP Burst的各个脉冲之间。接收端必须依据脉冲位置重组数据,这就是为什么时间精度要求极高。
Data Payload里面包含哪些东西?比如能力选择位(Ability Select)、握手状态位(Acknowledge)、Next Page请求等等。这些位定义在IEEE 802.3 Clause 28中有详细表,我这里就不全搬了。但你要知道,一旦CRC校验没过,整个Base Page将被丢弃,速率协商就得重来。
3.3 时钟恢复:从脉冲中榨出同步时钟
接收端怎么知道每个数据位何时采样?靠的就是从FLP Burst本身恢复时钟。接收器利用Preamble段(0x55)的固定跳变模式,通过锁相环(PLL)或延迟锁定环(DLL)锁定脉冲相位。
我遇到过一个问题:发射端的Preamble波形前后沿有抖动,导致接收端PLL无法锁定。排查之后发现是PCB走线过长,信号反射过大。嗯,当时我手动焊了一根短跳线,立刻就锁上了。所以调试时如果发现时钟一直不稳,先检查信号质量。
个人经验:时钟恢复的容忍度通常只有±100ppm,但实际FLP Burst的脉冲间隔偏差可大可小。我建议你在接收端给PLL一个更大的捕捉范围(比如±300ppm),然后靠后处理过滤掉误锁情况。这样不容易被发射端的低频抖动干扰。
3.4 FLP Burst的发送与接收时序
一张图胜过千言万语,我们先看看整个FLP Burst的交互流程。
发送端流程:先构造Base Page的20位数据,然后计算CRC10附加在后面,再将这些数据按照脉宽调制规则编码到FLP Burst的脉冲间隙中。接收端收到脉冲后,第一个任务就是通过Preamble锁定时钟,接着根据时钟采样出数据位,最后校验CRC。
注意:FLP Burst的发送方和接收方必须使用相同的脉冲宽度和间隙标准。我曾经调试过一个混用10BASE-T和100BASE-TX的设备,因为脉冲宽度差异直接导致了FLP Burst识别失败——发出去的脉冲不符合对方期待的窗口尺寸,接收端根本收不到合法帧。
3.5 错误检测:CRC与异常处理
CRC10是这里的核心校验机制。它覆盖Data Payload的20位,生成多项式固定为 G(x) = x^10 + x^9 + x^5 + x^4 + x + 1。接收端计算本地CRC并与收到的CRC字段比对,不匹配则丢弃整个Base Page。
你可能会问:为什么不用更长的CRC?因为Base Page总共才20位数据,10位CRC已经足够满足误检率需求,且硬件实现简单(用线性移位寄存器LFSR几微秒就出结果)。
除了CRC,还有哪些错误?我列几个常见情况:
- 脉冲序列截断:不完整的FLP Burst,比如只收到前10个脉冲就直接超时,这时接收端应该等待完整帧到来,若超时则重发。
- Preamble内容错误:0x55/0xFF序列出现非期望值,可能是噪声干扰导致。我曾见过一个案例,相邻电源轨的开关噪声正好耦合到Preamble位,把0x55改成了0x51,导致时钟恢复失败。
- 多个FLP Burst冲突:如果两个设备同时开始协商,可能会发生脉冲碰撞。标准规定每个设备在发送前需要监听链路空闲一段时间(称为IPG,Inter-Packet Gap),避免冲突。
避坑指南:我曾经在设计接收状态机时,把“CRC校验失败后立即重发”写成了全局逻辑。结果两端间或因为单次噪声频繁重发,进入死循环。最后我加了重试计数器(最多3次),失败就降级到下一个速率模式——一次解决。你写代码时也要记得给重试限次数。
3.6 相关参数速查表
下面我把关键时序参数整理出来,方便你在调试时对照:
| 参数 | 标准值 | 说明 |
|---|---|---|
| FLP Burst总长度 | 约62个脉冲 | 包含Base Page的所有数据位 |
| 脉冲宽度 | 100ns ± 20% | 具体取决于速率(100BASE-TX为100ns) |
| 脉冲间隔(Tp) | 62.5ns ~ 125ns | 取决于发送时钟,标准规定了上下限 |
| Preamble锁定窗 | 至少4个连续0x55 | 接收端用PLL锁定时需要观测到至少4次跳变 |
| CRC计算时间 | ≤ 2个脉冲间隔 | 硬件LFSR很快,超时可能表示电路异常 |
实际项目中,我建议大家使用示波器抓取FLP Burst波形,对照这个表检查脉冲宽度和间隔是否在规范内。我曾经用100BASE-TX的发送器配了一个62.5ns的脉冲间隔,没做裕量,结果温度一高间隔就漂到130ns,接收端直接丢帧。后来换成75ns的标称值,上下留了20%的余量,再没出过问题。
好了,链路脉冲和FLP Burst这部分内容就到这里。你只要把Base Page格式、时钟恢复手段、收发时序以及错误检测这几块吃透,后面理解速率协商的状态机和Next Page就不会卡住。记住一个原则:所有硬件上的细节,最终都会表现在协议层的状态转换里。