调试时使用的程序:https://blog.csdn.net/ZLK1214/article/details/105457370

【杜邦线(或普通电线)影响时钟信号的完整性】

笔者调试STM32F107VC单片机驱动DP83848以太网芯片时,用了两块板子。
一块是浩普电子的开发板(下面的左图),另一块是自己用面包板搭出来的(下面的右图)。

浩普电子的开发板是印制PCB板,上面采用的是RMII接口,能够调通。

但是面包板搭的那块板子,背面全是自己接的线,只能调通MII接口(25MHz时钟),无法调通RMII接口(50MHz时钟)。程序运行后,既不能发送也不能接收。但网卡的灯是正常的,网线插拔也能正常检测。

板子上的50MHz时钟由单片机的PA8 MCO产生,该时钟接到了PA1上用作RMII_REF_CLK,另外又接到了DP83848芯片的X1接口上给DP83848提供时钟。于是用示波器看一下这几个引脚的时钟波形。

PA8的时钟波形如下:

可以看到频率为50MHz,波形还算正常。

再看看DP83848 X1引脚的时钟波形:

频率仍然为50MHz,波形正常,所以DP83848能正常工作。

但是PA1处的时钟却只有25MHz,波形已经变得不规则了。单片机得不到正确的REF_CLK,因此发送和接收都无法正常进行,这就是问题的所在。

笔者后面尝试又在芯片上面又接了一根线,连接PA8和PA1,这下不但RMII不行,连MII都不能正常工作了,网口上的灯也不亮了,估计是加了一根线后,PA1和DP83848 X1的时钟信号更加不规则了。用示波器看下PA1的波形,虽然频率是49MHz,但是波形非常不规则。

笔者的RMII程序能够在两个PCB印制板上正常运行,唯独只有面包板上不能运行。

这说明,连线的质量和长短会影响高速数字信号的传输。调试DP83848网口程序时最好不要用面包板和杜邦线,尤其是长度很长的那种杜邦线。

另外,在使能了AFIO_MAPR_ETH_REMAP的情况下,使用MII接口时,PD8(ETH_RX_DV)应该接到DP83848芯片的39引脚(RX_DV)上,PA0(ETH_CRS)应该接到DP83848芯片的40引脚(CRS)上。但在使用RMII接口时,PD8(ETH_CRS_DV)应该接到DP83848芯片的40引脚(CRS_DV)上。也就是说两种模式下PD8连接的引脚是不一样的,这一点要注意。

【自动协商】

ETH->MACCR寄存器中的DM位决定了网络通信采用半双工还是全双工,FES位决定了网络通信的速度是10Mbps还是100Mbps。这两位设置的如果和实际网络环境不符,则无法通信。应该使用DP83848的自动协商(Auto Negotiation)功能获取网络环境配置,然后正确设置这两位。标准库的ETH_Init函数和HAL库的HAL_ETH_Init函数里面就包含了自动协商的代码。

寄存器操作参考代码:

// DP83848中的一些寄存器位
#define DP83848_BMCR 0x00 // Basic Mode Control Register
#define DP83848_BMCR_ANE _BV(12) // Auto-Negotiation Enable#define DP83848_BMSR 0x01 // Basic Mode Status Register
#define DP83848_BMSR_ANC _BV(5) // Auto-Negotiation Complete
#define DP83848_BMSR_LS _BV(2) // Link Status#define DP83848_PHYSTS 0x10 // PHY Status Register
#define DP83848_PHYSTS_DS _BV(2) // Duplex
#define DP83848_PHYSTS_SS _BV(1) // Speed10void eth_write_reg(uint8_t addr, uint16_t value)
{ETH->MACMIIDR = value;ETH->MACMIIAR = (1 << ETH_MACMIIAR_PA_Pos) | (addr << ETH_MACMIIAR_MR_Pos) | ETH_MACMIIAR_CR_Div42 | ETH_MACMIIAR_MW | ETH_MACMIIAR_MB;while (ETH->MACMIIAR & ETH_MACMIIAR_MB);
}uint16_t eth_read_reg(uint8_t addr)
{ETH->MACMIIAR = (1 << ETH_MACMIIAR_PA_Pos) | (addr << ETH_MACMIIAR_MR_Pos) | ETH_MACMIIAR_CR_Div42 | ETH_MACMIIAR_MB;while (ETH->MACMIIAR & ETH_MACMIIAR_MB);return ETH->MACMIIDR;
}// PHY自动协商(非常重要!!!!)
// 根据自动协商结果配置ETH_MACCR的DM(duplex mode)和FES(fast ethernet speed)位
void eth_auto_negotiation(void)
{uint16_t value;while ((eth_read_reg(DP83848_BMSR) & DP83848_BMSR_LS) == 0); // 等待网线插好value = eth_read_reg(DP83848_BMCR);if ((value & DP83848_BMCR_ANE) == 0) // 若DP83848外部接线没有接成自动协商模式eth_write_reg(DP83848_BMCR, value | DP83848_BMCR_ANE); // 则手动执行自动协商while ((eth_read_reg(DP83848_BMSR) & DP83848_BMSR_ANC) == 0); // 等待自动协商完毕// 根据自动协商结果配置MACCR寄存器value = eth_read_reg(DP83848_PHYSTS);if (value & DP83848_PHYSTS_DS)ETH->MACCR |= ETH_MACCR_DM;if ((value & DP83848_PHYSTS_SS) == 0)ETH->MACCR |= ETH_MACCR_FES;
}

