[资料工具] NV32F100 CRC

[复制链接]
 楼主| hanzhen654 发表于 2020-2-23 20:29 | 显示全部楼层 |阅读模式
初始化CRC
  1. void CRC_Init(CRC_ConfigType *pConfig)
  2. {      
  3.     uint32_t     u32Sc ;
  4.    
  5.     u32Sc      = 0;
  6.    
  7.     SIM->SCGC |= SIM_SCGC_CRC_MASK;   //使能CRC控制模块时钟
  8.    
  9.     u32Sc     |= ((pConfig->bWidth & 0x01)<<24);   //CRC模式选择
  10.     u32Sc     |= CRC_CTRL_TOTR(pConfig->bTransposeReadType & 0x03);  //设置数据读取的转置类型
  11.     u32Sc     |= CRC_CTRL_TOT(pConfig->bTransposeWriteType & 0x03);  //设置数据写入的转置类型
  12.    
  13.     if (pConfig->bFinalXOR)  
  14.     {
  15.         u32Sc |= CRC_CTRL_FXOR_MASK;  //对CRC数据寄存的读取值进行异或操作     
  16.     }
  17.    
  18.     CRC0->CTRL  = u32Sc;

  19.     if ( pConfig->bWidth )      
  20.     {
  21.         CRC0->GPOLY = pConfig->u32PolyData;  //写入32位多项式
  22.     }
  23.     else
  24.     {
  25.         CRC0->GPOLY_ACCESS16BIT.GPOLYL = pConfig->u32PolyData;  /*!< 仅允许写16位多项式*/            
  26.     }  
  27.    
  28. }     


 楼主| hanzhen654 发表于 2020-2-23 20:30 | 显示全部楼层
16位模式下CRC计算函数
  1. uint32_t CRC_Cal16(uint32_t seed, uint8_t *msg, uint32_t sizeBytes)
  2. {
  3.   uint32_t ctrl_reg,data_out,data_in;
  4.   uint8_t  *pCRCBytes;
  5.   uint32_t sizeWords;
  6.   uint32_t i,j;  
  7.   
  8.   /* 设置WaS=1,写入种子值 */
  9.   ctrl_reg  = CRC0->CTRL;
  10.   CRC0->CTRL  = ctrl_reg | CRC_CTRL_WAS_MASK;
  11.   CRC0->ACCESS16BIT.DATAL = seed;
  12.   
  13.   /* Set WaS=0,准备写入数据*/
  14.   CRC0->CTRL  = ctrl_reg & 0xFD000000;

  15.   /*等待计算完成*/
  16.   sizeWords = sizeBytes>>1;
  17.   j = 0;
  18.   for(i=0;i<sizeWords;i++){
  19.       data_in = (msg[j] << 8) | (msg[j+1]);  /*将数据写入CRC数据寄存器,以16位方式写入*/
  20.       j += 2;
  21.       CRC0->ACCESS16BIT.DATAL =data_in;
  22.   }
  23.   if (j<sizeBytes)
  24.   {
  25.      pCRCBytes = (uint8_t*)&CRC0->ACCESS8BIT.DATALL; /*以8位的方式写入剩余的数据*/
  26.      *pCRCBytes++ = msg[j];
  27.   }
  28.   if ((CRC0->CTRL& CRC_CTRL_TOTR_MASK)>1)   //Modify
  29.   {
  30.      data_out=CRC0->ACCESS16BIT.DATAH;  //读出字节转置后16位计算结果
  31.   }
  32.   else
  33.   {
  34.      data_out=CRC0->ACCESS16BIT.DATAL;  //读出16位计算结果
  35.   }
  36.   
  37.   return(data_out);
  38. }


 楼主| hanzhen654 发表于 2020-2-23 20:30 | 显示全部楼层
32位模式下CRC计算
  1. uint32_t CRC_Cal32(uint32_t seed, uint8_t *msg, uint32_t sizeBytes)
  2. {  
  3.   uint32_t ctrl_reg,data_out,data_in;
  4.   uint32_t sizeDwords;
  5.   uint8_t  *pCRCBytes;
  6.   uint32_t i,j;
  7.   
  8. /* 设置WaS=1,写入种子值 */
  9.   ctrl_reg = CRC0->CTRL;
  10.   CRC0->CTRL = ctrl_reg | 0x02000000;
  11.   CRC0->DATA = seed;

  12. /* Set WaS=0,准备写入数据*/
  13.   CRC0->CTRL = ctrl_reg & 0xFD000000;
  14.   
  15.   /*等待数据计算完成*/
  16.   sizeDwords = sizeBytes>>2;
  17.   j = 0;
  18.   for(i=0;i<sizeDwords;i++)
  19.   {
  20.       data_in = ((msg[j] << 24) | (msg[j+1] << 16) | (msg[j+2] << 8) | msg[j+3]); /*将数据写入CRC数据寄存器,以32方式写入*/
  21.       j += 4;
  22.       CRC0->DATA = data_in;
  23.   }
  24.   if (j<sizeBytes)
  25.   {
  26.     pCRCBytes = (uint8_t*)&CRC0->ACCESS8BIT.DATALL;    /*以8位的方式写入剩余的数据*/

  27. #if  defined(BYTE_ENABLES_1_2_4_8)   
  28.    
  29.     /*只写单个字节*/  
  30.     for(;j<sizeBytes;j++)
  31.     {     
  32.        *pCRCBytes++ = msg[j];
  33.     }
  34. #elif  defined(BYTE_ENABLES_3_6_C)
  35.    
  36.     /*写入两个字节*/
  37.     data_in = 0;
  38.     i = 0;
  39.     for(;j<sizeBytes;j++)
  40.     {     
  41.       data_in = (data_in <<8) | msg[j];
  42.       i++;
  43.       if (i==2)
  44.       {
  45.         i = 0;
  46.         CRC0->ACCESS16BIT.DATAL = data_in;
  47.       }
  48.     }
  49.     if (i==1)
  50.     {
  51.        CRC0->ACCESS8BIT.DATALL = data_in;                /*!< 写入最后一个字节 */
  52.     }
  53. #elif  defined(BYTE_ENABLES_7_E)                        
  54.     /*!< 写入三个字节*/
  55.     data_in = 0;
  56.     i = 0;
  57.     for(;j<sizeBytes;j++)
  58.     {     
  59.       data_in = (data_in <<8) | msg[j];
  60.       i++;
  61.       if (i==3)
  62.       {
  63.         i = 0;
  64.         /*写入第一个字符*/
  65.         CRC0->ACCESS8BIT.DATAHL  = (data_in>>16) & 0xff; /*!< 写入高字的低字节 */
  66.         /*写入最后两个字节*/
  67.         CRC0->ACCESS16BIT.DATAL = data_in & 0x00ffff;    /*!< 写入低字 */
  68.        }
  69.     }
  70.     if ( i == 2)
  71.     {
  72.        CRC0->ACCESS16BIT.DATAL = (data_in);              /*!< 写最后两个字节 */
  73.     }
  74.     else if (i == 1)
  75.     {
  76.        CRC0->ACCESS8BIT.DATALL = data_in;                /*!< 写最后一个字节 */      
  77.     }
  78. #else                                                    /*!< 只写低字节 */
  79.     for(;j<sizeBytes;j++)
  80.     {     
  81.        *pCRCBytes = msg[j];
  82.     }
  83. #endif            
  84.   }
  85.   data_out=CRC0->DATA;   

  86.   return(data_out);   //读出32位计算结果
  87. }


 楼主| hanzhen654 发表于 2020-2-23 20:31 | 显示全部楼层
