binbin0317 发表于 2022-6-22 12:00

串口ISP协议中Firmware CRC的值的问题

本帖最后由 binbin0317 于 2022-6-22 17:28 编辑

目前正在使用AT32F413CBT7,调试串口ISP,对CRC有疑问。对于一片全FF的芯片,然后计算第一个sector的CRC值的时候,得出是0x5b0af1ea。但是从http://www.ip33.com/crc.html 还是自己的CRC计算程序计算出来(都是采用MPEG-2参数,而且我自己计算跟网页计算结果一致),都不是这个值。理论上全FF的计算值如下:CRC(256):7beaea80
CRC(512):63c2142
CRC(1K ):d000a3e2
CRC(2K ):1745503
CRC(4K ):af19d570发觉没有一个数对的上。以下是读取memory和获取CRC的时候,串口收发数据。究竟是哪里的问题?
tx(2):
rx(1):
tx(5):
rx(1):
tx(2):
rx(257):
tx(2):
rx(1):
tx(5):
rx(1):
tx(2):
rx(257):
tx(2):
rx(1):
tx(5):
rx(1):
tx(2):
rx(257):
tx(2):
rx(1):
tx(5):
rx(1):
tx(2):
rx(257):
tx(2):
rx(1):
tx(5):
rx(1):
tx(3):
rx(5):
read crc:Some(5b0af1ea)

后来将程序烧写进去,通过read_memory读取是正确的,而且能正常运行,但是CRC依然是错的。tx(1):
rx(1):
tx(2):
rx(1):
tx(5):
rx(1):
tx(2):
rx(8):
tx(2):
rx(1):
tx(5):
rx(1):
tx(3):
rx(5):
这里读取首扇区的CRC是0x8bb85592,但是在网络计算CRC的工具,无论用哪种CRC32参数都无法获取这个值。这是什么问题。附件带烧写入MCU的程序。

binbin0317 发表于 2022-6-22 12:05

本帖最后由 binbin0317 于 2022-6-23 09:47 编辑

最后还是自己折腾2天出来了。一般的CRC计算都是字节输入的,但是MCU内部的CRC计算是4字节输入,因此外部计算的时候只能先把数据进行4字节倒序(小端处理器),然后初值的确是0,并不是标准的MPEG-2 CRC。

albergem 发表于 2023-6-8 13:58

感谢楼主,同样问题搞了一天多!我再补充一些:
uart ISP 的Firmware CRC功能:
1、可以使用AT32内置的CRC模块计算,无需倒序,只不过需要把初始值设为0 “crc_init_data_set(0);”,其他保持默认
2、可以使用软件crc计算,需要倒序,同样初始值为0
void convert_to_big_endian(char *src, char *dst, int size)
{
    int i, j;
    for (i = 0, j = 0; i < size; i += 4, j += 4)
    {
      char temp;
      temp = src;
      temp = src;
      temp = src;
      temp = src;

      dst = temp;
      dst = temp;
      dst = temp;
      dst = temp;
    }
}

uint32_t crc32_mpeg_2_d(uint8_t *data, uint32_t length)
{
    uint8_t i;
    uint32_t crc = 0;//0xffffffff;// Initial value
    while (length--) {
      crc ^= (uint32_t)(*data++) << 24;// crc ^=(uint32_t)(*data)<<24; data++;
      for (i = 0; i < 8; ++i) {
            if (crc & 0x80000000) {
                crc = (crc << 1) ^ 0x04C11DB7;
            }
            else {
                crc <<= 1;
            }
      }
    }
    return crc ;//^ 0xFFFFFFFF;
}
页: [1]
查看完整版本: 串口ISP协议中Firmware CRC的值的问题