精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

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

淺析YTM32的循環(huán)冗余校驗(yàn)CRC外設(shè)模塊

冬至子 ? 來源:安德魯?shù)脑O(shè)計(jì)筆記本 ? 作者:安德魯蘇 ? 2023-11-15 12:25 ? 次閱讀

引言

在串行通信幀中,為了保證數(shù)據(jù)在傳輸過程中的完整性,通常采用一種指定的算法對原始數(shù)據(jù)進(jìn)行計(jì)算,得出的一個(gè)校驗(yàn)值。接收方接收到數(shù)據(jù)時(shí),采用同樣的校驗(yàn)算法對原始數(shù)據(jù)進(jìn)行計(jì)算,若計(jì)算結(jié)果和接收到的 校驗(yàn)值一致 ,說明數(shù)據(jù)校驗(yàn)正確,該幀數(shù)據(jù)可用,若不一致,說明傳輸過程中出現(xiàn)了差錯(cuò),丟棄該幀數(shù)據(jù),請求重發(fā)。常用的校驗(yàn)算法有奇偶校驗(yàn)、校驗(yàn)和、CRC,還有LRC、BCC等不常用的校驗(yàn)算法。

在諸多檢錯(cuò)手段中,CRC是最著名的一種。CRC的全稱是循環(huán)冗余校驗(yàn),其特點(diǎn)是:檢錯(cuò)能力強(qiáng),開銷小,易于用編碼器檢測電路實(shí)現(xiàn)。從其檢錯(cuò)能力來看,它所不能發(fā)現(xiàn)的錯(cuò)誤的幾率僅為0.0047%以下。從性能上和開銷上考慮,均遠(yuǎn)遠(yuǎn)優(yōu)于奇偶校驗(yàn)及算術(shù)和校驗(yàn)等方式。因而,在數(shù)據(jù)存儲和數(shù)據(jù)通訊領(lǐng)域,CRC無處不在:著名的通訊協(xié)議X.25的FCS(幀檢錯(cuò)序列)采用的是CRC-CCITT,WinRAR、NERO、ARJ、LHA等壓縮工具軟件采用的是CRC32,磁盤驅(qū)動(dòng)器的讀寫采用了CRC16,通用的圖像存儲格式GIF、TIFF等也都用CRC作為檢錯(cuò)手段。

YTM32B1ME微控制器中提供了硬件的CRC計(jì)算引擎,用以加速和簡化用戶程序中的CRC運(yùn)算。值得注意的是,YTM32B1ME微控制器中還集成了SENT通信外設(shè),SENT通信協(xié)議中也用到了CRC校驗(yàn)。可以想見,在具體應(yīng)用中,CRC外設(shè)可以配合SENT外設(shè),或者其他在協(xié)議中使用CRC校驗(yàn)算法的通信過程提供硬件計(jì)算引擎的支持。

YTM32的硬件CRC外設(shè)模塊,用戶通過AHB總線向CRC外設(shè)送數(shù)參與計(jì)算,然后通過AHB總線送出實(shí)時(shí)的計(jì)算結(jié)果。CRC外設(shè)內(nèi)部實(shí)現(xiàn)了CRC4(CRC-ITU)、CRC16(CRC-CCITT)、CRC32(CRC-ethernet)等多項(xiàng)算式的計(jì)算引擎,并可配置輸出和輸出數(shù)據(jù)的位交換,通過8b、16b、32b等帶寬方式,向CRC計(jì)算引擎送數(shù)。如圖x所示。

image.png

圖x CRC外設(shè)系統(tǒng)框圖

原理與機(jī)制

CRC算法簡介

CRC的全稱是循環(huán)冗余校驗(yàn)(Cyclic Redundancy Check),其目的是保證數(shù)據(jù)的完整性,具體應(yīng)用方法,是在發(fā)送數(shù)據(jù)的后面再補(bǔ)充若干位的數(shù)據(jù),使得接收方使用同樣的CRC計(jì)算方法,檢查接收到的數(shù)據(jù)的CRC計(jì)算結(jié)果是否為0,從而判定接收數(shù)據(jù)的完整性。

