【发布时间】:2019-12-26 09:17:50
【问题描述】:
我一直在尝试在我的代码中执行 CRC16 MCRF4XX,但是我成功地只用了 1 个字节就正确地完成了。
我已经按照这个指南,具体方法:http://www.piclist.com/techref/method/error/quickcrc16.htm 我在https://crccalc.com/中测试了相同的字节
代码如下:
register uint32_t i;
uint16_t Crc = 0;
for ( i = 0; i < Len; i++ )
Crc = Utils_CRC16_MCRF4XX(Crc,pData[i]);
return ( Crc );
函数“Utils_CRC16_MCRF4XX”:
uint8_t i;
uint16_t TempByte, CurrentCRC = 0xFFFF;
//make byte 16 bit format
TempByte = (uint16_t)Byte;
for ( i = 0; i < 8; i++ )
{
if ( (CurrentCRC & 0x0001) == (TempByte & 0x0001) )
{
//right shift crc
CurrentCRC >>= 1;
//right shift data
TempByte >>= 1;
}
else
{
CurrentCRC >>= 1;
TempByte >>= 1;
CurrentCRC = CurrentCRC ^ 0x8408; /* 1000 0100 0000 1000 = x^16 + x^12 + x^5 + 1 */
}
}
return ( Crc ^ CurrentCRC);
字节 0x54 的输出将是 0x1B26。 我已经尝试用插入的 Crc 对输出进行异或运算,但加起来不正确。
现在,当我尝试为函数提供超过 1 个字节时,我的问题就开始了。
假设我会发送它:0x54 0xFF。 它会给我一个与计算器给出的完全不同的计算。
我假设我的错误是在对每个字节执行操作之后将字节加在一起。
感谢您的帮助!
【问题讨论】:
-
调用代码在参数中传递 CRC,但函数从不使用它,而是在每次调用时设置 CurrentCRC = 0xffff。
-
我明白你在说什么,但正如我所提到的,我尝试异或返回到 Crc 参数,但最终它返回错误的 CRC 计算 2 个字节。据我了解,我需要为每个字节做初始 FFFF,如果我错了,请纠正我。
-
你错了。 CRC 仅在每个字节块之前初始化一次以计算 CRC。根据算法,在计算时您甚至需要输入 0 字节来代替附加的 CRC 以获得正确的 CRC,并且在检查时您将输入附加的 CRC 并检查生成的 CRC 是否为 0。您可能想阅读@ 987654323@了解更多详情。
-
发布完整的代码——不仅仅是函数体。这将使某人更容易和更有可能构建代码来复制您的问题。无论如何,参数
Crc是当前的CRC -currentCrc没有任何作用。你当然不是第一个这样做的人 - 没有必要自己发明:gist.github.com/aurelj/270bb8af82f65fa645c1, ww1.microchip.com/downloads/en/AppNotes/00752a.pdf -
不要自欺欺人地认为
register做了任何有用的事情。
标签: c embedded crc calculation crc16