0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取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);
/
创建一个动态互斥量 */
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;
}

发现问题,这个数据太迷惑了,以上代码有问题,请不要使用

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117721
  • MODBUS
    +关注

    关注

    27

    文章

    1437

    浏览量

    75691
  • CRC校验
    +关注

    关注

    0

    文章

    81

    浏览量

    15030
收藏 人收藏

    评论

    相关推荐

    modbus_rtu crc16校验

    最近在做modbus_rtu通讯,现在我刚学labvie所以没什么头绪,请大家帮我下,有modbu_rtu通讯的给我发给例子给我,谢谢,没有例子的发个CRC16的校验例子也可以,我用官方的CRC16校验出来的也不对,不知道为什么
    发表于 10-11 15:10

    Labview 与CRC16 教研计算示例

    Labview 与CRC16 教研计算示例
    发表于 12-16 10:36

    CRC16CRC8校验计算,已经验证算法正确

    本帖最后由 幸福牛宝儿 于 2016-10-31 14:33 编辑 用Labview2014做的CRC16CRC8计算,已经验证,计算结果正确。
    发表于 10-28 12:02

    ADSP SHARC函数不能生成正确的CRC16

    ) {crcregister = (crc16 >> 8) & 0x000000FF;crc16 = (crc16
    发表于 03-01 14:33

    Labview CRC16(XMODEN)程序

    注意:CRC16(XMODEN)程序,进入crc16计算前要先赋初值(0xffff,或0x0000).
    发表于 09-30 16:10

    CRC-16/Modbus校验计算

    CRC-16/Modbus校验计算输入进制字符串,输出校验计算
    发表于 09-11 14:44

    ModBus CRC16校验码学习笔记(附手稿)精选资料分享

    的意思是使用的Modbus CRC16校验的方式得来的。后面需要使用程序来计算,在百度之后了解了Modbus CRC16校验码的
    发表于 08-30 06:28

    怎样使用Delphi去编写Modbus RTU CRC16的校验码呢

    如何使用Delphi编写Modbus RTU CRC16的校验码
    发表于 09-09 07:07

    CRC16计算校验码的方式有哪几种?

    CRC16计算校验码的方式有哪几种?如何使用Delphi编写Modbus RTU CRC16的校验码?
    发表于 11-03 07:20

    agile_modbus遇到一个rtu主机要求crc16值要swap时如何处理呢

    agile_modbus是支持多主机的,但遇到一个rtu主机要求crc16值要swap时如何处理?遇到modbus的主机要求CRC16值要SWAP时该如何处理呢?
    发表于 08-02 10:40

    CRYPTO中的CRC16计算结果有问题怎么解决

    cubeMX只启用CRC功能,其余默认配置,编译没有任何问题。调用参考官方例程,CRC32的计算结果没问题,尝试CRC16CRC8,
    发表于 08-18 09:43

    crc16计算器 (计算工具)

    crc16计算器 (计算工具):该计算器是开发crc校验程序的得力助手,通过它可以验证程序的正确性。
    发表于 12-31 10:03 1191次下载
    <b class='flag-5'>crc16</b><b class='flag-5'>计算</b>器 (<b class='flag-5'>计算</b>工具)

    CRC16校验码计算器v1.2版应用程序免费下载

    用于计算校验CRC16校验结果,软件很好用,单片机485通讯验证的好工具
    发表于 10-21 08:00 0次下载
    <b class='flag-5'>CRC16</b>校验码<b class='flag-5'>计算</b>器v1.2版应用程序免费下载

    ModeBusRTU调试工具CRC16版下载

    ModeBusRTU调试工具CRC16版免费下载。
    发表于 05-25 14:29 0次下载

    【C语言应用】使用余式表的方式计算CRC16

    【C语言应用】使用余式表的方式计算CRC16
    的头像 发表于 08-31 13:10 1292次阅读