初级会员

- 积分
- 86
- 金钱
- 86
- 注册时间
- 2017-4-15
- 在线时间
- 12 小时
|
1金钱
自己配置硬件CRC 使用校验和计算。多项式位CCITT-16的 0x1201。无反转,正常顺序读写。代码如下:
void CDB_CRCInit(GM_UINT32 POLInitData)
{
RCC->AHB1ENR |= 1 << 12; //使能CRC时钟
CRC->INIT |= 0x00000000U; //初始值为0
CRC->POL |= POLInitData; //多项式值
CRC->CR |= 0x0 << 7;
CRC->CR |= 0x0 << 5; //输入输出不反转
CRC->CR |= 0x1 << 3; //16位多项式
CRC->CR |= 0x1 << 0; //重置CR
}
GM_UINT16 crc16_8(GM_UINT8 *pBuffer, GM_UINT32 BufferLength)
{
/*按8bit运算*/
#if 1
GM_UINT8 i = 0;
CDB_CRCResetCR(); //复位CRC
CDB_CRCResetDR(); //复位数据寄存器
for(i = 0; i < (BufferLength/4); i++)
{
CRC->DR = (GM_UINT32)(((GM_UINT32)(pBuffer[4*i])<<24) | ((GM_UINT32)(pBuffer[4*i+1])<<16) | ((GM_UINT32)(pBuffer[4*i+2])<<8) | (GM_UINT32)(pBuffer[4*i+3]));
}
if((BufferLength%4) != 0)
{
if(BufferLength%4 == 1)
{
*(volatile GM_UINT8 *) (&CRC->DR) = pBuffer[4*i];
}
if(BufferLength%4 == 2)
{
*(volatile GM_UINT16 *) (&CRC->DR) = (GM_UINT16)((GM_UINT16)((GM_UINT16)(pBuffer[4*i])<<8) | (GM_UINT16)(pBuffer[4*i+1]));
}
if(BufferLength%4 == 3)
{
*(volatile GM_UINT16 *) (&CRC->DR) = (GM_UINT16)((GM_UINT16)((GM_UINT16)(pBuffer[4*i])<<8) | (GM_UINT16)(pBuffer[4*i+1]));
*(volatile GM_UINT8 *) (&CRC->DR) = pBuffer[4*i+2];
}
}
printf("hardware crc_8bit = %x \n",CRC->DR);
return CRC->DR;
#endif
}
但是和自己软件计算的校验值完全不相同啊。。。
输入值:52 4F 01 ,正确值应该为:7D3D 、结果完全不同!!!望大神指导一下!麻烦了!!邮箱:wl237810399@foxmail.com 谢谢!
|
|