| 本帖最后由 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计算器
 
   
 
 
 
 
 |