0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用CRC算法檢查數(shù)據(jù)傳輸?shù)恼_性

8ECz_icstudy ? 來(lái)源:未知 ? 2019-02-03 09:10 ? 次閱讀

還有半個(gè)多月就要過(guò)年了,工作之后時(shí)間過(guò)得真是飛快啊,才剛剛熟悉在各種文件上簽2018的日期,現(xiàn)在竟然又變成2019了。最郁悶的是又老了一歲,找誰(shuí)說(shuō)理去

大家都知道芯片有輸入輸出,根據(jù)不同的傳輸協(xié)議,輸入輸出的數(shù)據(jù)有可能是一串長(zhǎng)長(zhǎng)的數(shù)據(jù),幾十個(gè)或者幾百個(gè)byte甚至更多。在數(shù)據(jù)傳輸過(guò)程中,由于某些意外的原因?qū)е履承゜it出現(xiàn)錯(cuò)誤(0變?yōu)?,或者1變?yōu)?),從而接受方接收到錯(cuò)誤的數(shù)據(jù)。

為盡量提高接受方收到數(shù)據(jù)的正確率,在接收方接收數(shù)據(jù)后需要對(duì)數(shù)據(jù)進(jìn)行校驗(yàn),當(dāng)且僅當(dāng)校驗(yàn)的結(jié)果為正確時(shí)接收方才真正收下數(shù)據(jù)。循環(huán)冗余校驗(yàn)(Cyclic Redundancy Check, CRC)算法通常用于數(shù)字傳輸系統(tǒng)或者存儲(chǔ)器中,用來(lái)檢測(cè)意外事件對(duì)原數(shù)據(jù)的影響,判斷接受到的數(shù)據(jù)是否正確。

下面是IC君文武雙全的朋友文武寫的CRC文章,IC君稍微做了優(yōu)化排版和少量的編輯工作提升大家的閱讀體驗(yàn)。

1

前言:

因?yàn)镃RC循環(huán)冗余校驗(yàn)碼的算法和硬件電路結(jié)構(gòu)比較簡(jiǎn)單,所以CRC是一種在工程中常用的數(shù)據(jù)校驗(yàn)方法。盡管CRC簡(jiǎn)單,但在工程應(yīng)用中還是有些問(wèn)題會(huì)對(duì)工程師產(chǎn)生困惑。這篇文章將從以下三個(gè)方面介紹以下CRC,希望對(duì)大家有所幫助。

CRC 的數(shù)學(xué)原理;

CRC的通項(xiàng)公式,怎樣選取一個(gè)適合的通項(xiàng)公式;

CRC 硬件電路實(shí)現(xiàn),串行電路到并行電路的實(shí)現(xiàn)。

2

CRC的數(shù)學(xué)原理:

在講CRC的數(shù)學(xué)原理之前,首先看一下下面的圖。圖1是A要給B發(fā)送1bit的信息0或者1。假設(shè)A發(fā)

圖1

送一個(gè)0給B,系統(tǒng)正常的情況下B會(huì)接受到一個(gè)0。但是如果有個(gè)干擾(比如信號(hào)線的串?dāng)_)在A和B相連的傳輸線上,那么B就有可能接受到一個(gè)1,傳輸數(shù)據(jù)發(fā)生錯(cuò)誤。

為了改進(jìn)這個(gè)傳輸過(guò)程,A和B約定(圖2)。

圖2

如果A要發(fā)送一個(gè)0給B,A就在一段時(shí)間連續(xù)發(fā)送兩個(gè)0(2’b00’)給B;

如果A要發(fā)送一個(gè)1信息給B,那么A就在一段時(shí)間連續(xù)發(fā)送兩個(gè)1(2’b11’)給B。

如果B接受了一個(gè)2’b01或者2’b10,B就知道他們之間有干擾;

要是B接受到了一個(gè)2’b00,B就會(huì)認(rèn)為A發(fā)送的信息是個(gè)0;

那么A有沒(méi)有可能發(fā)的信息是2個(gè)1?這也是有可能的,不過(guò)2’b00變成2’b11比1’b0變成1’b1的概率要低的多。

