[通用8051核FLASH系列] 【芯圣电子HC89S105A测评报告】+CRC校验

[复制链接]
2153|8
 楼主| 比神乐 发表于 2023-5-26 09:53 | 显示全部楼层 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-19 16:32 编辑

今天运行了一下CRC例程。代码:
  1. #define ALLOCATE_EXTERN
  2. #include "HC89S105AC8.h"

  3. unsigned char count[5] = {0x01,0x02,0x03,0x04,0x05};        //待计算数据
  4. unsigned int Result = 0;                                                                              //计算结果

  5. unsigned int CRC_WriteArr(unsigned char *CheckArr,unsigned int CheckLen);          //写入校验数据并返回结果

  6. /**************************************************************************************
  7.   * @实现效果         对写入的数据进行CRC校验,结果为DD13
  8.   * @操作方法         进入debug,查看仿真结果,结果为DD13
  9. **************************************************************************************/
  10. void main(void)
  11. {
  12. /**************************************系统初始化*************************************/
  13.         WDTCCR = 0x00;                           //关闭看门狗
  14.                                                            //本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
  15.         CLKCON = 0x02;                           //选择内部高频RC为系统时钟, Fosc=32MHz
  16.         CLKDIV = 0x02;                           //Fosc 2分频得到Fcpu,Fcpu=16MHz
  17.         
  18. /**************************************CRC初始化*************************************/
  19.     CRCC = 0x07;                                   //CRC复位,LSB first,复位初值为0xFFFF        
  20.         
  21. /**************************************CRC校验*************************************/
  22.         Result = CRC_WriteArr(count,0x05);         //写入校验数据并返回结果,结果为DD13
  23.                                     
  24.         while(1);
  25. }
  26. /***************************************************************************************
  27.   * @说明          写入需要校验的数据并返回校验结果
  28.   *        @参数          *CheckArr : CRC校验数据首地址
  29.   *        @参数          CheckLen : CRC校验数据长度
  30.   *                            取值范围 0 - 65535
  31.   * @返回值 CRC校验结果
  32.   *                            低位在前,高位在后
  33.   * @注                  无
  34. ***************************************************************************************/
  35. unsigned int CRC_WriteArr(unsigned char *CheckArr,unsigned int CheckLen)
  36. {
  37.         CRCC |= 0x01;
  38.         while(CheckLen--)CRCL = *(CheckArr++);
  39.         return CRCR;
  40. }
代码里提示结果为0xdd13
我写了个C程序,代码如下:
  1. #include "stdio.h"

  2. #define uint16_t  unsigned short
  3. #define uint8_t   unsigned char



  4. uint16_t temp;

  5. unsigned char count[5] = {0x01,0x02,0x03,0x04,0x05};        //待计算数据
  6. /******************************************************************************
  7. * Name:    CRC-16/CCITT        x16+x12+x5+1
  8. * Poly:    0x1021
  9. * Init:    0x0000
  10. * Refin:   True
  11. * Refout:  True
  12. * Xorout:  0x0000
  13. * Alias:   CRC-CCITT,CRC-16/CCITT-TRUE,CRC-16/KERMIT
  14. *****************************************************************************/
  15. uint16_t crc16_ccitt(uint8_t *data, uint16_t length)
  16. {
  17.     uint8_t i;
  18.     uint16_t crc = 0xffff;        // Initial value
  19.     while(length--)
  20.     {
  21.         crc ^= *data++;   
  22.         for (i = 0; i < 8; ++i)
  23.         {
  24.             if (crc & 1)
  25.                 crc = (crc >> 1) ^ 0x8408;      
  26.             else
  27.                 crc = (crc >> 1);
  28.         }
  29.     }
  30.     return crc;
  31. }




  32. void main(void)
  33. {
  34.   temp=crc16_ccitt(count, 5);
  35.   printf("crc16 value=:%x\r\n",temp);
  36.          
  37. }
运行效果图:
14.jpg
八层楼 发表于 2023-6-9 16:45 | 显示全部楼层
CRC校验是不是分很多种啊,如何确定单片机用的是什么crc校验呢
观海 发表于 2023-6-9 17:06 | 显示全部楼层
在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。
tpgf 发表于 2023-6-9 17:23 | 显示全部楼层
校验码的具体生成过程为:假设发送信息用信息多项式C(X)表示,将C(x)左移R位,则可表示成C(x)*x的R次方,这样C(x)的右边就会空出R位,这就是校验码的位置。通过C(x)*X的R次方除以生成多项式G(x)得到的余数就是校验码。
guanjiaer 发表于 2023-6-10 10:08 | 显示全部楼层
任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应
heimaojingzhang 发表于 2023-6-10 10:28 | 显示全部楼层
八层楼 发表于 2023-6-9 16:45
CRC校验是不是分很多种啊,如何确定单片机用的是什么crc校验呢

原理都是一样的 就是计算使用的多项式不同而已
keaibukelian 发表于 2023-6-10 10:49 | 显示全部楼层
接收方需要使用相同的生成码进行校验:接收到的字段/生成码
lajdfla001 发表于 2023-6-19 18:06 | 显示全部楼层
接收方需要使用相同的代码,才可以的。
ynndmalh21 发表于 2023-6-19 18:14 | 显示全部楼层
这个CRC校验还是很通用的校验。不错的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3537

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部