[STM32F2] STM32F207+DP83848 如何实现以太网硬件流控?

[复制链接]
 楼主| sjyf 发表于 2015-11-5 12:44 | 显示全部楼层 |阅读模式
在我的应用中,我用UDP传送数据,STM32+DP83848采用UDP接收,如果PC端全速传送一个文件,STM32处理比较慢,会存在丢数据的情况。

我看STM32存在硬件流控设置,于是我就使能了硬件流控,但是流控并没有起作用。

请问,有没有这方面的例子,或者有经验的朋友,指点一下。谢谢。
myxiaonia 发表于 2015-11-5 15:02 | 显示全部楼层
硬件流控是为以太网dma接收设计的,就算流控起效了

你的应用层也必须加软件组包和拆包,只有这样做才是可靠的,否则就算硬件流控起效了程序健壮性也不好,这样的代码如果有代码审查的话是不可能通过审查的
 楼主| sjyf 发表于 2015-11-5 15:29 | 显示全部楼层
@myxiaonia
硬件流控不可靠吗?当MAC的FIFO满的时候,发送PAUSE帧,使发送方,暂停发送数据帧,以缓解接收方的压力,灯接收方的FIFO有空闲的时候,发送方再发送。既然硬件这样做了,软件就省些心。这样不好吗。组包和拆包,是在哪一层做的?又为什么要这么做呢?  谢谢。
 楼主| sjyf 发表于 2015-11-6 08:20 | 显示全部楼层
帖子要沉了,看来大家都不太关注这一块啊.
fangyuanshan 发表于 2015-11-6 09:32 | 显示全部楼层
楼主这样的应用,最好用tcp传输文件;用udp当然也可以,但应该在程序中处理丢帧重传的问题。cpu提供的硬件流控我没怎么了解,但凭我对网络传输的了解,你说的硬件流控不会帮你解决文件传输稳定性问题。
 楼主| sjyf 发表于 2015-11-6 10:40 | 显示全部楼层
我的测试用PC来做的,实际情况是我要链接到其他人的设备上,我不知道它会以何种速度发送数据,而且数据是单向的,只管发,我的设备只是接收。这个协议估计是改不了了。 所以我只能最大限度的保证不丢数据。所以才想将硬件流控用起来。
 楼主| sjyf 发表于 2015-11-6 11:06 | 显示全部楼层
期待各个大侠,高手,出谋划策。
myxiaonia 发表于 2015-11-6 12:47 | 显示全部楼层
sjyf 发表于 2015-11-6 10:40
我的测试用PC来做的,实际情况是我要链接到其他人的设备上,我不知道它会以何种速度发送数据,而且数据是单 ...

看你这么说  怎么和串口透传差不多啊  透传模块稳定性肯定不怎么高的  因为协议就没保证

你说的问题还真的只能用硬件流控想办法了    我也没怎么注意过这个流控  当时看手册记得是mac层上和dma接收相关的  具体我也说不上来了
 楼主| sjyf 发表于 2015-11-6 13:08 | 显示全部楼层
对的确实是透传,收到之后转发给另外一个设备。
mac里面有Rx FIFO,DMA有接收缓冲区,程序设置是当RxFIFO收到完整一帧数据时,启动DMA读取FIFO,之后应用程序再做处理,设置  
ETH_InitStructure.ETH_FlushReceivedFrame = ETH_FlushReceivedFrame_Disable;
使得DMA缓冲区有完之后进入休眠状态,而不丢弃FIFO中的内容。从而造成FIFO变满,触发MAC发送pause帧。我是一样人为地,但是这样一直不能产生pause帧。我也没有什么方法,确定RXFIFO变满过。

我通过手动设置ETH_DMAFCR寄存器中的bit0,能够手动发送一个pause帧,而且抓包工具也确实抓到了pause帧。但是好像没有效果。

真心不知道怎么回事了。

这个话题好像有点偏,大家都不这么用。通过datasheet也不知道怎么确定FIFO满。真实愁人哎。

 楼主| sjyf 发表于 2015-11-9 08:25 | 显示全部楼层
xiwh 发表于 2020-7-24 12:07 | 显示全部楼层
我现在也碰到了这个问题,我用的是STM32F407,手动设置ETH_DMAFCR寄存器的FCB位能产生一个psuse帧,对其他设备也能起到暂停效果,但就是没有在Rx FIFO满的时候发出pause帧,也不能确定Rx FIFO到底有没有满,请问楼主后面是怎么解决这个问题的?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

2

主题

10

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部