CRC的核心算法,就是通過一串“發(fā)送數(shù)據(jù)”,來計(jì)算“需要補(bǔ)充的若干數(shù)據(jù)”。CRC的計(jì)算過程是用除法求余數(shù)。不同于十進(jìn)制的除法運(yùn)算,CRC用的是 2進(jìn)制的除法運(yùn)算 ,2進(jìn)制的除法運(yùn)算,屬于 模2運(yùn)算 ,模2運(yùn)算的特點(diǎn)是: 沒有進(jìn)位

  • 模2加法:0+0=0,0+1=1,1+0=1,1+1=0。
  • 模2減法:0-0=0,0-1=1,1-0=1,1-1=0。模2加減法實(shí)際上就是異或操作,這也是CRC很容易在實(shí)際中應(yīng)用的數(shù)學(xué)基礎(chǔ)。
  • 模2乘法:0x0=0,0x1=0,1x0=0,1x1=1。
  • 模2除法:是模2乘法的逆運(yùn)算,參見下圖示例。

image.png

圖x 模2除法

通過除法算式可以形象地想見,當(dāng)將一串輸入數(shù)據(jù),再在右側(cè)補(bǔ)入N個(gè)空位,作為被除數(shù),除以CRC多項(xiàng)式所表示的N位除數(shù)時(shí),若不能除盡,則在除法豎式的最后一個(gè)環(huán)節(jié),在最右邊產(chǎn)生一個(gè)同補(bǔ)入空位同位寬的余數(shù),那這個(gè)余數(shù)就是CRC的計(jì)算結(jié)果。此處用一個(gè)例子說明CRC的計(jì)算過程。如圖x所示。

image.png

圖x CRC8計(jì)算用例

在這個(gè)算例中:

  • CRC8的多項(xiàng)式是x8+x2+x+1,對應(yīng)的除數(shù)就是二進(jìn)制數(shù)100000111
  • 被除數(shù)是0x1C,轉(zhuǎn)化成二進(jìn)制就是00011100
  • CRC8為8位,被除數(shù)后面補(bǔ)8個(gè)0,也同時(shí)對應(yīng)CRC計(jì)算的結(jié)果也是8位
  • 最后的計(jì)算結(jié)果是0x54

在CRC解算時(shí),若將CRC計(jì)算的結(jié)果換入補(bǔ)充的空位,在進(jìn)行CRC計(jì)算,相當(dāng)于是將之前CRC計(jì)算的余數(shù)同自己相加,根據(jù)CRC計(jì)算的加法中0+0=11+1=0的規(guī)則,剛好可以得到0的計(jì)算結(jié)果,從而驗(yàn)證數(shù)據(jù)在傳輸過程的完整性。

使用在線的計(jì)算器,也能算得同樣的結(jié)果。如圖x所示。

image.png

圖x 使用在線CRC計(jì)算器

細(xì)心的讀者可能看到了,這里面還有 初始值結(jié)果異或值輸入數(shù)據(jù)反轉(zhuǎn)輸出數(shù)據(jù)反轉(zhuǎn) ,這些名詞都是指什么呢?

  • 初始值,是給CRC計(jì)算前提供一個(gè)初始值(Offset,預(yù)計(jì)算值),大部分情況下設(shè)定為0,也可以根據(jù)選定的特定算法指定其他值,有時(shí)也被稱為CRC計(jì)算的種子(Seed)。結(jié)果異或值,是把計(jì)算結(jié)果再異或某一個(gè)值。使用初始值和結(jié)果異或值,的目的是防止在某個(gè)計(jì)算環(huán)節(jié)中,算得全0的中間結(jié)果,導(dǎo)致后續(xù)的CRC余數(shù)一直為0。
  • 輸入數(shù)據(jù)反轉(zhuǎn),是指輸入數(shù)據(jù)以字節(jié)為單位按位逆序處理;輸出數(shù)據(jù)反轉(zhuǎn),是指CRC計(jì)算結(jié)果整體按位逆序處理;這么做的目的(一個(gè)合理的解釋)是右移比左移更容易計(jì)算,效率高,它跟大小端無關(guān)。

