打印

GD32E230的硬件CRC采用的是何种算法

[复制链接]
3945|62
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
呐咯密密|  楼主 | 2024-2-20 14:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在搞modbus,需要用到CRC16,但是用硬件CRC计算出来的结果和CRC在线计算出的结果不一致,想知道内部的硬件CRC16用的是哪个算法

使用特权

评论回复
沙发
zeshoufx| | 2024-2-20 14:52 | 只看该作者
modbus用查表法怕就行了

使用特权

评论回复
板凳
kezirong| | 2024-2-21 08:34 | 只看该作者
硬件实现的CRC16算法可能因厂家和设备而异。Modbus协议中使用的CRC16是基于多项式0x8005(或者说0xA001,根据不同的表示方法而定)。这个多项式对应的CRC算法是一个特定的位操作序列,不同的硬件实现可能会采用不同的方式来计算CRC。通常,硬件实现的CRC算法是专门设计的电路,与软件实现的算法可能有所不同。

使用特权

评论回复
地板
onlycook| | 2024-2-21 11:22 | 只看该作者
参考官方技术手册

使用特权

评论回复
5
发货后已经wi| | 2024-2-25 19:33 | 只看该作者
看看是不是硬件CRC模块的初始值与Modbus协议规定的CRC-16初始值(通常为0xFFFF)不一致导致的。。

使用特权

评论回复
6
l1uyn9b| | 2024-3-25 15:28 | 只看该作者
硬件CRC计算出来的结果与在线计算的结果不一致可能是因为硬件CRC模块使用的CRC算法与你在线计算所用的算法不同

使用特权

评论回复
7
cen9ce| | 2024-3-25 16:33 | 只看该作者
硬件CRC模块通常会使用标准的CRC算法,比如CRC-CCITT、CRC-16、CRC-32等。对于CRC-16,常见的算法包括CRC-16-CCITT、CRC-16-Modbus等

使用特权

评论回复
8
Pretext| | 2024-3-25 17:06 | 只看该作者
有可能CRC的表不同,所以导致结果不同。

使用特权

评论回复
9
鹿鼎计| | 2024-3-25 17:41 | 只看该作者
这个估计得问厂商了,内部电路是什么样得真不清楚。

使用特权

评论回复
10
y1n9an| | 2024-3-25 17:45 | 只看该作者
如果你的硬件CRC模块与在线计算的结果不一致,可以先确认你的在线计算工具使用的是哪种CRC算法,然后查阅你的硬件手册或者相关文档,确认硬件CRC模块使用的是哪种CRC算法

使用特权

评论回复
11
p0gon9y| | 2024-3-25 19:25 | 只看该作者
其实算法不一致会导致这样情况发生的,你改一下算法规则就好了

使用特权

评论回复
12
q1d0mnx| | 2024-3-26 21:39 | 只看该作者
我之前遇到过这个事情,就是同时使用硬件CRC,和软件CRC的话,计算结果不一样

使用特权

评论回复
13
问天少年| | 2024-3-28 11:45 | 只看该作者
内部的CRC不是CRC16,

使用特权

评论回复
14
wangtaohui| | 2024-7-31 22:30 | 只看该作者
它们的硬件 CRC 模块采用的是 CRC-16-CCITT 算法

使用特权

评论回复
15
小小蚂蚁举千斤| | 2024-7-31 23:23 | 只看该作者
硬件CRC进行开发比较快捷

使用特权

评论回复
16
tonykuai| | 2024-12-4 15:21 | 只看该作者
本帖最后由 tonykuai 于 2024-12-4 15:24 编辑

不知道你的问题解决了没有。我用GD32E230的硬件CRC做CRC16-MODBUS计算,结果是正确的。
硬件CRC设置:    //CRC16-MODBUS设置
    /* configure the size of polynomial */
    crc_polynomial_size_set(CRC_CTL_PS_16);   
    /* configure polynomial value */
    crc_polynomial_set(0x8005);                  
    /* configure the CRC input data reverse function */
    crc_input_data_reverse_config(CRC_INPUT_DATA_BYTE);
    crc_reverse_output_data_enable ();

使用时:
    crc_data_register_reset();
    valcrc16 = crc_block_data_calculate(UART_receiver, 2U, INPUT_FORMAT_BYTE);

  注意:计算的CRC16是高位在前,低位在后。
UART_receiver:接收数据数组
2U:计算两个字节的CRC16

使用特权

评论回复
17
alvpeg| | 2024-12-7 07:58 | 只看该作者
硬件CRC通常采用标准的CRC算法,如CRC-CCITT、CRC-16、CRC-32等。

使用特权

评论回复
18
kmzuaz| | 2024-12-7 09:04 | 只看该作者
在CRC计算中,所有的运算都是基于模2除法,这意味着加法和减法操作实际上是异或(XOR)运算。

使用特权

评论回复
19
linfelix| | 2024-12-9 10:17 | 只看该作者
RC算法的核心是使用一个预定义的生成多项式来计算校验值。

使用特权

评论回复
20
wangdezhi| | 2024-12-9 13:19 | 只看该作者
硬件CRC模块的优势在于其高速度和低资源消耗,特别适合嵌入式系统和实时应用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:苏州澜宭自动化科技嵌入式工程师
简介:本人从事磁编码器研发工作,负责开发2500线增量式磁编码器以及17位、23位绝对值式磁编码器,拥有多年嵌入式开发经验,精通STM32、GD32、N32等多种品牌单片机,熟练使用单片机各种外设。

497

主题

3881

帖子

47

粉丝