本帖最后由 jhqd1994 于 2017-11-3 15:41 编辑
本文针对例程包中的CRC_demo配置进行详解:
例程中的对应CRC-16/CCITT-FALSE的配置
pCRC_Config->u32PolyData = 0x1021; /*!< 16位 CRC-CCITT 多项式 */ u32SeedValue = 0xFFFF; /*!< 设定种子值(检验和初始值) */ pCRC_Config->bWidth = CRC_WIDTH_16BIT; /*!< 选择16位CRC协议 */ pCRC_Config->bTransposeReadType = CRC_READ_TRANSPOSE_NONE; /*!< 读取的CRC数据寄存器的值不转置 */ pCRC_Config->bTransposeWriteType = CRC_WRITE_TRANSPOSE_NONE; /*!< 写入到CRC数据寄存器的值不转置 */ pCRC_Config->bFinalXOR = FALSE;
下表列出常见CRC校验协议对应NV32-CRC工程的配置
详细的了解CRC模块,请见NV32F100x参考手册-CRC循环冗余校验模块
纠正例程中的CRC_Cal16函数,添加红色处相关代码
uint32_t CRC_Cal16(uint32_t seed, uint8_t *msg, uint32_t sizeBytes)
{
uint32_t ctrl_reg,data_out,data_in;
uint8_t *pCRCBytes;
uint32_t sizeWords;
uint32_t i,j;
/* 设置WaS=1,写入种子值 */
ctrl_reg = CRC0->CTRL;
CRC0->CTRL = ctrl_reg | CRC_CTRL_WAS_MASK;
CRC0->ACCESS16BIT.DATAL = seed;
/* Set WaS=0,准备写入数据*/
CRC0->CTRL = ctrl_reg & 0xFD000000;
/*等待计算完成*/
sizeWords = sizeBytes>>1;
j = 0;
for(i=0;i<sizeWords;i++){
data_in = (msg[j] << 8) | (msg[j+1]); /*将数据写入CRC数据寄存器,以16位方式写入*/
j += 2;
CRC0->ACCESS16BIT.DATAL =data_in;
}
if (j<sizeBytes)
{
pCRCBytes = (uint8_t*)&CRC0->ACCESS8BIT.DATALL; /*以8位的方式写入剩余的数据*/
*pCRCBytes++ = msg[j];
}
if ((CRC0->CTRL& CRC_CTRL_TOTR_MASK)>1)
{
data_out=CRC0->ACCESS16BIT.DATAH; //读出字节转置后16位计算结果
}
else
{
data_out=CRC0->ACCESS16BIT.DATAL; //读出16位计算结果
}
return(data_out);
}
推荐使用附件中的CRC计算器
|