特別注意,最基本的計(jì)算過程大多不需要額外設(shè)定這些參數(shù)(配置成false或者0即可),但有些面向典型應(yīng)用的場景,會(huì)對應(yīng)一些特別配置組合(典型配置),產(chǎn)生了不同的算法。如圖x所示。

image.png

圖x 多種不同的CRC計(jì)算配置

從CRC算法到CRC硬件外設(shè)

示例CRC計(jì)算的過程中,使用的是1個(gè)8位的數(shù)作為被除數(shù),但實(shí)際計(jì)算數(shù)據(jù)幀的數(shù)據(jù)大多是一個(gè)數(shù)組,這個(gè)擴(kuò)展過程,可以理解為將整個(gè)數(shù)據(jù)幀的一串?dāng)?shù)據(jù)并排放在一起,當(dāng)成一個(gè)大數(shù)進(jìn)行計(jì)算。實(shí)際上,CRC的除法計(jì)算,也是一個(gè)串行移位的計(jì)算過程,可以從左邊算到右邊。在使用CRC硬件外設(shè)進(jìn)行計(jì)算時(shí),對應(yīng)可以逐個(gè)向CRC_DATA寄存器中送數(shù),CRC會(huì)使用上次計(jì)算結(jié)果和新送入的數(shù)據(jù)位,得到本次計(jì)算的結(jié)果,并繼續(xù)參與后續(xù)的計(jì)算。CRC硬件外設(shè)的CRC_DATA寄存器,支持用戶已8位、16位、32位的位寬向CRC計(jì)算引擎送數(shù)。

YTM32的硬件CRC支持三種算式:

image.png

CRC硬件外設(shè)可以配置初始值(種子,寄存器CRC_INIT),支持輸入和數(shù)據(jù)的位序反轉(zhuǎn),不支結(jié)果持異或計(jì)算,但支持結(jié)果位翻轉(zhuǎn)。通過結(jié)果寄存器CRC_RESULT可以讀取實(shí)時(shí)計(jì)算的結(jié)果。

需要注意的是,YTM32手冊上列寫的支持CRC多項(xiàng)式的名字,主要還是描述算子,硬件還是使用基本算法執(zhí)行計(jì)算。若需要使用某些具體算法配套特定的位序反轉(zhuǎn)、初始值等,還是需要用戶自行配置CRC硬件外設(shè)。

應(yīng)用要點(diǎn)(軟件)

arm-mcu-sdk軟件倉庫中,為ytm_crc_0驅(qū)動(dòng)設(shè)計(jì)的樣例工程crc_basic中,設(shè)計(jì)了計(jì)算CRC-16和CRC-32的演示用例。

CRC16 用例

crc16_test用例中,實(shí)現(xiàn)計(jì)算數(shù)列{0x1234, 0x5678, 0x5A5A, 0xA5A5}的CRC16值,有源碼如下 :

CRC_Init_Type crc16_ccitt =   
{  
    .EnableOutputBitInv = false,  
    .EnableOutputBitSwap = false,  
    .EnableInputBitSwap = false,  
    .CalcMode = CRC_CalcMode_Crc16,  
    .InitData = 0x0000  
};  
  
#define CRC_DATA_LEN  4u  
const uint16_t crc16_data_arr[CRC_DATA_LEN] = {0x1234, 0x5678, 0x5A5A, 0xA5A5};  
#define CRC16_RESULT 0x4BDCu  /* The result CRC calculator with CCITT 32 bits standard. */  
  
