一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

N32G45x硬件CRC計(jì)算Modbus的CRC16

冬至子 ? 來(lái)源:wlof ? 作者:wlof ? 2023-10-16 15:01 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

以前都是使用軟件CRC,浪費(fèi)計(jì)算時(shí)間,有硬件CRC不用,真是可惜。本次使用硬件CRC對(duì)ModBus的CRC進(jìn)行計(jì)算,測(cè)試時(shí),遇到點(diǎn)問(wèn)題,自帶的庫(kù)文件里面,把方法寫死了,結(jié)果和Modubs的對(duì)不上。

1.jpg

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

1.jpg

自帶的crc庫(kù)也不要用了,一共沒(méi)有用到3個(gè)寄存器,直接搞。

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)然初始化時(shí)鐘是要加上的啦

RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_CRC, ENABLE);

就是這么簡(jiǎn)單,再不用擔(dān)心寫錯(cuò)CRC代碼了,肯定是算錯(cuò)了,硬件不會(huì)錯(cuò)

給它上個(gè)鎖,避免被搶占打斷后,計(jì)算出錯(cuò)。

#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)建一個(gè)動(dò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)問(wèn)題,這個(gè)數(shù)據(jù)太迷惑了,以上代碼有問(wèn)題,請(qǐng)不要使用

1.jpg

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

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)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5434

    瀏覽量

    124474
  • MODBUS
    +關(guān)注

    關(guān)注

    28

    文章

    2121

    瀏覽量

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

    關(guān)注

    0

    文章

    84

    瀏覽量

    15604
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

    modbus_rtu crc16校驗(yàn)

    最近在做modbus_rtu通訊,現(xiàn)在我剛學(xué)labvie所以沒(méi)什么頭緒,請(qǐng)大家?guī)臀蚁?,有modbu_rtu通訊的給我發(fā)給例子給我,謝謝,沒(méi)有例子的發(fā)個(gè)CRC16的校驗(yàn)例子也可以,我用官方的CRC16校驗(yàn)出來(lái)的也不對(duì),不知道為什么
    發(fā)表于 10-11 15:10

    Labview 與CRC16 教研計(jì)算示例

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

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

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

    Labview CRC16(XMODEN)程序

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

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

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

    怎樣使用Delphi去編寫Modbus RTU CRC16的校驗(yàn)碼呢

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

    CRC16計(jì)算校驗(yàn)碼的方式有哪幾種?

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

    agile_modbus遇到一個(gè)rtu主機(jī)要求crc16值要swap時(shí)如何處理呢

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

    CRYPTO中的CRC16計(jì)算結(jié)果有問(wèn)題怎么解決

    cubeMX只啟用CRC功能,其余默認(rèn)配置,編譯沒(méi)有任何問(wèn)題。調(diào)用參考官方例程,CRC32的計(jì)算結(jié)果沒(méi)問(wèn)題,嘗試CRC16CRC8,
    發(fā)表于 08-18 09:43

    crc16計(jì)算器 (計(jì)算工具)

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

    CRC16校驗(yàn)碼計(jì)算器v1.2版應(yīng)用程序免費(fèi)下載

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

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

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

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

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

    N32G45x系列用戶手冊(cè)

    N32G45x系列用戶手冊(cè)
    發(fā)表于 11-10 19:50 ?2次下載
    <b class='flag-5'>N32G45x</b>系列用戶手冊(cè)