【接口选择】

AFIO->MAPR的AFIO_MAPR_MII_RMII_SEL和AFIO_MAPR_ETH_REMAP这两位配置不正确,或者配置的时机不正确,都将导致网口无法收发数据包。
AFIO_MAPR_MII_RMII_SEL决定了是选择MII接口还是RMII接口。AFIO_MAPR_ETH_REMAP决定了ETH的引脚是否重映射,主要体现在接收引脚的不同:到底是用PB和PC口来接收数据,还是用PD口来接收数据。
进行AFIO配置前一定要确保AFIO的时钟是打开了的:RCC->APB2ENR |= RCC_APB2ENR_AFIOEN

如果要使用RMII接口,则必须在ETH的时钟打开之前配置好,否则配置是无法生效的,进而导致网口无法收发数据包!!
__HAL_RCC_AFIO_CLK_ENABLE();
__HAL_AFIO_ETH_RMII();
上面这两句话必须在下面三句话之前执行,否则不能生效。
__HAL_RCC_ETHMAC_CLK_ENABLE();
__HAL_RCC_ETHMACRX_CLK_ENABLE();
__HAL_RCC_ETHMACTX_CLK_ENABLE();
所以说,heth.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII这句话根本不起作用,执行HAL_ETH_Init函数的时候,ETH的时钟已经打开了,所以根本没有办法将MII变成RMII,后面网卡也就无法收发数据包了!

另外,ETH的三个时钟必须全部开启。必须在RCC中同时打开ETH的三个RCC时钟,哪怕只想发送数据,也必须打开MACRX的时钟。

【MCO引脚产生错误频率的时钟】

使用MII接口时,MCO应该给DP83848提供25MHz的时钟。使用RMII接口时应该提供50MHz的时钟。因此两种模式下,PLL3应该使用不同的分频系数。

MII接口:HAL_RCC_MCOConfig(RCC_MCO, RCC_MCO1SOURCE_PLL3CLK_DIV2, RCC_MCODIV_1);
RMII接口:HAL_RCC_MCOConfig(RCC_MCO, RCC_MCO1SOURCE_PLL3CLK, RCC_MCODIV_1);

【用库接收数据包】

在HAL库中,通过判断ETH_DMA_FLAG_R标志位判断是否有新数据包到来,用HAL_ETH_GetReceivedFrame函数接收数据包。

if (__HAL_ETH_DMA_GET_FLAG(&heth, ETH_DMA_FLAG_R) != RESET)
{__HAL_ETH_DMA_CLEAR_FLAG(&heth, ETH_DMA_FLAG_R);while (HAL_ETH_GetReceivedFrame(&heth) == HAL_OK)ethernetif_input(&netif_dp83848);
}

接收完每个数据包后一定要自己将该数据包涉及到的所有接收描述符还给DMA(将OWN位置位),然后把SegCount成员清零。最后检查一下RBU标志位,检查是否出现了接收缓冲区不够用的问题,如果因接收缓冲区不够用而导致接收停止,应将DMARPDR寄存器写0恢复接收(这个操作,HAL库里面没有封装成宏或函数,所以只能直接写寄存器完成)。下面这段示例代码是在ethernetif_input里面执行的。

(lwip 2.0.3版本中的ethernetif.c文件位于lwip-2.0.3.zip压缩包的src/netif文件夹下。而lwip 2.1.0~2.1.2版本中的ethernetif.c文件则被移动到了contrib-2.1.0.zip压缩包的examples/ethernetif文件夹里面了, 里面有一些细微的修改)