void crc16_test(void)  
{  
    /* setup the crc calculator. */  
 CRC_Init(BOARD_CRC_PORT, &crc16_ccitt);  
   
 for (uint32_t i = 0u; i < CRC_DATA_LEN; i++)  
 {  
     CRC_SetData16b(BOARD_CRC_PORT, crc16_data_arr[i]);  
 }  
   
 printf("crc16_test ... ");  
 if (CRC16_RESULT == CRC_GetResult(BOARD_CRC_PORT))  
 {  
  printf("succ.");  
 }  
 else  
 {  
  printf("fail.");  
 }  
 printf("rn");  
}

使用在線的CRC計(jì)算器計(jì)算,可以得到相同的計(jì)算結(jié)果。如圖x所示。

image.png

圖x CRC在線計(jì)算器計(jì)算CRC16

這里要注意,CRC在線計(jì)算器中定義的CRC-16/CCITT是輸入數(shù)據(jù)反轉(zhuǎn)和輸出數(shù)據(jù)反轉(zhuǎn)的,而樣例代碼中指定的crc16_ccitt配置參數(shù),實(shí)際對應(yīng)CRC在線計(jì)算器的CRC-16/XMODEM計(jì)算配置。如果在樣例代碼中,設(shè)定配置參數(shù).EnableOutputBitSwap = true.EnableInputBitSwap = true,也可以得到同CRC在線計(jì)算器定義的CRC-16/CCITT算式相同的計(jì)算結(jié)果。

這里顯然對算式的名字存在了誤解。開發(fā)者如果不確定各名字預(yù)設(shè)的配置,也可以使用“自定義”的參數(shù)模型,此時(shí)可人為指定各參數(shù)。如圖x所示。

image.png

圖x 配置CRC在線計(jì)算式使用自定義的參數(shù)模型

CRC32 用例

crc32_test用例中,實(shí)現(xiàn)計(jì)算數(shù)列{0x12345678, 0x56781234, 0x55AA55AA, 0xA5A5A5A5}的CRC32值,有源碼如下 :

CRC_Init_Type crc32_enet  =  
{  
    .EnableOutputBitInv = false,  
    .EnableOutputBitSwap = false,  
    .EnableInputBitSwap = false,  
    .CalcMode = CRC_CalcMode_Crc32,  
    .InitData = 0xffffffff  
};  
  
#define CRC_DATA_LEN  4u  
const uint32_t crc32_data_arr[CRC_DATA_LEN] = {0x12345678, 0x56781234, 0x55AA55AA, 0xA5A5A5A5};  
#define CRC32_RESULT   (0x57738169U) /* The result CRC calculator with CRC-32 standard. */  
  
void crc32_test(void)  
{  
    /* setup the crc calculator. */  
 CRC_Init(BOARD_CRC_PORT, &crc32_enet);  
   
 for (uint32_t i = 0u; i < CRC_DATA_LEN; i++)  
 {  
     CRC_SetData(BOARD_CRC_PORT, crc32_data_arr[i]);  
 }  
   
 printf("crc32_test ... ");  
 if (CRC32_RESULT == CRC_GetResult(BOARD_CRC_PORT))  
 {  
  printf("succ.");  
 }  
 else  
 {  
  printf("fail.");  
 }  
 printf("rn");  
}

使用在線的CRC計(jì)算器計(jì)算,可以得到相同的計(jì)算結(jié)果。如圖x所示。

image.png

圖x CRC在線計(jì)算器計(jì)算CRC16

總結(jié)

YTM32的CRC硬件外設(shè)模塊能夠執(zhí)行CRC計(jì)算,同在線CRC計(jì)算器的結(jié)果能夠?qū)?yīng)上。

YTM32的手冊中描述的CRC16-CCITTCRC32-ENET等對CRC計(jì)算典型配置的別稱,實(shí)際可不必參考。CRC硬件外設(shè)的中CRC計(jì)算引擎還是執(zhí)行基本CRC計(jì)算,典型配置實(shí)際可通過配置相關(guān)計(jì)算寄存器位的實(shí)現(xiàn),最終可以支持各種各樣的CRC典型算式。

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

    關(guān)注

    48

    文章

    7490

    瀏覽量

    151057
  • 驅(qū)動(dòng)器
    +關(guān)注

    關(guān)注

    52

    文章

    8164

    瀏覽量

    146030
  • 編碼器
    +關(guān)注

    關(guān)注

    45

    文章

    3597

    瀏覽量

    134171
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5322

    瀏覽量

    120017
  • CRC校驗(yàn)
    +關(guān)注

    關(guān)注

    0

    文章

    84

    瀏覽量

    15188
收藏 人收藏

    評論

    相關(guān)推薦

    YTM32的LIN通信協(xié)議引擎LinFlexD外設(shè)模塊詳解

    YTM32微控制器的LINFlexD外設(shè)模塊,實(shí)現(xiàn)了LIN協(xié)議控制器的功能,可以支持LIN總線協(xié)議的主機(jī)和從機(jī)功能。
    的頭像 發(fā)表于 10-08 11:15 ?1829次閱讀
    <b class='flag-5'>YTM32</b>的LIN通信協(xié)議引擎LinFlexD<b class='flag-5'>外設(shè)</b><b class='flag-5'>模塊</b>詳解

    YTM32的增強(qiáng)型定時(shí)器eTMR外設(shè)模塊簡介

    YTM32微控制器上集成的eTMR模塊,是一個(gè)定時(shí)器外設(shè),下轄多至8個(gè)通道
    的頭像 發(fā)表于 10-31 14:18 ?1131次閱讀
    <b class='flag-5'>YTM32</b>的增強(qiáng)型定時(shí)器eTMR<b class='flag-5'>外設(shè)</b><b class='flag-5'>模塊</b>簡介

    PSoC 4 循環(huán)冗余校驗(yàn) (CRC)

    循環(huán)冗余校驗(yàn) (CRC) 組件的默認(rèn)用途是根據(jù)任意長度的串行比特流計(jì)算 CRC。在數(shù)據(jù)時(shí)鐘的上升沿上對輸入數(shù)據(jù)進(jìn)行采樣。在啟動(dòng)前,
    發(fā)表于 07-04 11:30

    CRC循環(huán)冗余校驗(yàn)的算法

    想問下51單片機(jī)和所有嵌入式中一個(gè)很基本也很常見的問題,CRC循環(huán)冗余校驗(yàn)的算法中生成多項(xiàng)式為什么要那樣取(有個(gè)生成多項(xiàng)式的表格),如果信息段中一位或多位傳輸錯(cuò)誤,
    發(fā)表于 01-21 21:02

    循環(huán)冗余校驗(yàn)CRC)算法入門引導(dǎo)

    循環(huán)冗余校驗(yàn)CRC)算法入門引導(dǎo)
    發(fā)表于 08-17 12:40

    如何利用循環(huán)冗余校驗(yàn)CRC)計(jì)算單元進(jìn)行傳輸數(shù)據(jù)的校驗(yàn)

    循環(huán)冗余校驗(yàn)CRC)計(jì)算單元是什么?如何利用循環(huán)冗余校驗(yàn)
    發(fā)表于 12-15 06:04

    循環(huán)冗余校驗(yàn)碼---CRC

    循環(huán)冗余校驗(yàn)碼---CRC碼   二進(jìn)制信息位串沿一條信號線逐位在部件之間或計(jì)算機(jī)之間傳送稱為串行傳送。CRC(Cyclic Redund
    發(fā)表于 10-13 16:52 ?7158次閱讀
    <b class='flag-5'>循環(huán)</b><b class='flag-5'>冗余</b><b class='flag-5'>校驗(yàn)</b>碼---<b class='flag-5'>CRC</b>碼

    STM32L4循環(huán)冗余校驗(yàn)模塊(CRC)介紹

    STM32L4循環(huán)冗余校驗(yàn)模塊(CRC)介紹 有興趣的可以參考下
    發(fā)表于 12-25 10:38 ?27次下載

    循環(huán)冗余校驗(yàn)奇偶校驗(yàn)累加和校驗(yàn)等知識分享

    CRC校驗(yàn)循環(huán)冗余校驗(yàn))是數(shù)據(jù)通訊中最常采用的校驗(yàn)方式。在嵌入式軟件開發(fā)中,經(jīng)常要用到
    的頭像 發(fā)表于 11-08 09:31 ?8715次閱讀
    <b class='flag-5'>循環(huán)</b><b class='flag-5'>冗余</b><b class='flag-5'>校驗(yàn)</b>奇偶<b class='flag-5'>校驗(yàn)</b>累加和<b class='flag-5'>校驗(yàn)</b>等知識分享

    crc循環(huán)冗余校驗(yàn)碼算法

     循環(huán)冗余校驗(yàn)(Cyclic Redundancy Check, CRC)是一種根據(jù)網(wǎng)絡(luò)數(shù)據(jù)包或電腦文件等數(shù)據(jù)產(chǎn)生簡短固定位數(shù)校驗(yàn)碼的一種散
    發(fā)表于 12-04 10:11 ?2.3w次閱讀
    <b class='flag-5'>crc</b><b class='flag-5'>循環(huán)</b><b class='flag-5'>冗余</b><b class='flag-5'>校驗(yàn)</b>碼算法

    建立循環(huán)冗余校驗(yàn)CRC校驗(yàn)數(shù)據(jù)的完整性

    本申請報(bào)告的目的是提供幫助建立循環(huán)冗余校驗(yàn)CRC)。TI的?TMS570 RM4單片機(jī)控制器。來自德克薩斯的Hercules微控制器儀器的32位RISC微控制器的基于ARM?皮質(zhì)?
    發(fā)表于 04-17 17:09 ?12次下載
    建立<b class='flag-5'>循環(huán)</b><b class='flag-5'>冗余</b><b class='flag-5'>校驗(yàn)</b><b class='flag-5'>CRC</b><b class='flag-5'>校驗(yàn)</b>數(shù)據(jù)的完整性

    Verilog數(shù)字系統(tǒng)基礎(chǔ)設(shè)計(jì)中的循環(huán)冗余校驗(yàn)

    CRC循環(huán)冗余校驗(yàn)CRC介紹 臨時(shí)“插播”,后面有實(shí)例。 CRC(Cyclic Redun
    的頭像 發(fā)表于 08-17 17:08 ?6707次閱讀

    CRC循環(huán)冗余校驗(yàn)簡介

    CRC 是Cyclic Redundancy Check的縮寫,循環(huán)冗余校驗(yàn),用于校驗(yàn)數(shù)據(jù)傳輸?shù)耐暾浴R话闱闆r下在數(shù)據(jù)發(fā)送前計(jì)算
    的頭像 發(fā)表于 04-24 13:04 ?6815次閱讀
    <b class='flag-5'>CRC</b><b class='flag-5'>循環(huán)</b><b class='flag-5'>冗余</b><b class='flag-5'>校驗(yàn)</b>簡介

    32位可編程循環(huán)冗余校驗(yàn)(CRC)

    電子發(fā)燒友網(wǎng)站提供《32位可編程循環(huán)冗余校驗(yàn)(CRC).pdf》資料免費(fèi)下載
    發(fā)表于 09-25 11:22 ?0次下載
    32位可編程<b class='flag-5'>循環(huán)</b><b class='flag-5'>冗余</b><b class='flag-5'>校驗(yàn)</b>(<b class='flag-5'>CRC</b>)

    CRC循環(huán)冗余校驗(yàn))應(yīng)用舉例

    CRC循環(huán)冗余校驗(yàn))應(yīng)用舉例
    的頭像 發(fā)表于 05-16 16:12 ?1039次閱讀