主题中讨论的其他器件:MSP430FR2355
大家好、团队、
实际上、我正在尝试了解在 msp430FR2355中实现的 CRC16示例代码、我感到困惑。
在线计算出的 CRC16-CCITT 与从 CRC 模块(CRCDIRB)获得的结果不匹配、例如、我发送字符串"BVK"、使 CRC=27860、但在线 CRC16计算器给出的结果为0xE2E7。
我尝试将"BVK"+ CRC 发送到 CRC 模块(CRCDIRB)以获得0结果、但我得到了其他结果。 如果我使用0xE2E7在线 CRC16计算器进行检查、我将按预期获得0。 无法理解问题发生在哪里。
那么、对于 CRC 模块、如何检查 CRC 正确性? 任何帮助都是非常感谢的。
下面是我已经尝试过的代码 CRC_Str[]="BVK";
#include
unsigned int crc_Init = 0xFFFF;
unsigned int i;
unsigned int crc_Str[]={0x0fc0、0x1096、0x5042、0x0010、// 16个随机16位数
0x7ff7、0xf86a、0xb58e、0x7651、//这些数字可以是
如果需要、可修改0x8b88、0x0679、0x0123、0x9599、//
0xc58c、0xd1e2、0xe144、bbpd691};
unsigned int crc_results;
unsigned int sw_results;
unsigned int crc_new;
//软件算法函数定义
unsigned int CCITT_Update (unsigned int、unsigned int);
int main (空)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
P1OUT &=~BIT0;//清除 P1.0输出状态
P1DIR |= BIT0;//将 P1.0设置为输出方向
PM5CTL0 &=~LOCKLPM5;//禁用 GPIO 上电默认高阻抗模式
//激活先前配置的端口设置
//初始化 CRC
CRCINIRES = CRC_Init;//用0xFFFF 初始化 CRC
for (i=0;i<16;i++)
{
//将随机值输入到 CRC 硬件中
CRCDIRB = CRC_Str[i];//在 CRC 中输入数据
__no_operation();
}
CRC_Results = CRCINIRES;//保存结果(按照 CRC-CCITT 标准)
CRC_New = CRC_Init;//将 CRC Init 值放入 CRC_New 中
对于(I = 0;I < 16;I++)
{
//软件算法中的输入值(需要8位输入)
//清除高8位以获得低字节
unsigned int LowByte =(CRC_Str[i]& 0x00FF);
//向右移动8位以获得高位字节
unsigned int UpByte =(CRC_Str[i]>> 8);
//第一个输入低字节
CRC_New = CCITT_Update (CRC_New、LowByte);
//然后输入高字节
CRC_New = CCITT_Update (CRC_New、UpByte);
}
SW_Results = CRC_New;
//比较数据输出结果
if (crc_results=sw_results)// if data 相等
P1OUT |= BIT0;//设置 LED
其他
P1OUT &=~BIT0;//如果没有、清除 LED
while (1);//无限循环
}
//软件算法- CCITT CRC16代码
unsigned int CCITT_Update (unsigned int init、unsigned int 输入)
{
unsigned int CCITT;
CCITT =(unsigned char)(init >> 8)|(init << 8);
CCITT ^=输入;
CCITT ^=(unsigned char)(CCITT & 0xFF)>> 4;
CCITT ^=(CCITT << 8)<< 4;
CCITT ^=((CCITT & 0xFF)<< 4)<< 1;
返回 CCITT;
}