930电子网

 找回密码
 立即注册
艾克姆科技推出最新产品STC32G12K128开发板
查看: 8328|回复: 0

DS18B20数字温度传感器介绍4---CRC8校验

[复制链接]

101

主题

333

帖子

7428

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7428
发表于 2019-6-1 16:04:06 | 显示全部楼层 |阅读模式
     1、CRC8校验有常规编码算法和逆序CRC信息单元编码算法两种,DS18B20生成CRC码使用的就是逆序CRC信息单元编码算法。
     2、下面介绍对单个字节的CRC8常规编码算法。
  • #define POLYNOMIAL             0x131   //G(x) = x^8 + x^5 + x^4 + 1 = 100110001  
  •   
  • /**********************************************************************************
  • *   函 数 名: calcrc_1byte
  • *   功能说明: 单字节CRC校验
  • *   形    参: unsigned char abyte:待校验单字节数据  
  • *   返 回 值: 经CRC校验值
  • ***********************************************************************************/  
  • unsigned char calcrc_1byte(unsigned char abyte)     
  • {   
  •     unsigned char bit,crc_1byte;  
  •     crc_1byte=abyte;  
  •   for (bit = 8; bit > 0; --bit)  
  •   {   
  •       if (crc_1byte & 0x80)    //判断最高位是否为1      
  •       {  
  •           crc_1byte = (crc_1byte << 1) ^ POLYNOMIAL;   //最高位为1,左移一位与多项式异或  
  •       }  
  •     else   
  •       {  
  •           crc_1byte = (crc_1byte << 1);     //最高位为0,直接左移一位  
  •       }  
  •   }  
  •     return crc_1byte;   
  • }

    3、下面介绍对多字节的CRC8常规编码算法。
  • #define POLYNOMIAL             0x131   //G(x) = x^8 + x^5 + x^4 + 1 = 100110001  
  •    
  • /**********************************************************************************
  • *   函 数 名: calcrc_nbyte
  • *   功能说明: 多字节CRC校验
  • *   形    参: unsigned char *buf:待校验数组指针   unsigned char len:校验数
  • *   返 回 值: 经CRC校验值
  • ***********************************************************************************/  
  • unsigned char calcrc_nbyte(unsigned char *buf,unsigned char len)     
  • {   
  •     unsigned char bit,crc_nbyte;  
  •     crc_nbyte=0xFF;  
  •     while(len--)  
  •     {  
  •         crc_nbyte ^= *buf++;   //先与需要计算的数异或,再指向下一个数  
  •     for (bit = 8; bit > 0; --bit)  
  •     {   
  •         if (crc_nbyte & 0x80)    //判断最高位是否为1      
  •         {  
  •             crc_nbyte = (crc_nbyte << 1) ^ POLYNOMIAL;     //最高位为1,左移一位与多项式异或  
  •         }  
  •       else   
  •         {  
  •             crc_nbyte = (crc_nbyte << 1);       //最高位为0,直接左移一位  
  •         }  
  •     }  
  •   }  
  •     return crc_nbyte;   
  • }

    4、下面介绍对单个字节的逆序CRC信息单元编码算法。
  • #define POLYNOMIAL             0x8C   //00110001反序为10001100  
  •   
  • /**********************************************************************************
  • *   函 数 名: calcrc_1byte
  • *   功能说明: 单字节CRC校验
  • *   形    参: unsigned char abyte:待校验单字节数据  
  • *   返 回 值: 经CRC校验值
  • ***********************************************************************************/  
  • unsigned char calcrc_1byte(unsigned char abyte)     
  • {   
  •     unsigned char bit,crc_1byte;  
  •     crc_1byte=abyte;  
  •   for (bit = 8; bit > 0; --bit)  
  •   {   
  •       if (crc_1byte & 0x01)    //判断最低位是否为1      
  •       {  
  •           crc_1byte = (crc_1byte >> 1) ^ POLYNOMIAL;   //最低位为1,右移一位与多项式异或  
  •       }  
  •     else   
  •       {  
  •           crc_1byte = (crc_1byte >> 1);     //最低位为0,直接右移一位  
  •       }  
  •   }  
  •     return crc_1byte;   
  • }

    5、下面介绍对多字节的逆序CRC信息单元编码算法。
  • #define POLYNOMIAL             0x8C   //00110001反序为10001100  
  •    
  • /**********************************************************************************
  • *   函 数 名: calcrc_nbyte
  • *   功能说明: 多字节CRC校验
  • *   形    参: unsigned char *buf:待校验数组指针   unsigned char len:校验数
  • *   返 回 值: 经CRC校验值
  • ***********************************************************************************/  
  • unsigned char calcrc_nbyte(unsigned char *buf,unsigned char len)     
  • {   
  •     unsigned char bit,crc_nbyte;  
  •     crc_nbyte=0;  
  •     while(len--)  
  •     {  
  •         crc_nbyte ^= *buf++;   //先与需要计算的数异或,再指向下一个数  
  •     for (bit = 8; bit > 0; --bit)  
  •     {   
  •         if (crc_nbyte & 0x01)    //判断最低位是否为1      
  •         {  
  •             crc_nbyte = (crc_nbyte >> 1) ^ POLYNOMIAL;     //最低位为1,右移一位与多项式异或  
  •         }  
  •       else   
  •         {  
  •             crc_nbyte = (crc_nbyte >> 1);       //最低位为0,直接右移一位  
  •         }  
  •     }  
  •   }  
  •     return crc_nbyte;   
  • }  

    6、附件为艾克姆科技IK-ZET6开发板连接DS18B20读取温度值例程(CRC校验)。














本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|官方淘宝店|930电子网 ( 皖ICP备16000695号-2 )

Copyright © 合肥艾克姆电子科技有限公司
快速回复 返回顶部 返回列表