这句的len的值循环一次就减少1,先执行len!=0,再执行腔衫len--。
当len为0时退出循环前圆锋。
for(i=0x80
i!=0
i/=2)
0x80是十慧晌六进制数,也即128
当i!=0时,执行循环体,
然后i=i/2,即i值减半。
unsigned short crc_dsp(unsigned short reg, unsigned char data_crc)//reg为crc寄迅岩存器, data_crc为将要处理的猜键8bit数据流
{
unsigned short msb//crc寄存器将移出的最高1bit
unsigned short data
unsigned short gx = 0x8005, i = 0//i为左移亩兆御次数, gx为生成多项式
data = (unsigned short)data_crc
data = data <<8
reg = reg ^ data
do
{
msb = reg &0x8000
reg = reg <<1
if(msb == 0x8000)
{
reg = reg ^ gx
}
i++
}
while(i <8)
return (reg)
}
long int GenerateChecksumCRC24_D32(unsigned long ulNumValues,unsigned long *pulData){
unsigned long i,ulData,lfsr = 0xFFFFFF
for (i= 0x0i <ulNumValuesi++)
{
ulData = pulData[i]
lfsr = CRC24_D32(lfsr,ulData)
}
return lfsr
}
static unsigned long CRC24_D32(const unsigned long old_CRC, const unsigned long Data)
{
unsigned long D [32]
unsigned long C [24]
unsigned long NewCRC [24]
unsigned long ulCRC24_D32
unsigned long int f, tmp
unsigned long int bit_mask = 0x000001
tmp = 0x000000
// Convert previous CRC value to binary.
bit_mask = 0x000001
for (f = 0f <= 23f++)
{
C[f] = (old_CRC &bit_mask) >>f
bit_mask = bit_mask <<1
}
// Convert data to binary.
bit_mask = 0x000001
for (f = 0f <= 31f++)
{
D[f] = (Data &bit_mask) >>f
bit_mask = bit_mask <<1
}
// Calculate new LFSR value.
NewCRC[0] = D[31] ^ D[30] ^ D[29] ^ D[28] ^ D[27] ^ D[26] ^ D[25] ^
D[24] ^ D[23] ^ D[17] ^ D[16] ^ D[15] ^ D[14] ^ D[13] ^
D[12] ^ D[11] ^ D[10] ^ D[9] ^ D[8] ^ D[7] ^ D[6] ^
D[5] ^ D[4] ^ D[3] ^ D[2] ^ D[1] ^ D[0] ^ C[0] ^ C[1] ^
C[2] ^ C[3] ^ C[4] ^ C[5] ^ C[6] ^ C[7] ^ C[8] ^ C[9] ^
C[15] ^ C[16] ^ C[17] ^ C[18] ^ C[19] ^ C[20] ^ C[21] ^
C[22] ^ C[23]
NewCRC[1] = D[23] ^ D[18] ^ D[0] ^ C[10] ^ C[15]
NewCRC[2] = D[24] ^ D[19] ^ D[1] ^ C[11] ^ C[16]
NewCRC[3] = D[25] ^ D[20] ^ D[2] ^ C[12] ^ C[17]
NewCRC[4] = D[26] ^ D[21] ^ D[3] ^ C[13] ^ C[18]
NewCRC[5] = D[31] ^ D[30] ^ D[29] ^ D[28] ^ D[26] ^ D[25] ^ D[24] ^
D[23] ^ D[22] ^ D[17] ^ D[16] ^ D[15] ^ D[14] ^ D[13] ^
D[12] ^ D[11] ^ D[10] ^ D[9] ^ D[8] ^ D[7] ^ D[6] ^
D[5] ^ D[3] ^ D[2] ^ D[1] ^ D[0] ^ C[0] ^ C[1] ^ C[2] ^
C[3] ^ C[4] ^ C[5] ^ C[6] ^ C[7] ^ C[8] ^ C[9] ^ C[14] ^
C[15] ^ C[16] ^ C[17] ^ C[18] ^ C[20] ^ C[21] ^ C[22] ^
C[23]
LFSR代码示例
+ x5
+x+1的24位CRC。初始值为告枯0xFFFFFF。
AN-1160
Rev. A | Page 7 of 8
NewCRC[6] = D[28] ^ D[18] ^ D[5] ^ D[0] ^ C[10] ^ C[20]
NewCRC[7] = D[29] ^ D[19] ^ D[6] ^ D[1] ^ C[11] ^ C[21]
NewCRC[8] = D[30] ^ D[20] ^ D[7] ^ D[2] ^ C[12] ^ C[22]
NewCRC[9] = D[31] ^ D[21] ^ D[8] ^ D[3] ^ C[0] ^ C[13] ^ C[23]
NewCRC[10] = D[22] ^ D[9] ^ D[4] ^ C[1] ^ C[14]
NewCRC[11] = D[23] ^ D[10] ^ D[5] ^ C[2] ^ C[15]
NewCRC[12] = D[24] ^ D[11] ^ D[6] ^ C[3] ^ C[16]
NewCRC[13] = D[25] ^ D[12] ^ D[7] ^ C[4] ^ C[17]
NewCRC[14] = D[26] ^ D[13] ^ D[8] ^ C[0] ^ C[5] ^ C[18]
NewCRC[15] = D[27] ^ D[14] ^ D[9] ^ C[1] ^ C[6] ^ C[19]
NewCRC[16] = D[28] ^ D[15] ^ D[10] ^ C[2] ^ C[7] ^ C[20]
NewCRC[17] = D[29] ^ D[16] ^ D[11] ^ C[3] ^ C[8] ^ C[21]
NewCRC[18] = D[30] ^ D[17] ^ D[12] ^ C[4] ^ C[9] ^ C[22]
NewCRC[19] = D[31] ^ D[18] ^ D[13] ^ C[5] ^ C[10] ^ C[23]
NewCRC[20] = D[19] ^ D[14] ^ C[6] ^ C[11]
NewCRC[21] = D[20] ^ D[15] ^ C[7] ^ C[12]
NewCRC[22] = D[21] ^ D[16] ^ C[8] ^ C[13]
NewCRC[23] = D[31] ^ D[30] ^ D[29] ^ D[28] ^ D[27] ^ D[26] ^ D[25] ^
D[24] ^ D[23] ^ D[22] ^ D[16] ^ D[15] ^ D[14] ^ D[13] ^
D[12] ^ D[11] ^ D[10] ^ D[9] ^ D[8] ^ D[7] ^ D[6] ^
D[5] ^ D[4] ^ D[3] ^ D[2] ^ D[1] ^ D[0] ^ C[0] ^ C[1] ^
C[2] ^ C[3] ^ C[4] ^ C[5] ^ C[6] ^ C[7] ^ C[8] ^ C[14] ^
C[15] ^ C[16] ^ C[17] ^ C[18] ^ C[19] ^ C[20] ^ C[21] ^
C[22] ^ C[23]
ulCRC24_D32 = 0
// LFSR value from binary to hex.
bit_mask = 0x000001
for (f = 0f <= 23f++)
{
ulCRC24_D32 = ulCRC24_D32 + NewCRC[f] * bit_mask
bit_mask = bit_mask <<1
}
return(ulCRC24_D32 &0x00FFFFFF)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)