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

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

3天內不再提示

N32G45x硬件CRC計算Modbus的CRC16

冬至子 ? 來源:wlof ? 作者:wlof ? 2023-10-16 15:01 ? 次閱讀

以前都是使用軟件CRC,浪費計算時間,有硬件CRC不用,真是可惜。本次使用硬件CRC對ModBus的CRC進行計算,測試時,遇到點問題,自帶的庫文件里面,把方法寫死了,結果和Modubs的對不上。

1.jpg

文檔上說的公式和modbus是一樣的,那么就有可能是初值與異或值不同造成的,先相信硬件不會出錯嘛。

1.jpg

自帶的crc庫也不要用了,一共沒有用到3個寄存器,直接搞。

uint16_t rt_hw_get_crc16_modbus(uint8_t *pdat, uint16_t len)
{
CRC->CRC16D = 0xffff; //init dat
CRC->CRC16CTRL = 0x0002; //LSB
while (len--)
{
CRC->CRC16DAT = *pdat++;
}
return (CRC->CRC16D);
}
當然初始化時鐘是要加上的啦

RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_CRC, ENABLE);

就是這么簡單,再不用擔心寫錯CRC代碼了,肯定是算錯了,硬件不會錯

給它上個鎖,避免被搶占打斷后,計算出錯。

#include
#include
#include
#include
/* 指向互斥量的指針 /
static rt_mutex_t crc_mutex = RT_NULL;
void hw_crc_init(void)
{
RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_CRC, ENABLE);
/
創(chuàng)建一個動態(tài)互斥量 */
crc_mutex = rt_mutex_create("crc_mutex", RT_IPC_FLAG_PRIO);
if (crc_mutex == RT_NULL)
{
rt_kprintf("create crc mutex failed.n");
return;
}
}
uint16_t rt_hw_get_crc16(uint8_t *pdat, uint16_t len)
{
uint16_t crc_16 = 0;
rt_mutex_take(crc_mutex, RT_WAITING_FOREVER);
/ init dat /
CRC->CRC16D = 0xffff;
/ LSB /
CRC->CRC16CTRL = 0x0002;
while (len--)
{
CRC->CRC16DAT = *pdat++;
}
crc_16 = CRC->CRC16D;
rt_mutex_release(crc_mutex);
return crc_16;
}

發(fā)現問題,這個數據太迷惑了,以上代碼有問題,請不要使用

1.jpg

終于可以正確的使用CRC硬件進行modbus的CRC16計算了.

uint16_t rt_reverse_16(uint16_t dat)
{
uint16_t x = dat;
x = (((x & 0xaaaa) >> 1) | ((x & 0x5555) << 1));
x = (((x & 0xcccc) >> 2) | ((x & 0x3333) << 2));
x = (((x & 0xf0f0) >> 4) | ((x & 0x0f0f) << 4));
return ((x >> 8) | (x << 8));
}
uint16_t rt_hw_get_crc16(const uint8_t *pdat, uint16_t len)
{
uint16_t crc_16 = 0;
rt_mutex_take(crc_mutex, RT_WAITING_FOREVER);
CRC->CRC16CTRL = CRC16_LSB | CRC16_CLR;
CRC->CRC16D = 0xFFFF;
CRC->LRC = 0;
while (len--)
{
CRC->CRC16DAT = *pdat++;
}
crc_16 = CRC->CRC16D;
rt_mutex_release(crc_mutex);
crc_16 = rt_reverse_16(crc_16);
return crc_16;
}

這么搞之后就是modbus的CRC16啦。

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

    關注

    31

    文章

    5250

    瀏覽量

    119194
  • MODBUS
    +關注

    關注

    28

    文章

    1718

    瀏覽量

    76415
  • CRC校驗
    +關注

    關注

    0

    文章

    84

    瀏覽量

    15145
