打印
[应用相关]

AT32F407/437 在使用 EMAC 网口进行以太网数据收发时,如果出现数据丢包,应该 如何处理?

[复制链接]
1098|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jf101|  楼主 | 2023-10-9 16:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
排查解决如下:
1、检查 Ethernet PHY 的时钟源
不能使用通过 PLL 分频 25MHz/50MHz 给 Ethernet PHY 供时钟,通过 PLL 的时钟可能达不到 Ethernet
PHY 的时钟要求,导致概率出现丢包。如下介绍如何给 Ethernet PHY 供时钟。
AT32F407/437 使用 EMAC 时,根据需求需要给 Ethernet PHY 提供 25MHz/50MHz 时钟
 当需要给 Ethernet PHY 提供 25MHz 时钟时,有两种方法,如下图 1 和图 2。
 当需要给 Ethernet PHY 提供 50MHz 时钟时,如下方法图 3,建议直接给 Ethernet PHY 挂 50 晶振
注意:不能使用通过 PLL 分频 25MHzz/50MHz 给 Ethernet PHY 供时钟
选择 25MHz 晶振作为 AT32F407 外置时钟 HEXT,CLKOUT(PA8)时钟源选择 HEXT,CLKOUT 输出
25MHz 时钟作为 Ethernet PHY 的时钟源;


选择 25MHz 晶振直接作为 Ethernet PHY 时钟。


选择 50MHz 晶振直接作为 Ethernet PHY 时钟。

使用特权

评论回复
沙发
jf101|  楼主 | 2023-10-9 16:52 | 只看该作者
2、检查 EMAC 接收和发送是否存在溢出和错误A. 对于接收,检查是否有接收溢出:检查 EMAC_DMASTS 如下寄存器位是否置起:

如果发生 OVF 位置起,表示软件的处理速度太慢,不能及时读出缓冲区的数据,导致数据溢出。出现此
种情况的处理方法:
 增加接收缓冲区个数,此处会增加内存使用
#define EMAC_RXBUFNB 10 //收缓冲区个数
#define EMAC_TXBUFNB 10 //发送缓冲区个数
 提高软件处理速度
此部分可以使用提高主频(在规格范围内),优化软件加快处理流程。
B.对于发送,检查是否有发送错误,如下图是否会返回 ERROR



如果此处返回错误,是因为软件写发送缓冲区的速度太快,EMAC 来不及发送完发送缓冲区的数据,出
现此种情况时的处理方法:
 增加发送缓冲区个数,此处会增加内存使用
#define EMAC_RXBUFNB 10 //收缓冲区个数
#define EMAC_TXBUFNB 10 //发送缓冲区个数
 减慢软件写发送缓冲区的速度
如果使用 EMAC 速度是 100Mbps,理论上总线速度可以到 12.5MB/s,建议软件写缓冲区的速度不
要超过此速度,因为总线上还有其它协议开销,实际的速度会比 12.5MB/s 要低。
 发送时增加发送完成判断,以保证有足够缓冲区存放数据
如下图,每次发送完成之后判断下一个缓冲区是否发送完成,此处 timeout 可根据实际发送数据的
多少进行修改。

error_status emac_txpkt_chainmode(u16 FrameLength)
{
uint32_t timeout = 0xFFFF;
/* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
if((dma_tx_desc_to_set->status & EMAC_DMATXDESC_OWN) != (u32)RESET)
{
/* Return ERROR: OWN bit set */
return ERROR;
}
/* Setting the Frame Length: bits[12:0] */
dma_tx_desc_to_set->controlsize = (FrameLength & EMAC_DMATXDESC_TBS1);
/* Setting the last segment and first segment bits (in this case a frame is transmitted in one descriptor) */
dma_tx_desc_to_set->status |= EMAC_DMATXDESC_LS | EMAC_DMATXDESC_FS;
/* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */
dma_tx_desc_to_set->status |= EMAC_DMATXDESC_OWN;
/* When Tx Buffer unavailable flag is set: clear it and resume transmission */
if(emac_dma_flag_get(EMAC_DMA_TBU_FLAG))
{
/* Clear TBUS ETHERNET DMA flag */
emac_dma_flag_clear(EMAC_DMA_TBU_FLAG);
/* Resume DMA transmission*/
EMAC_DMA->tpd_bit.tpd = 0;
}
/* Update the ETHERNET DMA global Tx descriptor with next Tx decriptor */
/* Chained Mode */
/* Selects the next DMA Tx descriptor list for next buffer to send */
dma_tx_desc_to_set=(emac_dma_desc_type*) (dma_tx_desc_to_set->buf2nextdescaddr);
while((dma_tx_desc_to_set->status & EMAC_DMATXDESC_OWN) != (u32)RESET)
{
if((timeout --) == 0)
{
break;
}
}
/* Return SUCCESS */
return SUCCESS;
}



使用特权

评论回复
板凳
tpgf| | 2023-10-14 13:32 | 只看该作者
首先就要确定数据丢包是什么原因引起的

使用特权

评论回复
地板
paotangsan| | 2023-10-14 14:14 | 只看该作者
有可能是时钟不匹配 或者是传输速度过快

使用特权

评论回复
5
wakayi| | 2023-10-14 14:36 | 只看该作者
这个就要排查是外部芯片的问题还是单片机自己的问题了

使用特权

评论回复
6
wowu| | 2023-10-14 20:13 | 只看该作者
增大缓冲区 也并不能从根本上解决问题

使用特权

评论回复
7
renzheshengui| | 2023-10-14 20:58 | 只看该作者
这种情况下我觉得可以考虑使用双缓冲机制

使用特权

评论回复
8
heimaojingzhang| | 2023-10-14 21:39 | 只看该作者
这种丢包现象是不是具有一定的规律性 是在什么情况下发生丢包的呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

231

主题

1538

帖子

2

粉丝