如何清空 CRC 引擎? 似乎每27ms 通过它6个字节的不同数据会产生第一个 CRC、之后的每个相应 CRC 都是一样的...
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
如何清空 CRC 引擎? 似乎每27ms 通过它6个字节的不同数据会产生第一个 CRC、之后的每个相应 CRC 都是一样的...
我看不到您的症状、如所述。 我对 CRC 示例进行了分层操作、通过 CRC 单元运行6个三胞胎数据。 结果是完全不同的(除了引入的一个重复的 I)、并且都与软件计算的 CRC 相匹配。
您可能需要展示您为遇到这种情况所做的工作。
//开始使用 msp430fr235x_crc. 编辑了简洁性。
#include
unsigned int crc_Init = 0xFFFF;
unsigned int i、j;
unsigned Success;
#define CRC_M 6. // 6行
#define CRC_N 3. // 3 cols
//这些来自示例,但分成5组,每组3个。
unsigned int crc_input[crc_m][crc_N]={
0x0fc0、0x1096、0x5042、
0x0010、0x7ff7、0xf86a、
0x7651、0x8b88、
0x0010、0x7ff7、0xf86a、//重复
0x0679、0x0123、0x9599、
0xc58c、0xd1e2、0xe144
};
unsigned int crc_results;
unsigned int sw_results;
unsigned int crc_new;
unsigned sw_res[crc_M]、hw_res[crc_M];
//软件算法函数定义(底部)
unsigned int CCITT_Update (unsigned int、unsigned int);
int main (void)
{
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
无符号掩码= 0x0001;
P1OUT &=~BIT0; //清除 P1.0输出状态
P1DIR |= BIT0; //将 P1.0设置为输出方向
PM5CTL0 &=~LOCKLPM5; //启用 GPIO
for (i=0;i < CRC_M;i++) // 6个测试用例
{
CRCINIRES = CRC_Init; //用0xFFFF 初始化 CRC
对于(j = 0;j < crc_N;+j)
{
CRCDIRB = CRC_INP[i][j]; //在 CRC 中输入数据
__no_operation();
}
CRC_Results = CRCINIRES; //保存结果(按照 CRC-CCITT 标准)
CRC_New = CRC_Init; //将 CRC Init 值放入 CRC_New 中
对于(j = 0;j < crc_N;+j)
{
//软件算法中的输入值(需要8位输入)
//清除高8位以获得低字节
unsigned int LowByte =(CRC_INP[I][j]和0x00FF);
//向右移动8位以获得高位字节
unsigned int UpByte =(crc_input[i][j]>> 8);
//第一个输入低字节
CRC_New = CCITT_Update (CRC_New、LowByte);
//然后输入高字节
CRC_New = CCITT_Update (CRC_New、UpByte);
}
SW_Results = CRC_New;
//比较数据输出结果
if (crc_results=sw_results) //如果数据相等
{
P1OUT |= BIT0; //设置 LED
success |=掩码; //正确}
其他
{
P1OUT &=~BIT0; //如果没有,清除 LED
while (1)/* empty*/; //失败时停止
}
掩码<= 1;
sw_res[i]= sw_results;
HW_res[i]= CRC_Results;
}
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;
}
我会尽最大努力来展示...很多代码,所以我会把它往下看,希望你能看到一些东西。 在短 mssg[8]中……代码发出四个8字节的块……每~27ms 发送一个……我在逻辑分析仪上看到这四个不同的组……我还看到 P5OUT 位1在输入每个 case 语句后大约2us 切换、并在返回高电平之前持续大约7.5us (5.1是 CRC 的入口和出口)...我在逻辑分析仪上看到的第一个 CRC 是唯一的,但是接下来3个独特模式上的接下来三个 CRC 是相同的...第二个 CRC 不同于第一个8的块。 从本质上讲、似乎通过2-4组 CRC 的数据是相同的、但我的逻辑分析仪和调试器(当我适当断开时)显示所有数据包都是唯一的。 现在、我只注意到并且未将手指放在上面的一个警告是、我看到 CRC 模块的入口和出口为5倍
部分定义:
PTX = mssg; PRx =传入; pSysID = systemID; mssg[0]=(permany_Info[0]); mssg[1]=(永久性信息[1]); mssg[2]=(永久性_Info[2]); mssg[3]=(永久性_Info[3]);
代码如下:
if (!swInfo.err &&(swInfo.twoSec & 0x0080)){ 如果(!flag){ P_SEQ = systemIdentification (systemID); Flag = T; } 开关(I){ 情况0: P5OUT ^= BIT0; mssg[4]=(0xC0); mssg[5]=* p_seq; 中断; 案例1: P5OUT ^= BIT0; mssg[4]=(0xA0); mssg[5]=*(p_seq + 1); 中断; 案例2: P5OUT ^= BIT0; mssg[4]=(0x90); mssg[5]=*(p_seq + 2); 中断; 案例3: P5OUT ^= BIT0; mssg[4]=(0x88); mssg[5]=*(p_seq + 3); 中断; 默认值:break; } i++; CRC_RESULT = CRC (PTX); mssg[6]=(char)((crc_result >> 8)& 0xFF); mssg[7]=(char)(crc_result & 0xFF); volumeButtonReleased = 3; } } 如果(!radioBusy){ if ((volumeButtonReleased == 3)){ 如果(I <= 4){ PTX = mssg; UCA1IE |= UCTXIE;//发送消息 _bis_SR_register (LPM3_bits); } 否则{ UCA1IE &=~UCTXIE; I = 0; PTX = mssg; currentSwState = 0; swInfo.anySw = F; swInfo.err = F; swInfo.twoSec = 0; memset (swInfo.hits、0、sizeof (swInfo.hits)); msgPopulated = F; volumeButtonReleased = 0; P2IFG &=~0x06; P1IFG &=~0xFE; } }
以下是 CRC 函数:
unsigned int crc (char *有效载荷){ unsigned int crc_result; unsigned int i、k; const unsigned int CRC_Init = 0xFFFF; P5OUT &=~BIT1; CRCINIRES = CRC_Init; for (i=0;<PAYLOAD_SIZE ;i+=2) { K =(*(有效载荷+ I)<<8)|*(有效载荷+(I+1)); CRCDIRB = k;//将数据输入 CRC __no_operation(); } CRC_RESULT = CRCINIRES; P5OUT |= BIT1; 返回 CRC_RESULT ;}
PTX 不是一个步行指针... VolumeButtonReleased 的断点显示指针与 mssg 对齐,除 CRC 以外的所有数据看起来都很好...不确定它的含义,但它非常清楚地告诉我们,数据包1总是返回一个独特的模式,而数据包2-4总是返回0x0E10 ...这一点都很明显 对于正在使用的静态数据(虽然我倾向于不认为 msg 和指针看起来很好),或者我为函数使用的代码有点糟糕...您能看到任何此函数突出的东西:
有效载荷大小为6 --在 CRC 产生2个字节后,mssg 变为8个字节...类型转换或连接是否有任何问题?
unsigned int crc (char *有效载荷){ unsigned int crc_result; unsigned int i、k; const unsigned int CRC_Init = 0xFFFF; P5OUT &=~BIT1; CRCINIRES = CRC_Init; for (i=0;<PAYLOAD_SIZE ;i+=2) { K =(*(有效载荷+ I)<<8)|*(有效载荷+(I+1)); CRCDIRB = k;//将数据输入 CRC __no_operation(); } CRC_RESULT = CRCINIRES; P5OUT |= BIT1; 返回 CRC_RESULT ;}