我正在使用标准外设库和 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 错误,但我认为它不适用于此处。
我还应该在哪里寻找造成这种情况的原因?