GD32E230的硬件CRC采用的是何种算法
最近在搞modbus,需要用到CRC16,但是用硬件CRC计算出来的结果和CRC在线计算出的结果不一致,想知道内部的硬件CRC16用的是哪个算法modbus用查表法怕就行了 硬件实现的CRC16算法可能因厂家和设备而异。Modbus协议中使用的CRC16是基于多项式0x8005(或者说0xA001,根据不同的表示方法而定)。这个多项式对应的CRC算法是一个特定的位操作序列,不同的硬件实现可能会采用不同的方式来计算CRC。通常,硬件实现的CRC算法是专门设计的电路,与软件实现的算法可能有所不同。 参考官方技术手册 看看是不是硬件CRC模块的初始值与Modbus协议规定的CRC-16初始值(通常为0xFFFF)不一致导致的。。 硬件CRC计算出来的结果与在线计算的结果不一致可能是因为硬件CRC模块使用的CRC算法与你在线计算所用的算法不同 硬件CRC模块通常会使用标准的CRC算法,比如CRC-CCITT、CRC-16、CRC-32等。对于CRC-16,常见的算法包括CRC-16-CCITT、CRC-16-Modbus等 有可能CRC的表不同,所以导致结果不同。
这个估计得问厂商了,内部电路是什么样得真不清楚。
如果你的硬件CRC模块与在线计算的结果不一致,可以先确认你的在线计算工具使用的是哪种CRC算法,然后查阅你的硬件手册或者相关文档,确认硬件CRC模块使用的是哪种CRC算法 其实算法不一致会导致这样情况发生的,你改一下算法规则就好了 我之前遇到过这个事情,就是同时使用硬件CRC,和软件CRC的话,计算结果不一样
内部的CRC不是CRC16, 它们的硬件 CRC 模块采用的是 CRC-16-CCITT 算法 硬件CRC进行开发比较快捷 本帖最后由 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
硬件CRC通常采用标准的CRC算法,如CRC-CCITT、CRC-16、CRC-32等。 在CRC计算中,所有的运算都是基于模2除法,这意味着加法和减法操作实际上是异或(XOR)运算。 RC算法的核心是使用一个预定义的生成多项式来计算校验值。 硬件CRC模块的优势在于其高速度和低资源消耗,特别适合嵌入式系统和实时应用。