ST意法半导体
直播中

王玲

7年用户 1448经验值
私信 关注
[问答]

STM32F407上的硬件IPv4校验和不起作用怎么处理?

我正在使用标准外设库和 LwIP 1.4.1 的 STM32F407 上调试遗留应用程序,除了在极少数情况下,硬件 IPv4 校验和不起作用;他们都被发送为零。当我在 lwipopts.h 中禁用硬件校验和时,我会得到正确的校验和(但会降低性能)。该应用程序在所有其他方面都可靠地工作,我们之前忽略了校验和问题。
我的开发IDE是Keil MDK 5.36.0.0
以太网链路是 100BaseT,固定 IPv4 地址(无 DHCP),在不同的目标系统上有两个不同的 PHY 芯片(两个系统使用相同的以太网堆栈代码并表现出相同的错误)。
为此需要使用许多设置,经过多次搜索、大量阅读和多次调试会话后,我确信我已将它们全部设置为正确的设置。(我已经做到了在即将交出以太网 DMA TX 描述符时断点以太网传输,并检查当时的描述符字段和以太网寄存器。)
  • 在 lwipopts.h 中定义的 CHECKSUM_BY_HARDWARE
  • stm32f4x7_eth_conf.h 中定义的 USE_ENHANCED_DMA_DESCRIPTORS
  • 使用扩展 Tx 描述符,并使用设置为 ETH_DMATxDesc_CIC_TCPUDPICMP_Full 的 CIC 位进行初始化
  • ETH_DMAMBR EDFE 位设置为 1
  • ETH_MACCR IPCO 位设置为 1
  • 用于传输的 IPv4 以太网类型
事实上,我有一个调试会话在启用硬件计算的情况下确实返回了非零校验和,这让我怀疑我是否正确配置了寄存器和描述符,但正在发生一些微妙的干扰。我知道 IPv6 错误,但我认为它不适用于此处。
我还应该在哪里寻找造成这种情况的原因?







回帖(1)

何朝燕

2022-12-9 11:04:18
这是遗留代码做意想不到的事情的组合,以及具有意想不到的要求的硬件校验和计算。
1) LwIP 1.4.1 堆栈在 opt.h 中有一组完全独立的#defines,它们应该由 lwipopts.h 中的单个 CHECKSUM_BY_HARDWARE #define控制。例如,定义 CHECKSUM_BY_HARDWARE 将 CHECKSUM_GEN_IP 等设置为 0 以生成硬件校验和。但。有人没有在该块中与其余部分一起定义 CHECKSUM_GEN_ICMP,因此 ICMP 校验和无论如何都是在软件中生成的。可能是一个 LwIP 错误,但很难确定,而且 1.4.1 已经被取代了。
2)STM32F4以太网外设挑剔;它希望首先在要进行硬件计算的校验和字段中看到零。如果校验和字段变为零,则它会在计算正确的线路上出现。但是,如果它变为非零值,它就会以零的形式出现在电线上。
解决方案:在lwipopts.h中将 CHECKSUM_GEN_ICMP 定义为 0 可使传输的 ICMP 数据包神奇地具有正确的硬件校验和。因此,如果您希望以太网 MAC 对它们进行硬件计算,请确保首先将这些校验和字段置零。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分