收藏 人收藏

    評論

    相關推薦

    用STM32L05xCRC模塊做modbus CRC16計算,結果不正確是為什么?

    根據參考文檔,CRC模塊可以配置CRC多項式,應該可以做(Modbus)CRC16計算,自己試了一下,發(fā)現結果不正確,總是一個固定值,不知道
    發(fā)表于 04-29 06:50

    modbus_rtu crc16校驗

    最近在做modbus_rtu通訊,現在我剛學labvie所以沒什么頭緒,請大家?guī)臀蚁拢衜odbu_rtu通訊的給我發(fā)給例子給我,謝謝,沒有例子的發(fā)個CRC16的校驗例子也可以,我用官方的CRC16校驗出來的也不對,不知道為什么
    發(fā)表于 10-11 15:10

    Labview 與CRC16 教研計算示例

    Labview 與CRC16 教研計算示例
    發(fā)表于 12-16 10:36

    CRC16CRC8校驗計算,已經驗證算法正確

    本帖最后由 幸福牛寶兒 于 2016-10-31 14:33 編輯 用Labview2014做的CRC16CRC8計算,已經驗證,計算結果正確。
    發(fā)表于 10-28 12:02

    Labview CRC16(XMODEN)程序

    注意:CRC16(XMODEN)程序,進入crc16計算前要先賦初值(0xffff,或0x0000).
    發(fā)表于 09-30 16:10

    ModBus CRC16校驗碼學習筆記(附手稿)精選資料分享

    的意思是使用的Modbus CRC16校驗的方式得來的。后面需要使用程序來計算,在百度之后了解了Modbus CRC16校驗碼的
    發(fā)表于 08-30 06:28

    怎樣使用Delphi去編寫Modbus RTU CRC16的校驗碼呢

    如何使用Delphi編寫Modbus RTU CRC16的校驗碼
    發(fā)表于 09-09 07:07

    CRC16計算校驗碼的方式有哪幾種?

    CRC16計算校驗碼的方式有哪幾種?如何使用Delphi編寫Modbus RTU CRC16的校驗碼?
    發(fā)表于 11-03 07:20

    agile_modbus遇到一個rtu主機要求crc16值要swap時如何處理呢

    agile_modbus是支持多主機的,但遇到一個rtu主機要求crc16值要swap時如何處理?遇到modbus的主機要求CRC16值要SWAP時該如何處理呢?
    發(fā)表于 08-02 10:40

    CRYPTO中的CRC16計算結果有問題怎么解決

    cubeMX只啟用CRC功能,其余默認配置,編譯沒有任何問題。調用參考官方例程,CRC32的計算結果沒問題,嘗試CRC16、CRC8,
    發(fā)表于 08-18 09:43

    crc16計算器 (計算工具)

    crc16計算器 (計算工具):該計算器是開發(fā)crc校驗程序的得力助手,通過它可以驗證程序的正確性。
    發(fā)表于 12-31 10:03 ?1193次下載
    <b class='flag-5'>crc16</b><b class='flag-5'>計算</b>器 (<b class='flag-5'>計算</b>工具)

    CRC校驗源碼分析

    CRC根據權(即多項表達式)的不同而相應的源代碼也有稍許不同。以下是各種常用的權: CRA8 =X8+X5+X4+1 CRC-CCITT =X16+X12+X5+1
    發(fā)表于 04-07 20:49 ?117次下載

    CRC16校驗碼計算器v1.2版應用程序免費下載

    用于計算校驗CRC16校驗結果,軟件很好用,單片機485通訊驗證的好工具
    發(fā)表于 10-21 08:00 ?0次下載
    <b class='flag-5'>CRC16</b>校驗碼<b class='flag-5'>計算</b>器v1.2版應用程序免費下載

    ModeBusRTU調試工具CRC16版下載

    ModeBusRTU調試工具CRC16版免費下載。
    發(fā)表于 05-25 14:29 ?0次下載

    【C語言應用】使用余式表的方式計算CRC16

    【C語言應用】使用余式表的方式計算CRC16
    的頭像 發(fā)表于 08-31 13:10 ?1642次閱讀