如果A和B約定以圖3的方式進(jìn)行傳輸,假設(shè)A要發(fā)送一個(gè)0給B,那么A就在一段時(shí)間連續(xù)發(fā)送3個(gè)0(3’b000)給B;如果A要發(fā)送一個(gè)1信息給B,那么A就在一段時(shí)間連續(xù)發(fā)送三個(gè)1(3’b111’)給B;

如果B接受到的值為3’b001、3’b010或者3’b100,B就知道他們之間有干擾,

圖3

并且B會(huì)自我判斷A給自己發(fā)送的信息是0不是1。這種判斷是合理的,因?yàn)檎`判的概率很低。

圖1,圖2,圖3可以概括成圖4。

圖4 箭頭上的數(shù)字是海明距(HD)

海明距離HD的定義

兩個(gè)碼字的對(duì)應(yīng)比特值不同(異或)的總數(shù)目稱為這兩個(gè)碼字的海明距離。一個(gè)有效編碼集中,任意兩個(gè)碼字的海明距離的最小值稱為該編碼集的海明距離。

圖4的第一種情況就是沒(méi)有編碼,0和1的碼距(HD海明距)是1;

第二種情況其實(shí)就是奇偶校驗(yàn),碼距是2,可以檢測(cè)1個(gè)錯(cuò)誤;

第三種情況就是糾錯(cuò)碼了,海明距是3,如果出現(xiàn)了1個(gè)錯(cuò)誤是可以自己糾錯(cuò)的,出現(xiàn)小于3個(gè)錯(cuò)誤可以檢測(cè)。

第三種情況的有效碼字000,其中0是信息位,00是校驗(yàn)位,2位的校驗(yàn)碼來(lái)確定一位數(shù)據(jù)位,看上去有點(diǎn)太浪費(fèi)了。

一種編碼的校驗(yàn)和糾錯(cuò)能力取決于它的海明距離。為檢測(cè)出d比特錯(cuò),需要使用碼距d+1的編碼;因?yàn)閐個(gè)單比特錯(cuò)決不可能將一個(gè)有效的碼字轉(zhuǎn)變成另一個(gè)有效的碼字。當(dāng)接收方看到無(wú)效的碼字,它就能明白發(fā)生傳輸錯(cuò)誤。

同樣,為了糾正d比特錯(cuò),必須使用碼距為2d+1的編碼,這是因?yàn)橛行Тa字的距離遠(yuǎn)到即使發(fā)生d個(gè)變化,這個(gè)發(fā)生了變化的碼字仍然比其它碼字都接近原始碼字。

通過(guò)上面的例子大家理解了碼字(CODEWORD),信息位(DATA),校驗(yàn)位(CHECK SUM),海明距(HD)等概念。

下面看一看圖5的CRC計(jì)算過(guò)程

圖5(來(lái)自wikipedia)

CRC在數(shù)學(xué)上就是除余運(yùn)算,除數(shù)是個(gè)通項(xiàng)公式(固定數(shù)),

例如G(X)=X3+X+1 (1011),

被除數(shù)11010011101100,除數(shù)1011

DATA=11010011101100,

最終得到的余數(shù) CHECK SUM=100,

所以需要傳輸?shù)腃ODEWORD=11010011101100100。

用上面CRC算法作為A和B的通信協(xié)議,傳輸數(shù)據(jù)只添加了3bit的checksum,編碼效率比圖2、圖3提高不少。但是編碼和解碼算法會(huì)變復(fù)雜,所以有得必有失吧。

具體傳輸過(guò)程如下:

A發(fā)送DATA=11010011101100給B,

發(fā)送之前先編碼

假設(shè)初始CODEWORD=11010011101100000

對(duì)G(X)=X3+X+1 (1011)除余數(shù),

最后用初始DATA加上CHECK SUM=100得到最終發(fā)送:

CODEWORD=11010011101100100。

在B接受到CODEWORD 通過(guò)解碼來(lái)檢查A的發(fā)送有沒(méi)有錯(cuò)。

解碼的過(guò)程:

用CODEWORD=11010011101100100對(duì)G(X)=X3+X+1 (1011)除余數(shù),如果余數(shù)等于0即CHECK SUM=000,就認(rèn)為B接受到的數(shù)據(jù)就沒(méi)有問(wèn)題。

圖6

余數(shù)等于0,就一定沒(méi)有出錯(cuò)嗎?當(dāng)然不是,只能說(shuō)出錯(cuò)的概率很低。這個(gè)可靠性跟CRC的G(X)通項(xiàng)公式和信息位的長(zhǎng)度相關(guān);

怎樣選取一個(gè)適合的CRC通項(xiàng)公式呢?

CRC通項(xiàng)公式(生成多項(xiàng)式)很容易找到,網(wǎng)上隨便一搜就會(huì)有很多。

圖7(來(lái)自wikipedia)

生成多項(xiàng)式有很多表示方法,CRC3多項(xiàng)式表示法G(X)=X3+X+1;數(shù)字表示法0x3、0x6、0x5等。數(shù)字表示法簡(jiǎn)潔,在用軟件語(yǔ)言實(shí)現(xiàn)CRC算法時(shí)常用。

提醒一下:當(dāng)看到代碼poly=0x03,很難知道多項(xiàng)式是什么?因?yàn)閿?shù)字表示法沒(méi)有統(tǒng)一的定義,容易產(chǎn)生歧義。建議寫數(shù)字表示的時(shí)候附上多項(xiàng)式,這樣不會(huì)產(chǎn)生誤會(huì);程序變量poly=0x03,最好后面是注釋G(X)=X3+X+1。

下面總結(jié)一下數(shù)字表示法圖8,CRC的最高位和最低位系數(shù)都有。這些表示法無(wú)非就是順序排列丟掉高位或者低位;或者逆序排列丟掉高位或者低位。

圖8

數(shù)字表示法這樣定義是為了遵循CRC的研究者的習(xí)慣。

CRC多項(xiàng)式的檢錯(cuò)能力其實(shí)有很多研究成果,這里以koopman phail舉例,因?yàn)榭梢栽谧髡叩膫€(gè)人主頁(yè)上找到一些算好的數(shù)據(jù)。作者還是美國(guó)著名的卡內(nèi)基梅隆大學(xué)的Associate Porofesor。

在講他的成果之前,先還是給出一下一些概念。用圖6的CRC3的多項(xiàng)式 G(X)=X3+X+1編碼:

DATA=11010011101100,

CHECK SUM=100,

CODEWORD=11010011101100100。CRC3就3個(gè)校驗(yàn)位最多也就8個(gè)狀態(tài),要編碼的DATA=11010011101100有14位,總共就有2^14種可能的接受DATA,這么多的DATA肯定有很多校驗(yàn)位是相同的。

校驗(yàn)位CHECK SUM=100的DATA變成相同校驗(yàn)位但是數(shù)據(jù)不同的DATA1,在接受端是沒(méi)有辦法知道出錯(cuò)了的。所以koopman phail就把“幾乎所有的多項(xiàng)式”做了統(tǒng)計(jì),這些多項(xiàng)式隨信息位DATA的長(zhǎng)度的變化對(duì)應(yīng)CRC多項(xiàng)式的海明距HD的關(guān)系。

圖9就是論文中的一張圖,虛線表示所有CRC8多項(xiàng)式的海明距的邊界,橫坐標(biāo)表示的信息數(shù)據(jù)的長(zhǎng)度;縱坐標(biāo)表示誤碼率,誤碼率越小越好。

如果信息位是8bit以下,0x9C是比較好的多項(xiàng)式;

如果信息位是16bit到64bit之間, 0xEA和0x97都是比較好的多項(xiàng)式。

其實(shí)普通人也可以統(tǒng)計(jì)出來(lái)的,只要每個(gè)長(zhǎng)度的DATA都窮舉所有的碼字空間再把它們的海明距找到就行。但是計(jì)算過(guò)程的運(yùn)算量還是很大的,作為工程師去查koopman phail給的表就好了。如果你還是不夠用,可以去koopman phail的主頁(yè)上去找。

圖10

現(xiàn)在根據(jù)圖10的表格來(lái)選個(gè)好的多項(xiàng)式,假設(shè)CRC需要檢測(cè)2(HD=3)錯(cuò)誤,你的信息位DATA的長(zhǎng)度是256bit那就選0x167多項(xiàng)式。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)器
    +關(guān)注

    關(guān)注

    38

    文章

    7430

    瀏覽量

    163515
  • 數(shù)據(jù)傳輸
    +關(guān)注

    關(guān)注

    9

    文章

    1792

    瀏覽量

    64411
  • crc
    crc
    +關(guān)注

    關(guān)注

    0

    文章

    199

    瀏覽量

    29420

原文標(biāo)題:想知道數(shù)據(jù)傳輸?shù)恼_性?CRC算法來(lái)檢查

文章出處:【微信號(hào):icstudy,微信公眾號(hào):跟IC君一起學(xué)習(xí)集成電路】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    瑞薩RA MCU中CRC模塊的使用方法

    檢錯(cuò)功能,對(duì)數(shù)據(jù)進(jìn)行多項(xiàng)式計(jì)算,并將得到的結(jié)果附在幀的后面,接收設(shè)備也執(zhí)行類似的算法,以保證數(shù)據(jù)傳輸正確性和完整。
    的頭像 發(fā)表于 12-07 10:23 ?1912次閱讀
    瑞薩RA MCU中<b class='flag-5'>CRC</b>模塊的使用方法

    如何為STM32編程節(jié)省代碼空間?在IAR中配置CRC參數(shù)有竅門

    基于STM32芯片IAR環(huán)境下的CRC配置。STM32全系列產(chǎn)品都具有CRC外設(shè),對(duì)CRC的計(jì)算提供硬件支持,為應(yīng)用程序節(jié)省了代碼空間。CRC校驗(yàn)值可以用于
    的頭像 發(fā)表于 09-06 17:38 ?1.4w次閱讀

    CRC是什么意思

    檢錯(cuò)功能,對(duì)數(shù)據(jù)進(jìn)行多項(xiàng)式計(jì)算,并將得到的結(jié)果附在幀的后面,接收設(shè)備也執(zhí)行類似的算法,以保證數(shù)據(jù)傳輸正確性和完整。
    發(fā)表于 08-11 06:41

    如何正確實(shí)現(xiàn)EndDevice和Coordinator之間的數(shù)據(jù)傳輸?

    無(wú)法將數(shù)據(jù)從Coordinator傳輸到EndDevice。雖然模板提供了數(shù)據(jù)傳輸的功能,但它并沒(méi)有告訴我如何以及在哪里調(diào)用該功能。所以我需要你幫助告訴我如何正確實(shí)現(xiàn)EndDevice
    發(fā)表于 03-24 08:38

    數(shù)據(jù)傳輸

    通信工程叢書--數(shù)據(jù)傳輸 這資料還是不錯(cuò)的,可供參考學(xué)習(xí)哦!
    發(fā)表于 03-25 00:53 ?29次下載

    Modem數(shù)據(jù)傳輸標(biāo)準(zhǔn)

     Modem數(shù)據(jù)傳輸標(biāo)準(zhǔn) 數(shù)據(jù)傳輸標(biāo)準(zhǔn)是指MODEM的
    發(fā)表于 12-28 13:29 ?1002次閱讀

    數(shù)據(jù)傳輸速率是什么意思

    數(shù)據(jù)傳輸速率是什么意思 數(shù)據(jù)傳輸速率是通過(guò)信道每秒可傳輸的數(shù)字信息量的量度。數(shù)據(jù)傳輸速率也稱為吞吐率。數(shù)據(jù)傳輸速率由很
    發(fā)表于 03-18 14:45 ?4985次閱讀

    crc校驗(yàn)方法及示例

    檢錯(cuò)功能,對(duì)數(shù)據(jù)進(jìn)行多項(xiàng)式計(jì)算,并將得到的結(jié)果附在幀的后面,接收設(shè)備也執(zhí)行類似的算法,以保證數(shù)據(jù)傳輸正確性和完整。
    發(fā)表于 12-04 09:35 ?1.5w次閱讀
    <b class='flag-5'>crc</b>校驗(yàn)方法及示例

    crc校驗(yàn)錯(cuò)誤_crc校驗(yàn)錯(cuò)誤怎么解決

    檢錯(cuò)功能,對(duì)數(shù)據(jù)進(jìn)行多項(xiàng)式計(jì)算,并將得到的結(jié)果附在幀的后面,接收設(shè)備也執(zhí)行類似的算法,以保證數(shù)據(jù)傳輸正確性和完整。
    發(fā)表于 12-05 15:34 ?4.7w次閱讀
    <b class='flag-5'>crc</b>校驗(yàn)錯(cuò)誤_<b class='flag-5'>crc</b>校驗(yàn)錯(cuò)誤怎么解決

    關(guān)于MSP430微處理器的光無(wú)線數(shù)據(jù)傳輸系統(tǒng)

    本文介紹了一種基于MSP 430單片機(jī)的移動(dòng)對(duì)象數(shù)據(jù)傳輸系統(tǒng),它設(shè)計(jì)了一個(gè)面向?qū)ο蟮?b class='flag-5'>數(shù)據(jù)采集和接收模塊,描述了系統(tǒng)的工作過(guò)程,保證了數(shù)據(jù)正確性和高速
    發(fā)表于 04-25 09:18 ?2次下載
    關(guān)于MSP430微處理器的光無(wú)線<b class='flag-5'>數(shù)據(jù)傳輸</b>系統(tǒng)

    USB數(shù)據(jù)傳輸CRC校驗(yàn)碼的并行算法實(shí)現(xiàn)

    文章介紹了用于 USB 總線數(shù)據(jù)傳輸CRC 校驗(yàn)的原理和算法,并且采用并行電路實(shí)現(xiàn) USB2.0 中的 CRC產(chǎn)生和CRC校驗(yàn),與傳統(tǒng)的串
    發(fā)表于 03-28 09:32 ?11次下載
    USB<b class='flag-5'>數(shù)據(jù)傳輸</b>中<b class='flag-5'>CRC</b>校驗(yàn)碼的并行<b class='flag-5'>算法</b>實(shí)現(xiàn)

    傳輸時(shí)限的跨數(shù)據(jù)中心數(shù)據(jù)傳輸調(diào)度算法

    數(shù)據(jù)中心數(shù)據(jù)傳輸調(diào)度算法MSTB( Multi-source tree- Based algorithm)。在多源機(jī)制和多播轉(zhuǎn)發(fā)樹(shù)的
    發(fā)表于 05-18 16:41 ?11次下載

    單片機(jī)中幾種常見(jiàn)的校驗(yàn)算法介紹

    CRC數(shù)據(jù)通信領(lǐng)域中最常用的一種查錯(cuò)校驗(yàn)碼,其特征是信息字段和校驗(yàn)字段的長(zhǎng)度可以任意選定。循環(huán)冗余檢查CRC)是一種數(shù)據(jù)傳輸檢錯(cuò)功能,對(duì)
    發(fā)表于 06-05 14:25 ?1509次閱讀
    單片機(jī)中幾種常見(jiàn)的校驗(yàn)<b class='flag-5'>算法</b>介紹

    虹科技術(shù)|保障數(shù)據(jù)傳輸穩(wěn)定性:BabyLIN產(chǎn)品的CRC算法實(shí)現(xiàn)

    文章將以CRC8校驗(yàn)為例,介紹在BabyLIN產(chǎn)品中如何使用CRC校驗(yàn)算法。 CRC校驗(yàn)原理 在CAN報(bào)文中,增加Checksum校驗(yàn),能夠用來(lái)檢測(cè)和校驗(yàn)
    的頭像 發(fā)表于 01-02 10:45 ?446次閱讀
    虹科技術(shù)|保障<b class='flag-5'>數(shù)據(jù)傳輸</b>穩(wěn)定性:BabyLIN產(chǎn)品的<b class='flag-5'>CRC</b><b class='flag-5'>算法</b>實(shí)現(xiàn)

    虹科技術(shù) | 保障數(shù)據(jù)傳輸穩(wěn)定性:BabyLIN產(chǎn)品的CRC算法實(shí)現(xiàn)

    CRC校驗(yàn)(循環(huán)冗余校驗(yàn))是數(shù)據(jù)通訊中最常采用的校驗(yàn)方式。CAN協(xié)議中,總線通信節(jié)點(diǎn)也常采用CRC算法對(duì)各種總線傳輸
    的頭像 發(fā)表于 01-02 17:23 ?488次閱讀
    虹科技術(shù) | 保障<b class='flag-5'>數(shù)據(jù)傳輸</b>穩(wěn)定性:BabyLIN產(chǎn)品的<b class='flag-5'>CRC</b><b class='flag-5'>算法</b>實(shí)現(xiàn)