打印
[资料工具]

在NV32上使用硬件CRC

[复制链接]
2258|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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工程的配置
校验协议
Poly
Width
Seedvalue
TransposeWriteType
TransposeReadType
FinalXOR
CRC-16/IBM
0x8005
16
0x0000
CRC_WRITE_TRANSPOSE_BIT
CRC_READ_TRANSPOSE_ALL
FALSE
CRC-16/MAXIM
0x8005
16
0x0000
CRC_WRITE_TRANSPOSE_BIT
CRC_READ_TRANSPOSE_ALL
TRUE
CRC-16/USB
0x8005
16
0xFFFF
CRC_WRITE_TRANSPOSE_BIT
CRC_READ_TRANSPOSE_ALL
TRUE
CRC-16/MODBUS
0x8005
16
0xFFFF
CRC_WRITE_TRANSPOSE_BIT
CRC_READ_TRANSPOSE_ALL
FALSE
CRC-16/CCITT
0x1021
16
0x0000
CRC_WRITE_TRANSPOSE_BIT
CRC_READ_TRANSPOSE_ALL
FALSE
CRC-16/CCITT-FALSE
0x1021
16
0xFFFF
CRC_WRITE_TRANSPOSE_NONE
CRC_READ_TRANSPOSE_NONE
FALSE
CRC-16/X25
0x1021
16
0xFFFF
CRC_WRITE_TRANSPOSE_BIT
CRC_READ_TRANSPOSE_ALL
TRUE
CRC-16/XMODEM
0x1021
16
0x0000
CRC_WRITE_TRANSPOSE_NONE
CRC_READ_TRANSPOSE_NONE
FALSE
CRC-16/DNP
0x3D65
16
0x0000
CRC_WRITE_TRANSPOSE_BIT
CRC_READ_TRANSPOSE_ALL
TRUE
CRC32
0x04C11DB7
32
0xFFFFFFFF
CRC_WRITE_TRANSPOSE_BIT
CRC_READ_TRANSPOSE_ALL
TRUE
CRC32/MPEG-2
0x04C11DB7
32
0xFFFFFFFF
CRC_WRITE_TRANSPOSE_NONE
CRC_READ_TRANSPOSE_NONE
FALSE


详细的了解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计算器





CRC计算器.zip

571.04 KB

CRC计算器

相关帖子

沙发
aozima| | 2017-11-3 15:43 | 只看该作者
自定义 poly 和 FinalXOR 真是方便

使用特权

评论回复
板凳
历史暴君| | 2017-11-20 20:53 | 只看该作者
这个很不错,STM的不太好用

使用特权

评论回复
地板
16号哨兵| | 2017-11-22 20:16 | 只看该作者
支持下,硬件CRC还是不错的。

使用特权

评论回复
5
Bruing| | 2017-12-24 08:24 | 只看该作者
硬件CRC的速度如何,支持哪种CRC的校验呢?

使用特权

评论回复
6
hotpower| | 2017-12-24 20:35 | 只看该作者
本帖最后由 hotpower 于 2017-12-24 20:40 编辑

http://www.21ic.com/tools/HotPower/HotWC3_V1.23.html

使用特权

评论回复
7
Sunriver_Yao| | 2018-1-7 19:33 | 只看该作者
比纯软件好多了! 但是,比起新塘的PDMA-CRC,基于DMA的纯硬件算法是慢了很多;ST的不了解。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

57

帖子

1

粉丝