// 确认收到数据
desc = heth.RxFrameInfos.FSRxDesc;
for (i = 0; i < heth.RxFrameInfos.SegCount; i++)
{desc->Status |= ETH_DMARXDESC_OWN;desc = (ETH_DMADescTypeDef *)(desc->Buffer2NextDescAddr);
}
heth.RxFrameInfos.SegCount = 0;if (__HAL_ETH_DMA_GET_FLAG(&heth, ETH_DMA_FLAG_RBU) != RESET)
{printf("Receive buffer unavailable!\n");__HAL_ETH_DMA_CLEAR_FLAG(&heth, ETH_DMA_FLAG_RBU);WRITE_REG(heth.Instance->DMARPDR, 0);
}

将SegCount清零的操作非常重要。因为HAL库的HAL_ETH_GetReceivedFrame函数有一个bug,如果某个接收描述符的FS(First Segment)和LS(Last Segment)位不同时为1,程序能正常处理。但是如果同时为1,那么SegCount就会一直增加而不能回到0。这里将SegCount清零,就是为了避免这个bug带来的影响。实际上,标准外设库(SPL)里面也有类似的问题。

【ETH缓冲区只支持SRAM不支持Flash】

以太网外设的DMA是专用DMA,与其他外设所用的DMA1和DMA2没有关系。在lwip协议栈中如果遇到q->payload指向Flash区域(地址为0x08000000~0x08ffffff)的情况,必须把数据复制到SRAM中(地址为0x20000000~0x2fffffff),否则帧肯定会发送失败。

【关于网口的灯】

最后再说明一下,网口的黄灯应该接的是DP83848的LED_ACT(26脚),绿灯应该接LED_LINK(28脚)。正常情况下是插入网线后绿灯亮,拔掉网线后绿灯灭,网线有数据传输时黄灯闪烁,不要把灯接错了。微雪的DP83848模块就是把灯接错了。

【选择50MH RMII接口,PCB能否用自动布线】

最近,笔者用Altium Designer做了一个107VC的ETH板子,布线时偷懒选择了自动布线,板子能否正常工作呢?
板子回来后,笔者调试时遇到了两个问题,最后发现犯的都是低级错误。。
(问题1)板子插一根网线到电脑的有线网口上,板上网口的灯不亮。示波器检查单片机的PA1(ETH_RMII_REF_CLK)和PA8(MCO)引脚,能看到有50MHz的时钟信号。再检查DP83848的34脚(X1),也有50MHz的时钟,且波形正常,排除了时钟完整性的问题。ST-Link调试程序,读PHY寄存器也能读到值,看到寄存器里面连接状态为未连接。重新插了一下网线,碰了一下,灯亮了!绿灯常亮,黄灯闪烁。原来是笔记本的网口那里松动了,接触不良。
(问题2)串口看到接收正常了,但是怎么也获取不到IP地址,判断是网口接收正常但发送不正常,数据没发出去。而且,串口里面看不到DP83848中断(正常情况下插了网线复位后一定会触发一次中断)。
用万用表量了一下,单片机和DP83848之间,TX_EN和TXD0是通的,但TXD1和INT引脚却不通!拿一块没有焊过的板子,量一下,引脚间是通的,PCB没问题。这说明LQFP芯片上引脚虚焊了。

是单片机的52脚和53脚虚焊了。重新焊,发现这里松香都没有擦干净,还残留有大量的松香,引脚根本就没有和焊盘接触。。。低级错误!
重新焊一下,再用刀头烙铁+松香吸锡,洗板水擦一下。万用表一测,这下终于连通了。上电测试,网口正常通信,ping通了,http服务器也能连上。

这说明,只要芯片离的近,PCB用自动布线,50MHz的RMII接口也是能跑起来的。

