打印

CRC计算不对,请能人指点。

[复制链接]
4384|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在进行以太网mac地址过滤配置过程,发现达不到预期效果。后面发现我计算出来的CRC值不对。

下面是stm32编程手册的截图
file:///f:/z.bmp

我用
CRC_ResetDR();
crc = CRC_CalcCRC(0X1F52419C)
crc = CRC_CalcCRC(0XB6AF0000);

结果crc=0xF92F44CB


CRC_ResetDR();
crc = CRC_CalcCRC(0X9C41521F)
crc = CRC_CalcCRC(0X0000AFB6);

结果crc = 0x60912290


CRC_ResetDR();
crc = CRC_CalcCRC(0x9c41521f);
crc = CRC_CalcCRC(0X0000afb6);  
结果crc = 0x099599C9

CRC_ResetDR();
crc = CRC_CalcCRC(0x1f52419C);
crc = CRC_CalcCRC(0X0000b6af);
结果crc = 0xC09EA72D

这些结果都与文档描述的不一致,我不知道问题出在哪里.不知哪位朋友能解答?
沙发
fangyuanshan|  楼主 | 2012-8-3 12:05 | 只看该作者
file:///f:/z.bmp

使用特权

评论回复
板凳
fangyuanshan|  楼主 | 2012-8-3 12:09 | 只看该作者
file:///f:/z.jpg

使用特权

评论回复
地板
fangyuanshan|  楼主 | 2012-8-3 12:11 | 只看该作者

使用特权

评论回复
5
fangyuanshan|  楼主 | 2012-8-7 09:56 | 只看该作者
没有朋友知道如何计算吗?

使用特权

评论回复
6
黑侠豆丁丁| | 2012-8-7 11:06 | 只看该作者
(MII接口最先接收到的字节是0x1F)
最先接收到的是0x1F。
CRC_ResetDR()
crc = CRC_CalcCRC(0x0000001F);
结果:crc=0xB35ABBB6; 转换成16进制就是1011 0011 ……
此时他的高6位是0010 1100 高位补零,发现得到CRC的高6位是0x2C

使用特权

评论回复
7
黑侠豆丁丁| | 2012-8-7 11:06 | 只看该作者
(MII接口最先接收到的字节是0x1F)
最先接收到的是0x1F。
CRC_ResetDR()
crc = CRC_CalcCRC(0x0000001F);
结果:crc=0xB35ABBB6; 转换成16进制就是1011 0011 ……
此时他的高6位是0010 1100 高位补零,发现得到CRC的高6位是0x2C

使用特权

评论回复
8
黑侠豆丁丁| | 2012-8-7 11:17 | 只看该作者
MII接口最先接收到的字节是0x1F 最先接收到的是0x1F。 CRC_ResetDR() crc = CRC_CalcCRC(0x0000001F); 结果:crc=0xB35ABBB6; 转换成16进制就是1011 0011 …… 此时他的高6位是0010 1100 高位补零,发现得到CRC的高6位是0x2C

使用特权

评论回复
9
fangyuanshan|  楼主 | 2012-8-7 11:26 | 只看该作者
CRC_CalcCRC(0x0000001F) = 0xB35ABBB6;  最高6位 = 101100 = 0x2C

图片中还有一个实例 输入0xa00a98000045,结果=0x07,依楼上计算方法,
CRC_CalcCRC(0x000000A0) = 0X362B8B75;最高6位 = 001101 = 0x0D,与实例不符。

所以楼上的计算方法不对。

使用特权

评论回复
10
黑侠豆丁丁| | 2012-8-7 11:36 | 只看该作者
:)顶,等高手指导!

使用特权

评论回复
11
黑侠豆丁丁| | 2012-8-7 13:49 | 只看该作者
https://bbs.21ic.com/viewthread.p ... ight=CRC&page=1
讨论了一大端的CRC,不知道对以上的问题有没有帮助!

我看不懂

使用特权

评论回复
12
fangyuanshan|  楼主 | 2012-8-7 14:29 | 只看该作者
那个帖子我看过,看不出对解决这个问题有帮助的地方。

使用特权

评论回复
13
fangyuanshan|  楼主 | 2012-8-9 13:41 | 只看该作者
问题没有解决呀,期待高人指点。。。。

使用特权

评论回复
14
香水城| | 2012-8-9 17:11 | 只看该作者
你贴的图不显示

你贴的文档是哪个文档里的?

另外以太网硬件自带CRC校验的,不知道你为什么要用CRC模块另外进行计算?

使用特权

评论回复
15
hsbjb| | 2012-8-9 20:40 | 只看该作者
LZ贴图的方法不对,再试试

使用特权

评论回复
16
火箭球迷| | 2012-8-9 20:49 | 只看该作者
以太网硬件好像都是自带CRC校验的

使用特权

评论回复
17
fangyuanshan|  楼主 | 2012-8-9 23:22 | 只看该作者
14# 香水城

截图在4楼已经贴出来了。

图中截图是stm32参考手册中文版10版以太网27.8.1节关于以太网MAC Hash列表高寄存器说明(第705页)

我需要使用stm32以太网的mac过滤功能,此过滤功能需要计算mac的crc校验码。由此校验码才能正确设置过滤的hash表。

从上下文来看,此crc校验码的计算应该使用的是stm32内部的crc单元来计算的,但我计算不对,也就无**确设置mac过滤功能。

使用特权

评论回复
18
香水城| | 2012-8-10 15:49 | 只看该作者
你这个应用很有借鉴意义

这不是单纯的CRC问题,这个涉及到以太网在做MAC地址的filter时,到底对地址进行了怎样的操作。

根据协议,在CRC之后,还需要对32位的数据进行reverse,然后取其高6位。所以无论你怎么做CRC,如果你不做翻转,你就不可能得到正确地址。具体需要去看协议。

目前来看,以太网的CRC模块是以字节为单位进行计算的,而CRC模块的计算单位是双字,对于6个字节怎么处理,我还没想到。

送你一段代码:
  unsigned char data[] =
  {
  0x1f, 0x52, 0x41, 0x9c, 0xb6, 0xaf
  };
  unsigned int crc_table[] =
  {
    0x4DBDF21C, 0x500AE278, 0x76D3D2D4, 0x6B64C2B0,
    0x3B61B38C, 0x26D6A3E8, 0x000F9344, 0x1DB88320,
    0xA005713C, 0xBDB26158, 0x9B6B51F4, 0x86DC4190,
    0xD6D930AC, 0xCB6E20C8, 0xEDB71064, 0xF0000000
  };

  for (n=0; n<sizeof(data); n++)
  {
    crc = (crc >> 4) ^ crc_table[(crc ^ (data[n] >> 0)) & 0x0F];  /* lower nibble */
    crc = (crc >> 4) ^ crc_table[(crc ^ (data[n] >> 4)) & 0x0F];  /* upper nibble */
  }

算出来的CRC先BIT翻转,再取其高6位,得到0x2c

使用特权

评论回复
19
fangyuanshan|  楼主 | 2012-8-10 21:38 | 只看该作者
谢香水城,
用你给的代码,计算0x1f52419cb6af 的结果是0x2c
计算0xa00a98000045的结果是0x07
与文档符合,我稍后测试是否达到预期的mac地址过滤效果。

学识有限,看不懂代码的道理,但毕竟向着解决问题迈出了一步。有空请香主讲讲代码道理。

使用特权

评论回复
20
fangyuanshan|  楼主 | 2012-8-11 10:46 | 只看该作者
谢香主,用你提供的代码,解决了问题。

使用特权

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

本版积分规则

0

主题

32

帖子

1

粉丝