项目场景:
用xilinx FPGA+RTL8211e 编写一套1000M UDP通讯通讯没有问题,后需求变更后变为100M,改代码后这时出现问题了。
问题描述
用chipscope和wireshark 抓取数据,发现协议、数据、和检验都没有问题,再打开网络调试助手也能收到数据。但关闭wireshark ,网络调试助手就收不到任何数据。
原因分析:
在网络上查找了一些资料,原因大致有一下几点:
1、防火墙拦截
2、网卡检验拦截,如下所示。网友建议关闭。
3、帧检验序列(FCS)
也就是我们所说的CRC32检验
解决方案:
第一步,我是按以上1,2两种方式关闭了防火墙,关闭网卡的硬件校验和功能。得到的结果是RBL,并未解决。
第二步,查CRC32结果,这下完犊子了,wireshark抓不到CRC32的校验数据。
于是只能在chipscope上抓取数据了。
CRC32校验工具,网上一搜索一大把。对比一下看看有没有问题。果然还真发现了问题。
虽然chipscope上抓取数据和在线计算的结果相同,但是,但是,发送顺数据的顺序不对。
应该先发送低八位,即将校验的结果F180FB8E 高低位颠倒顺序发送,即8E FB 80 F1
至此问题,想来问题都解决了。
但是但是。。。。。。。。。。。。。。。。。。。。。。。无语了,还是一样的问题。
第三步,那只能是发送模块的时序问题了。
只能查FPGA代码。果然优化了一下代码问题解决了。
总结:
出现wireshark打开时网络调试助手才能收到数据数据的情况,我这里主要是CRC32和发送时序的问题。我目前使用时也开启了硬件校验和功能未有任何影响。
另网上也有很多直接生成verilog hdl CRC32的代码,但是很多不能直接使用,会走很多弯路。
共勉,大家有什么问题可以留言,交流。
资源:
在线CRC计算网页:http://www.ip33.com/crc.html