新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > CRC校驗(yàn)碼在單片機(jī)中的程序?qū)崿F(xiàn)及其冗余碼表的求取

        CRC校驗(yàn)碼在單片機(jī)中的程序?qū)崿F(xiàn)及其冗余碼表的求取

        作者: 時(shí)間:2012-02-15 來源:網(wǎng)絡(luò) 收藏

        4 碼的查表方法

        上面的中,每次計(jì)算一組3字節(jié)的余項(xiàng)需要進(jìn)行8次循環(huán)操作,每次循環(huán)包括2字節(jié)的數(shù)據(jù)移動(dòng),和3次異或操作。對(duì)于時(shí)間要求嚴(yán)格的 數(shù)據(jù)采樣場(chǎng)合,速度可能跟不上。這時(shí)可以把對(duì)1字節(jié)通信數(shù)據(jù)的所有取值(共256個(gè))求得碼做成一個(gè)余項(xiàng)表,用查表的方法來代替余項(xiàng)的循環(huán)求取過程。

        設(shè)一普通3字節(jié)碼為Tabc=[a b c],把它分解為一特殊的后2字節(jié)為零的3字節(jié)序列Ta00=[a 00],和一個(gè)2字節(jié)序列Tbc=[b c],可以由多項(xiàng)式表

        10.jpg

        其中Qa00為整數(shù)的商式,Ra00和Tbc都是最高次不超過15的余項(xiàng),它們的和就是Tabc(x)的余項(xiàng)。每次取信息碼的3字節(jié)序列Tabc,先查表得出其中Ta00(x)的余項(xiàng)Ra00(x),這是一個(gè)2字節(jié)的多項(xiàng)式,把它和余下的2字節(jié)序列Tbc進(jìn)行異或操作,得到新的3字節(jié)序列的高2字節(jié),然后取信息碼的下一字節(jié)附于其后構(gòu)成新的3字節(jié)序列再分解為Ta00和,循環(huán)查表計(jì)算。運(yùn)用這種方法可以很快求出多字節(jié)信息碼Mk的CRC冗余碼。

        建立16位CRC的檢驗(yàn)共需要2×256個(gè)字節(jié)。對(duì)于80C51系列的來說,存儲(chǔ)器ROM一般都有4KB以上的空間,容量上可以滿足要求。

        下面給出CRC的求取

        11.jpg

        12.jpg

        每種規(guī)則校驗(yàn)碼的最高位都為1,為編程方便,將其最高位去掉,把校驗(yàn)碼的位數(shù)湊成是一個(gè)字節(jié)的整數(shù)倍。CRC—CCITT的校驗(yàn)式為G(x)=x16+x12+x5+1,去掉高位后,校驗(yàn)碼為0001000000100001(1021H)。取一個(gè)用來比較的16位數(shù)CRC—BYTE=8000H,逐次比較信息碼的最高位是否為1,是則將1記錄在暫存單元CRC—Temp的最低位,如果是0,則低位左移入0,每次暫存單元和信息單元循環(huán)左移,相當(dāng)于把信息字節(jié)的數(shù)據(jù)逐位從左移入暫存單元中。當(dāng)暫存單元的最高位變?yōu)?,說明已移入了16位數(shù)據(jù),然后把暫存單元再左移一次,和16位校驗(yàn)碼做異或操作,也就相當(dāng)于進(jìn)行模2除。因?yàn)闀捍鎲卧灰瞥龅淖罡呶?和校驗(yàn)碼被舍去的最高位1異或,其結(jié)果必然為零,也就等于進(jìn)行了17位異或操作。把所得的余式存放在暫存單元中,接著循環(huán),直到將信息碼和補(bǔ)充在尾部的零字節(jié)都操作結(jié)束,把最后的余式復(fù)給CRC—Variable輸出,完成對(duì)一個(gè)余項(xiàng)式的處理。

        這種方法的好處是很容易對(duì)8位或者32位的校驗(yàn)式求取余項(xiàng)表進(jìn)行擴(kuò)展,只需將CRC—MODEL改為8位或32位的校驗(yàn)式模型,比較字節(jié)CRC— BYTE改為80H和800000H,追加末尾0字節(jié)LAST—BYTE改為1和4個(gè),然后再把對(duì)應(yīng)于16位數(shù)據(jù)變量CRC—Variable的 unsigned short型,改為un-signed char或unsigned long就可以了。

        13.jpg

        5 結(jié)束語

        利用CRC程序可以計(jì)算出各種標(biāo)準(zhǔn)下的CRC校驗(yàn)冗余。在容量允許的情況下,可以利用查表進(jìn)行CRC校驗(yàn)。在對(duì)時(shí)間要求不高、對(duì)存儲(chǔ)容量要求嚴(yán)格的場(chǎng)合,可以直接利用循環(huán)計(jì)算來求得余項(xiàng)。編程使用8051系列匯編語言,可以最少和高效的指令代碼。該程序算法也可應(yīng)用于 M68HC和PIC17等系列單片機(jī)上。

        參考文獻(xiàn)
        [1]Joe Campbell著.徐國(guó)定,廖衛(wèi)東譯.串行通訊C程序員指南[M].北京:清華大學(xué)出版社.1990.
        [2]韓炬.CRC算法實(shí)現(xiàn)[J].煤炭科學(xué)技術(shù),2000,(2):11-15.

        51單片機(jī)相關(guān)文章:51單片機(jī)教程


        單片機(jī)相關(guān)文章:單片機(jī)教程


        單片機(jī)相關(guān)文章:單片機(jī)視頻教程


        單片機(jī)相關(guān)文章:單片機(jī)工作原理


        數(shù)字通信相關(guān)文章:數(shù)字通信原理



        上一頁 1 2 下一頁

        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 贵州省| 大庆市| 临朐县| 灵宝市| 南部县| 古田县| 洪湖市| 新泰市| 富阳市| 专栏| 德钦县| 渭南市| 木兰县| 同心县| 宜都市| 龙胜| 上杭县| 临海市| 大庆市| 犍为县| 科技| 莆田市| 海口市| 衡水市| 滁州市| 施秉县| 武威市| 定远县| 青浦区| 开平市| 都江堰市| 石屏县| 石嘴山市| 周至县| 石泉县| 泸溪县| 舒城县| 汾阳市| 平定县| 基隆市| 美姑县|