一、故事前传
我们之前说到Link layer的结构,link layer的作用大致可以包括以下几点:
- Frame flow control
- CRC的生成与检测
- 对数据与控制字符的Scrmable/Descramble
- 8b/10b编解码(已解析,详细见历史文章)
- 将传输层进来的数据转为Frame
二、加扰(Scramble)/解扰(Descramble)
资料在进行8b/10b 编码之前,必须先行资料加扰(Scramble)的处理,目的是為了降低EMI(Electromagnetic Interference,电磁干扰)。
实现方式是由LFSR(Linear Feedback Shift Register)的方式来实践;
基本原理是将资料的8 位元与LFSR 寄存器的16 位元输出做XOR 的处理。
- 规定LFSR的初始值為0xFFFF,
- LFSR必须在SOF标志前就要被初始化,
- 在SOF与EOF之间的资料,包括CRC值都需要加扰。
- 对于控制基元Primitive是不需要加扰的 。
SATA协议中资料处理流程如下 :
- 对于一个资料包,在SOF后的资料就必须计算其CRC值,同时这个资料必须和扰码器的输出进行XOR操作,操作结果送往8B/10B编码器编码;
- 反之,在接收方,资料先通过10B/8B解码,再与扰码器的输出结果进行XOR操作,最后计算资料的CRC值。
三、CRC(Cyclic Redundancy Check)循环冗余校验码
CRC的计算范围包括SOF和EOF之间的所有资料(即不包括控制基元),以Dword(32-bit)为单位,如果资料的内容不是Dword的整数倍,需要在资料包的后面用‘0’来补充。
- 协议规定CRC的初始值為0x52325032,
- SOF和EOF之间的所有资料不能超过2064个Dwords。