yu0405jie 发表于 2018-1-24 21:44:04

STM32F746以太网UDP通信提示jabber 定时器过期

本帖最后由 yu0405jie 于 2018-1-26 06:23 编辑

      在使用STM32F746 Disc开发板发送数据时,ETH_DMASR寄存器的第三位TJTS置位,按手册中的说明是“此位指示发送 jabber 定时器已过期,这意味着发送器过度有效。发送过程会中止并将其置于停止状态。这会导致对发送 jabber 超时 TDES0 标志进行置位”,但不明白造成超时的原因是什么?
      需要说明的是在实验中我没有使用LWIP库,也没有使用HAL库,问题发生在使用UDP发送数据的过程中,由于数据量比较大,我将数据量分了八片,采用环形描述符,描述符第一个缓冲区保存协议首部,第二个缓冲区包含实际数据,大小为1024字节. 我是每采集一片数据(时间大约0.6s),就对对应的描述符状态进行更新,当八片数据全部采集完成后调用发送指令(写DMA 发送轮询要求寄存器),此时会提示上述错误。

       实验中ping、arp以及UDP发送一帧数据(不分片)时都没有问题,只是当分片时会出现该问题。


斜阳__ 发表于 2018-1-25 09:35:07

帮顶         

yu0405jie 发表于 2018-1-26 06:23:16

问题找到原因了,与大家共享一下。

这个问题的原因在于自己对UDP分包和以太网DMA描述符的关系的理解上有错误。

原来认为一个UDP分了八片,对应八个描述符,那就是一个完整的帧跨越了8个描述符,因此将第一个描述符标记为第一个,第八个描述符标记为了最后一个。但实际情况是,当一个UDP包分了八片时,每一片都是一个完整的帧,也就是每一个描述符都包含一个完整的帧,都需要标记为第一个和最后一个。

这可是昨晚睡觉的时候突然想到的,哈哈:lol:lol:lol

toofree 发表于 2018-1-26 09:10:22

yu0405jie 发表于 2018-1-26 06:23
问题找到原因了,与大家共享一下。

这个问题的原因在于自己对UDP分包和以太网DMA描述符的关系的理解上有错 ...

恭喜恭喜,找到问题就好。
我也琢磨了半天,正要找个带网络的给试试呢。这下好了,你解决了,该向你学习了,也避免以后自已用时走弯路
页: [1]
查看完整版本: STM32F746以太网UDP通信提示jabber 定时器过期