RM新时代网站-首页

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

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

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

N32G45x硬件CRC計算Modbus的CRC16

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

以前都是使用軟件CRC,浪費計算時間,有硬件CRC不用,真是可惜。本次使用硬件CRC對ModBus的CRC進行計算,測試時,遇到點問題,自帶的庫文件里面,把方法寫死了,結(jié)果和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);
}
當(dāng)然初始化時鐘是要加上的啦

RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_CRC, ENABLE);

就是這么簡單,再不用擔(dān)心寫錯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ā)現(xiàn)問題,這個數(shù)據(jù)太迷惑了,以上代碼有問題,請不要使用

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啦。

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

    關(guān)注

    31

    文章

    5336

    瀏覽量

    120228
  • MODBUS
    +關(guān)注

    關(guān)注

    28

    文章

    1799

    瀏覽量

    76947
  • CRC校驗
    +關(guān)注

    關(guān)注

    0

    文章

    84

    瀏覽量

    15207
收藏 人收藏

    評論

    相關(guān)推薦

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

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

    modbus_rtu crc16校驗

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

    Labview 與CRC16 教研計算示例

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

    CRC16CRC8校驗計算,已經(jīng)驗證算法正確

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

    Labview CRC16(XMODEN)程序

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

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

    的意思是使用的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計算結(jié)果有問題怎么解決

    cubeMX只啟用CRC功能,其余默認(rèn)配置,編譯沒有任何問題。調(diào)用參考官方例程,CRC32的計算結(jié)果沒問題,嘗試CRC16CRC8,
    發(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>工具)

    CRC16校驗碼計算器v1.2版應(yīng)用程序免費下載

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

    ModeBusRTU調(diào)試工具CRC16版下載

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

    【C語言應(yīng)用】使用余式表的方式計算CRC16

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

    N32G45x系列用戶手冊

    N32G45x系列用戶手冊
    發(fā)表于 11-10 19:50 ?0次下載
    <b class='flag-5'>N32G45x</b>系列用戶手冊
    RM新时代网站-首页