结合例子以更好地理解PEC的计算过程.
首先,我们需要传输一个字节的数据。 其值是0x01, 我们设定PEC的初始值是0x41 即 0100 0001. (注意: LTC6802的PEC的初始值是0x00)。 我们需要确定这个数据传输完了, 其PEC应该为多少(新的PEC值应该是0xC7)。DIN的数值一共8位,从时钟0到时钟7, 分别传输的位是: 0000 0001, 即为我们需要传输的那个数据0x01. 每传输一位DIN, 我们需要计算PEC。 其初始值为0100 0001。
在时钟0, 对应的DIN=0, IN0=DIN XOR PEC[7]= 0 XOR 0 = 0, IN1= PEC[0] XOR IN0 = 1 XOR 0 =1, IN2= PEC[1] XOR IN0 = 0 XOR 0 =0.
在时钟1, 对应的DIN=0, PEC[7]=PEC[6]=1, PEC[6]=PEC[5]=0,……PEC[3]=PEC[2]=0, PEC[2]=IN2=0, PEC[1]=IN1=1, PEC[0]=IN0=0. 然后我们再更新,IN0=DIN XOR PEC[7]= 0 XOR 1 = 1, IN1= PEC[0] XOR IN0 = 0 XOR 1 =1, IN2= PEC[1] XOR IN0 = 1 XOR 1 =0.
在时钟2, 3, 4, 5, 6, 基本上按时钟1的方式, 不断更新。
在时钟7, 对应的DIN=1, PEC[7]=PEC[6]=0, PEC[6]=PEC[5]=1,……PEC[3]=PEC[2]=0, PEC[2]=IN2=0, PEC[1]=IN1=0, PEC[0]=IN0=0. 然后我们再更新,IN0=DIN XOR PEC[7]= 1 XOR 0 = 1, IN1= PEC[0] XOR IN0 = 0 XOR 1 =1, IN2= PEC[1] XOR IN0 = 0 XOR 1 =1.
在时钟8, 我们得到最终的PEC的值: PEC[7]=PEC[6]=1, PEC[6]=PEC[5]=1,……PEC[3]=PEC[2]=0, PEC[2]=IN2=1, PEC[1]=IN1=1, PEC[0]=IN0=1.即0xC7.
如上所述, 每次传输一个字节的数据后, PEC都需要按此方法更新。 对于多字节的数据, PEC也是同样更新的。
另外, 数据手册中还简单说明了其PEC的基本原理, 即多项式 x8 + x2 + x + 1. 涉及到CRC的检验的一些数学理论. 有兴趣的同仁可以参考网络上更多这方面的资料。
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |