在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

淺析YTM32的循環冗余校驗CRC外設模塊

冬至子 ? 來源:安德魯的設計筆記本 ? 作者:安德魯蘇 ? 2023-11-15 12:25 ? 次閱讀

引言

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

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

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

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

image.png

圖x CRC外設系統框圖

原理與機制

CRC算法簡介

CRC的全稱是循環冗余校驗(Cyclic Redundancy Check),其目的是保證數據的完整性,具體應用方法,是在發送數據的后面再補充若干位的數據,使得接收方使用同樣的CRC計算方法,檢查接收到的數據的CRC計算結果是否為0,從而判定接收數據的完整性。

CRC的核心算法,就是通過一串“發送數據”,來計算“需要補充的若干數據”。CRC的計算過程是用除法求余數。不同于十進制的除法運算,CRC用的是 2進制的除法運算 ,2進制的除法運算,屬于 模2運算 ,模2運算的特點是: 沒有進位

  • 模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加減法實際上就是異或操作,這也是CRC很容易在實際中應用的數學基礎。
  • 模2乘法:0x0=0,0x1=0,1x0=0,1x1=1。
  • 模2除法:是模2乘法的逆運算,參見下圖示例。

image.png

圖x 模2除法

通過除法算式可以形象地想見,當將一串輸入數據,再在右側補入N個空位,作為被除數,除以CRC多項式所表示的N位除數時,若不能除盡,則在除法豎式的最后一個環節,在最右邊產生一個同補入空位同位寬的余數,那這個余數就是CRC的計算結果。此處用一個例子說明CRC的計算過程。如圖x所示。

image.png

圖x CRC8計算用例

在這個算例中:

  • CRC8的多項式是x8+x2+x+1,對應的除數就是二進制數100000111
  • 被除數是0x1C,轉化成二進制就是00011100
  • CRC8為8位,被除數后面補8個0,也同時對應CRC計算的結果也是8位
  • 最后的計算結果是0x54

在CRC解算時,若將CRC計算的結果換入補充的空位,在進行CRC計算,相當于是將之前CRC計算的余數同自己相加,根據CRC計算的加法中0+0=11+1=0的規則,剛好可以得到0的計算結果,從而驗證數據在傳輸過程的完整性。

使用在線的計算器,也能算得同樣的結果。如圖x所示。

image.png

圖x 使用在線CRC計算器

細心的讀者可能看到了,這里面還有 初始值結果異或值輸入數據反轉輸出數據反轉 ,這些名詞都是指什么呢?

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

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

image.png

圖x 多種不同的CRC計算配置

從CRC算法到CRC硬件外設

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

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

image.png

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

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

應用要點(軟件)

arm-mcu-sdk軟件倉庫中,為ytm_crc_0驅動設計的樣例工程crc_basic中,設計了計算CRC-16和CRC-32的演示用例。

CRC16 用例

crc16_test用例中,實現計算數列{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計算器計算,可以得到相同的計算結果。如圖x所示。

image.png

圖x CRC在線計算器計算CRC16

這里要注意,CRC在線計算器中定義的CRC-16/CCITT是輸入數據反轉和輸出數據反轉的,而樣例代碼中指定的crc16_ccitt配置參數,實際對應CRC在線計算器的CRC-16/XMODEM計算配置。如果在樣例代碼中,設定配置參數.EnableOutputBitSwap = true.EnableInputBitSwap = true,也可以得到同CRC在線計算器定義的CRC-16/CCITT算式相同的計算結果。

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

image.png

圖x 配置CRC在線計算式使用自定義的參數模型

CRC32 用例

crc32_test用例中,實現計算數列{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計算器計算,可以得到相同的計算結果。如圖x所示。

image.png

圖x CRC在線計算器計算CRC16

總結

YTM32的CRC硬件外設模塊能夠執行CRC計算,同在線CRC計算器的結果能夠對應上。

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 微控制器
    +關注

    關注

    48

    文章

    7575

    瀏覽量

    151714
  • 驅動器
    +關注

    關注

    53

    文章

    8262

    瀏覽量

    146675
  • 編碼器
    +關注

    關注

    45

    文章

    3653

    瀏覽量

    134856
  • 寄存器
    +關注

    關注

    31

    文章

    5359

    瀏覽量

    120779
  • CRC校驗
    +關注

    關注

    0

    文章

    84

    瀏覽量

    15243
收藏 人收藏

    評論

    相關推薦

    YTM32的LIN通信協議引擎LinFlexD外設模塊詳解

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

    YTM32的增強型定時器eTMR外設模塊簡介

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

    PSoC 4 循環冗余校驗 (CRC)

    循環冗余校驗 (CRC) 組件的默認用途是根據任意長度的串行比特流計算 CRC。在數據時鐘的上升沿上對輸入數據進行采樣。在啟動前,
    發表于 07-04 11:30

    CRC循環冗余校驗的算法

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

    循環冗余校驗CRC)算法入門引導

    循環冗余校驗CRC)算法入門引導
    發表于 08-17 12:40

    如何利用循環冗余校驗CRC)計算單元進行傳輸數據的校驗

    循環冗余校驗CRC)計算單元是什么?如何利用循環冗余校驗
    發表于 12-15 06:04

    循環冗余校驗碼---CRC

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

    STM32L4循環冗余校驗模塊(CRC)介紹

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

    循環冗余校驗奇偶校驗累加和校驗等知識分享

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

    crc循環冗余校驗碼算法

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

    建立循環冗余校驗CRC校驗數據的完整性

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

    Verilog數字系統基礎設計中的循環冗余校驗

    CRC循環冗余校驗CRC介紹 臨時“插播”,后面有實例。 CRC(Cyclic Redun
    的頭像 發表于 08-17 17:08 ?6796次閱讀

    CRC循環冗余校驗簡介

    CRC 是Cyclic Redundancy Check的縮寫,循環冗余校驗,用于校驗數據傳輸的完整性。一般情況下在數據發送前計算
    的頭像 發表于 04-24 13:04 ?7145次閱讀
    <b class='flag-5'>CRC</b><b class='flag-5'>循環</b><b class='flag-5'>冗余</b><b class='flag-5'>校驗</b>簡介

    32位可編程循環冗余校驗(CRC)

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

    CRC循環冗余校驗)應用舉例

    CRC循環冗余校驗)應用舉例
    的頭像 發表于 05-16 16:12 ?1343次閱讀
    主站蜘蛛池模板: 亚洲欧美一区二区三区在线播放| 黄色免费小视频| 黄视频网站免费| 最好免费高清视频观看韩国| 91精品福利视频| 天堂网站| 奇米欧美| 久久精品人人做人人看| 亚洲成人黄色| 国产性猛交xx乱| 国产―笫一页―浮力影院xyz | 99久久精品费精品国产| 在线黄色免费观看| 天堂bt资源www在线| 欧美视频精品在线| 国产综合精品久久亚洲| 78摸在线| www色视频| 国产三级香港三级人妇| 8000av在线| 免费观看在线永久免费xx视频| 羞羞影院男女午夜爽爽影视| 视频福利网| 在线观看亚洲专3333| www.色涩涩.com| 国产综合在线观看| 好黄好硬好爽好刺激| 国产精品第页| 色多多网| 人人做人人插| 国模私拍视频在线| 午夜欧美| 天天操狠狠| 欧美黑人三级| 91精品国产亚洲爽啪在线影院| 好大好硬好爽免费视频| 国产在播放一区| 日本亚洲精品色婷婷在线影院 | 国产成人精品日本亚洲语音1| 四虎在线最新永久免费| 一级毛片 在线播放|