【经验分享】调试STM32F107VC单片机驱动DP83848以太网PHY芯片时遇到的问题相关推荐

  1. 【MCU】STM32F107VC单片机驱动DP83848以太网PHY芯片,移植LWIP 2.1.2协议栈,并加入网线热插拔检测的功能(HAL库)

    开发板: 杜邦线传输高速数字信号容易出错,所以在用面包板搭建开发环境时,最好使用25MHz时钟的MII接口.如果要用50MHz的RMII接口,那么杜邦线必须要非常非常短,否则时钟信号一旦失真,就无法收 ...

  2. 【程序】STM32H743ZI单片机驱动DP83848以太网PHY芯片,移植lwip 2.1.3协议栈,并加入网线热插拔检测的功能

    STM32H7的ETH HAL库封装得比较好,真正做到了完全用HAL API函数操作,不需要再用寄存器操作. 而STM32F1的ETH HAL库就没有完全封装,有些操作必须要用寄存器完成,而且还需要单 ...

  3. 千兆以太网PHY芯片调试-88E1111(RGMII接口-数据收发ECHO测试) Verilog实现python测试

    千兆以太网PHY芯片调试-基于RGMII接口的88E1111(数据收发ECHO测试) 先放结果: Py测试代码: import socket #网络通信 TCP,UDP DST_IP = '192.1 ...

  4. 【硬件】以太网PHY芯片有三个时钟说明

    硬件以太网PHY芯片有三个时钟,对此进行了梳理: PHY芯片时钟的选择: PHY芯片中有3个时钟, Gtx_clk,Rx_clk ,Tx_clk. 1) GTX_CLK仅使用在GMII模式下,时钟频率 ...

  5. 千兆以太网PHY芯片选型简要推荐

    Hqst盈盛电子导读:千兆以太网PHY芯片选型简要推荐 千兆以太网PHY芯片选型简要推荐 以太网芯片市场规模庞大,而且比较稳固,但该市场每隔几年就会出现一次重大技术转变.该产业目前处于从快速以太网(F ...

  6. DM9119NX 千兆以太网PHY芯片 应用

    DM9119NX 千兆以太网PHY芯片介绍 功能 集成10/100/1000Mbps以太网收发器 符合IEEE 802.3.IEEE 802.3u和IEEE 802.3ab 支持IEEE P802.3 ...

  7. Arduino机器人快速上手经验分享(L298N马达驱动,摇杆模块)

    Bill of Material: 直流马达(<9V, 2A) x2, 底盘 x1,9V电池 x1, 电池扣 x1, 摇杆模块 x1, L298N 马达驱动模块 x1, Arduino Uno ...

  8. 【ETH】以太网----PHY芯片LAN8720A----电路原理图

    一.LAN8720A----简介 LAN8720A 是低功耗的 10/100M 以太网 PHY 层芯片,I/0 引脚电压符合EEE802.3-2005 标准,支持通过 RMI 接口与以太网 MAC 层 ...

  9. 路由器开发相关知识总结 —— 以太网PHY芯片

    一.网卡的主要特点 1.基础知识 网卡(Network Interface Card,简称NIC),也称网络适配器,是电脑与局域网相互连接的设备.无论是普通电脑还是高端服务器,只要连接到局域网,就都需 ...

最新文章

  1. 百年 IBM 终于 All In 人工智能和混合云
  2. 浅析网站页面加载速度如何提升?
  3. javascript 模式学习篇---基础
  4. mysql远程无法登陆_无法远程登陆MySQL数据库几种解决办法
  5. Mass对象类型介绍
  6. java socket 通讯
  7. 12306订票助手更新
  8. 判断字段长度大于某长度_判断数据库性能只能通过count(*)?No,这些优化方案了解一下!...
  9. 数据集标签_数据分享 | LiDAR点云数据汇总
  10. rtthread qspi w25q256
  11. sqlserver2012下载地址
  12. 天正的计算机快捷命令大全,新手必看-史上最全CAD快捷键大全
  13. vim和emac体验
  14. 【web实战-业务逻辑】评论点赞逻辑
  15. [AV1] DC Intra Prediction
  16. xshell4连接ubuntu,报错No matching outgoing encryption
  17. efm8bb1 烧录器_EFM8BB1LCK全功能、低成本8位MCU套件开箱评测
  18. css表格nth左对齐,使用CSS nth-child选择单个表格单元格
  19. matlab启发式算法实例_网页设计中的30个启发性插图实例
  20. 高考改革后计算机老师,高考改革后 技术教师缺口很大

热门文章

  1. 伍鸣博士受邀出席徐汇区住房租赁市场研讨会
  2. 【APPInventor\腾讯云】使用APPInventor开发连接腾讯云的安卓物联网遥控APP
  3. android getpixel函数,关于Graphics.Blit函数在android上的巨坑
  4. 计算机网络的 89 个核心概念【转自微信公众号Linux爱好者】
  5. 尝试“Android应用图标微技巧,8.0系统中应用图标的适配”
  6. 论文笔记5:Noise Reduction of Hyperspectral Imagery Using Hybrid Spatial-Spectral Derivative-Domain Wavel
  7. API 接口应该如何设计?如何保证安全?如何签名?如何防重?
  8. Dlink DIR-615L 和水星(mercury) MW300R桥接方法!
  9. 四十七、Fluent近壁面处理
  10. 齐次式的相关知识【初级中阶辅导】