当前位置: 首页>編程日記>正文

CRC8校验原理

CRC8校验原理

原理

假设CRC8校验slave address + data byte
传入两个字节的数据(16位)
CRC初始值及校验key查看数据手册 不同芯片有不同的要求
如(BQ76930)

The CRC polynomial is x8 + x2 + x + 1, and the initial value is 0.

因此,初始CRC=0,多项式表示 1 0000 0111 有提到的位为1 最高位不需要参与校验 结果key为0x07

步骤

1、进行两轮循环 每个循环校验8位

2、在for循环中对CRC进行8次处理,从最高位开始 如果CRC为0则左移1位。如果不为0,则CRC先左移1位,然后和key进行异或

3、每个for中都有一次字节ptr(8位)& i 相当于ptr为掩码 从高位到低位轮询 如果为1 则CRC进行异或 否则不进行操作
数据0x11 key0x07 结果0x77

代码

unsigned char CRC8(unsigned char *ptr, unsigned char len,unsigned char key)
{unsigned char i;unsigned char crc=0;while(len--!=0){for(i=0x80; i!=0; i/=2){if((crc & 0x80) != 0){crc *= 2;crc ^= key;}elsecrc *= 2;if((*ptr & i)!=0)crc ^= key;}ptr++;}return(crc);
}

测试函数

#include <iostream>
#include <cstdio>
using namespace std;
unsigned char cal_table_high_first(unsigned char value);
unsigned char CRC8(unsigned char *ptr, unsigned char len,unsigned char key)
{unsigned char i;unsigned char crc=0;while(len--!=0){for(i=0x80; i!=0; i/=2){if((crc & 0x80) != 0){crc *= 2;crc ^= key;}elsecrc *= 2;if((*ptr & i)!=0)crc ^= key;}ptr++;}return(crc);
}
int main(){
//四组数据,前20字节为数据位,21位为CRC校验位
//	unsigned char str[] = {0xA8,0xFF,0xFF,0xBE,0x00,0x00,0x01,0x00,0x00,0x76,0x00,0x2A,0x20,0x2A,0x40,0x2A,0x20,0x97,0x02,0x06,0xEA};
//	unsigned char st2[] = {0xA8,0xFF,0xFF,0xBE,0x00,0x00,0x09,0x00,0x00,0x7B,0x00,0x2A,0x00,0x2A,0x60,0x2A,0x40,0x9B,0x02,0x07,0xB1};
//	unsigned char st3[] = {0xA8,0xFF,0xFF,0x75,0xFF,0xFF,0xDC,0x00,0x00,0x99,0x00,0x2B,0x60,0x2B,0x80,0x2B,0x60,0xAD,0x02,0x07,0x38};
//	unsigned char st4[] = {0xA8,0xFF,0xFF,0x7E,0xFF,0xFF,0xF9,0x00,0x00,0x7A,0x00,0x2C,0xC0,0x2C,0xC0,0x2C,0xC0,0xB7,0x02,0x07,0x49};unsigned char ptr = 0x11;printf("0x%x ",cal_table_high_first(0x11));printf("0x%x",CRC8(&ptr,1,0x07));return 0;
} unsigned char cal_table_high_first(unsigned char value)
{unsigned char i, crc;crc = value;/* 数据往左移了8位,需要计算8次 */for (i=8; i>0; --i){ if (crc & 0x80)  /* 判断最高位是否为1 */{/* 最高位为1,不需要异或,往左移一位,然后与0x31异或 *//* 0x31(多项式:x8+x5+x4+1,100110001),最高位不需要异或,直接去掉 */crc = (crc << 1) ^ 0x07;        }else{/* 最高位为0时,不需要异或,整体数据往左移一位 */crc = (crc << 1);}}return crc;
}


https://www.fengoutiyan.com/post/15572.html

相关文章:

  • 和校验与crc校验的区别
  • 校验灯原理
  • CRC校验原理及步骤
  • CRC校验原理及代码
  • crc校验方法
  • crc校验的基本原理
  • crc8校验算法原理
  • crc校验的作用
  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機