复位CRC模块
  1. void CRC_DeInit(void)
  2. {  
  3.    CRC0->CTRL  = 0x3000000; /*!<设置CRC位32位模式*/
  4.    CRC0->DATA  = 0xFFFFFFFF;/*!< 写32位种子值到CRC数据寄存器*/
  5.    while(!(CRC0->DATA == 0xFFFFFFFF));
  6.    CRC0->GPOLY = 0x00001021;
  7.    CRC0->CTRL  = 0;         /*!<CRC控制寄存器清零*/  
  8.    SIM->SCGC &= ~SIM_SCGC_CRC_MASK;
  9. }


 楼主| hanzhen654 发表于 2020-2-23 20:31 | 显示全部楼层
CRC控制寄存器位定义
  1. #define CRC_WIDTH_16BIT                 0        /*!< 选择16位CRC协议 */   
  2. #define CRC_WIDTH_32BIT                 1        /*!< 选择32位CRC协议 */
  3. #define CRC_DATA_SEED                   1        /*!< 写入CRC数据寄存器的值为种子值 */  
  4. #define CRC_DATA_DATA                   0        /*!< 写入CRC数据寄存器的值为数据值 */
  5. #define CRC_READ_COMPLETE               1        /*!< 反转或补充CRC数据寄存器的读取值 */
  6. #define CRC_READ_NONE                   0        /*!< 读取数据寄存器时不执行异或运算*/
  7. #define CRC_READ_TRANSPOSE_NONE         0        /*!< 读取数据寄存器的值无转置 */
  8. #define CRC_READ_TRANSPOSE_BIT          1        /*!< 读取数据寄存器的值,字节中的位转置,字不转置*/
  9. #define CRC_READ_TRANSPOSE_ALL          2        /*!< 读取数据寄存器的值,字节中的位和字节均转置 */
  10. #define CRC_READ_TRANSPOSE_BYTE         3        /*!< 读取数据寄存器的值,仅字节转置,字节中的位不转置 */
  11. #define CRC_WRITE_TRANSPOSE_NONE        0        /*!< 写数据时无转置 */
  12. #define CRC_WRITE_TRANSPOSE_BIT         1        /*!< 写数据时,字节中的位转置,字节不转置 */
  13. #define CRC_WRITE_TRANSPOSE_ALL         2        /*!< 写数据时,字节中的位和字节均转置 */
  14. #define CRC_WRITE_TRANSPOSE_BYTE        3        /*!< 写数据时,仅字节转置,字节中的位不转置 */


 楼主| hanzhen654 发表于 2020-2-23 20:32 | 显示全部楼层
CRC 配置结构体类型
  1. typedef struct
  2. {         
  3.     uint8_t bWidth                  : 1;    /*!< 1: 32位CRC协议  0: 16位CRC协议 */
  4.     uint8_t bDataType               : 1;    /*!< 1: 写入种子值 , 0: 写入数据 */
  5.     uint8_t bFinalXOR               : 1;    /*!< 1: 读数据是反转或补充 , 0: 读数据时不执行异或*/
  6.     uint8_t bRESERVED               : 1;    /*!< 保留位 */  
  7.     uint8_t bTransposeReadType      : 2;    /*!< 读取数据时的转置类型, 参阅参考手册 */
  8.     uint8_t bTransposeWriteType     : 2;    /*!< 写数据时的转置类型, 参阅参考手册 */      
  9.     uint32_t u32PolyData               ;    /*!< 32位或16位多项式*/           
  10. } CRC_ConfigType, *CRC_ConfigPtr  ;


598330983 发表于 2020-3-4 21:33 | 显示全部楼层
硬件CRC
zhuomuniao110 发表于 2020-3-7 22:51 | 显示全部楼层
CRC至今没有搞懂。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

73

主题

1766

帖子

2

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

73

主题

1766

帖子

2

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