【以太网芯片验证】SR8201F调试记录

本文介绍了低成本国产以太网芯片SR8201F的应用案例,包括其商业级和工业级版本的价格信息,以及在实际项目中遇到的问题和解决方法。文中还详细记录了芯片的配置要点,如上电稳定时间和寄存器配置等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

低成本的国产网络解决方案(和芯德润)SR8201F/FI:

SR8201F是100M以太网芯片(PHY)支持MII/RMII接口 立创上有购买链接和方案验证板
SR8201F是商业级 SR8201FI是工业级
SR8201F样品售价 2+RMB
电话问过和芯德润的业务经理 SR8201F-1.5+RMB SR8201FI-2.5+RMB
加上汉仁的以太网接口6+ RMB 有源晶振3+ 电容电阻忽略不计 整个方案的成本在12RMB左右(工业级)
在这里插入图片描述
官方的推荐原理图 RMII接口 其中R8 为2.49K 1%的DAC发射偏置电阻,阻值必须在2.4K-2.5K之间

在这里插入图片描述
自己设计的原理图 PINTOPIN兼容公司的MCU然后打板
在这里插入图片描述
基本与官方原理图一致 地址0x00001(后两位电阻选择);
芯片是QFN32封装;选择机贴,很遗憾没有调通;出现以下两种情况:
(1)插上网线后指示灯,但是通过MAC控制器的SMI接口读取不到寄存器内容
(2)插上网线后灯不亮,MAC控制器能读到数据显示没有link上
最后查原因是机贴的不好,板子设计的时候太随意,没有打Mark点。在嘉立创SMT选的是低成本的做法,然后立创在板子的左上角钻了一个定位孔?这个工艺也不是很了解,最后出了问题;

调不出来,只能问厂家的FAE要了一块DEMO板,通过核心板+杜邦线+模块的方式连接;最后调通了。

在这里插入图片描述
使用的公司通用驱动库 STM32F407IG+FREERTOS+LWIP 移植官方DP83848程序
通过跳线帽选择地址0x00001;
通过拨码开关分别选择RMII模式(MII) LED(WOL)模式 链接中断模式INT(POLL) TXC输出(输入)模式
这里有几个注意事项:
(1)芯片的上电等待稳定时间需要大于150ms 我程序配置3000ms
(2)寄存器0的值为0x3100为正确
(3)寄存器1需要读两次 第一次会是0x7869 没有链接 再读一次为0x786D 结果正确(链接上了)
其余的配置请自行参考芯片手册的寄存器
这里还有个问题 MODBUSTCP协议每2000000包会丢10包,怀疑是杜邦线引起的;因为TXC时钟是50MHZ。这里还是要做对插板再次测试。
感谢公司 谢工和和芯德润FAE 周工的帮助和支持!

<think>我们正在处理关于在STM32平台上使用LwIP协议栈时配置PHY芯片的问题。根据用户提供的引用,特别是引用[1]、[2]、[3]、[4],我们可以总结出配置PHY芯片的关键步骤。用户的问题集中在配置步骤和方法上,因此我们将重点放在硬件连接、寄存器配置、CubeMX设置和代码编写上。引用[1]提到了STM32通过PHY芯片实现Macraw透传,其中涉及MAC配置和以太网DMA的理解。引用[2]提到STM32PHY(物理层驱动程序)和lwIP的配置。引用[3]和[4]则分别介绍了标准库和HAL库下LWIP的移植,其中引用[4]的代码片段展示了ETH_BSP_Config函数,该函数完成了GPIO配置、MAC/DMA配置以及PHY初始化。因此,我们可以将配置过程分解为以下几个主要步骤:1.硬件连接:确保STM32的MAC接口与PHY芯片正确连接,包括RMII或MII接口的引脚连接。2.时钟配置:为MAC和PHY提供正确的时钟源。3.GPIO配置:配置与MAC和PHY通信相关的GPIO引脚(如RMII的TX、RX、REF_CLK等)。4.MAC和DMA配置:配置STM32以太网外设,包括MAC的工作模式和DMA描述符。5.PHY芯片初始化:通过SMI(管理接口)配置PHY芯片的寄存器,包括复位、自适应模式设置、中断配置等。6.中断配置(可选):配置PHY状态变化中断(如链路状态变化)以及相应的EXTI中断。7.与LwIP集成:在完成底层驱动后,初始化LwIP协议栈,并设置网络接口。我们将按照这些步骤详细说明,并参考引用中的代码示例。注意:用户提供的引用[4]中的代码片段展示了ETH_BSP_Config函数,它包含了GPIO配置、MAC/DMA配置以及PHY初始化(部分被注释)。我们将以此为基础展开。步骤详细说明:1.硬件连接:-确定PHY芯片型号(如DP83848、LAN8720等)和STM32以太网接口类型(RMII或MII)。-连接PHY芯片的复位引脚(如果需要)和中断引脚(可选)。-确保PHY的地址设置正确(通过硬件引脚设置,如PHYAD0-PHYAD4),在代码中需要用到这个地址。2.时钟配置:-STM32以太网MAC需要时钟驱动,通常使用HSE(外部高速时钟)经过PLL倍频后提供给ETH模块。-PHY芯片需要外部晶振或从STM32获取参考时钟(REF_CLK),具体取决于硬件设计。3.GPIO配置:-根据使用的接口(RMII或MII)配置对应的GPIO引脚。以RMII为例,需要配置以下引脚:REF_CLK,MDIO,MDC,TXD0,TXD1,TX_EN,RXD0,RXD1,CRS_DV-使用CubeMX可以方便地配置这些引脚为复用功能(AF11或AF9,具体取决于STM32型号)。4.MAC和DMA配置:-配置以太网MAC的工作模式(全双工/半双工,速度100M/10M)。-配置DMA描述符,用于接收和发送数据包。5.PHY芯片初始化:-通过SMI(MDIO/MDC接口)读写PHY寄存器。-步骤包括:a.复位PHY(通过写控制寄存器)。b.等待复位完成。c.配置PHY的工作模式(如自适应、强制模式等)。d.检查链路状态,等待链路建立。e.(可选)配置PHY的中断功能,如链路状态变化中断。6.中断配置:-配置PHY状态变化中断(如果使用中断方式),需要将PHY的中断引脚连接到STM32的某个GPIO,并配置该GPIO为外部中断(EXTI)。-在中断服务函数中,读取PHY的状态寄存器,判断链路状态变化,并通知LwIP。7.LwIP集成:-初始化LwIP协议栈(调用lwip_init())。-添加网络接口,将前面配置的底层驱动与LwIP连接起来。下面我们结合引用[4]中的代码片段,详细说明代码实现:引用[4]中的函数`ETH_BSP_Config`主要完成以下任务:```cvoidETH_BSP_Config(void){//配置以太网相关的GPIOETH_GPIO_Config();//配置MAC和DMAETH_MACDMA_Config();//检查初始化状态,如果失败则死循环if(EthInitStatus==0){while(1);}//以下为可选部分(配置PHY中断和EXTI中断)//Eth_Link_PHYITConfig(DP83848_PHY_ADDRESS);//配置PHY的中断//Eth_Link_EXTIConfig();//配置EXTI//配置系统定时器(用于LwIP的sys_now)//...}```我们分别展开每个步骤的代码实现(以标准库为例,但HAL库类似):步骤1:GPIO配置(ETH_GPIO_Config)-配置所有以太网相关的GPIO为复用推挽输出,并设置复用功能。步骤2:MAC和DMA配置(ETH_MACDMA_Config)-配置以太网MAC的工作模式(速度、双工模式等)。-初始化DMA描述符(发送和接收描述符环)。-使能MAC和DMA。步骤3:PHY初始化-在ETH_MACDMA_Config函数中,通常会调用PHY的初始化函数(如PHY_Init)。这个函数会通过SMI接口配置PHY芯片。步骤4:可选的中断配置-如引用[4]中注释部分,配置PHY的中断功能(链路状态变化)和EXTI中断。接下来,我们重点说明PHY芯片的配置步骤(通过SMI接口读写寄存器):1.复位PHY:-向PHY的控制寄存器(通常为0)写入0x8000(复位位)。-延时一段时间(参考PHY芯片手册,复位过程需要一定时间)。-轮询控制寄存器,直到复位完成(复位位自动清零)。2.配置PHY工作模式:-读取控制寄存器,根据需求设置自适应(Auto-negotiation)或强制模式(Forcemode)。-如果使用自适应,则启动自适应过程(设置控制寄存器的自动协商使能位,并重新启动自动协商)。-等待自适应完成(通过状态寄存器或中断)。3.配置中断(可选):-配置PHY的中断掩码寄存器(如设置链路状态变化中断使能)。-配置STM32的EXTI,将PHY的中断引脚连接到EXTI,并编写中断服务函数。4.检查链路状态:-在正常工作前,必须检查链路是否建立(读取状态寄存器的链路状态位)。下面是一个PHY初始化的示例代码(以DP83848为例):```cuint32_tPHY_Init(uint16_tPHYAddress){uint32_tstatus=0;uint16_treg;/*复位PHY*/ETH_WritePHYRegister(PHYAddress,PHY_BCR,PHY_Reset);/*等待复位完成*/do{status=ETH_ReadPHYRegister(PHYAddress,PHY_BCR,&reg);}while(status!=0||(reg&PHY_Reset));/*配置自动协商*/ETH_WritePHYRegister(PHYAddress,PHY_BCR,PHY_AutoNegotiation);/*等待自适应完成*/do{ETH_ReadPHYRegister(PHYAddress,PHY_BSR,&reg);}while(!(reg&PHY_Linked_Status));/*检查自适应结果*/ETH_ReadPHYRegister(PHYAddress,PHY_SR,&reg);if(reg&PHY_10M_FullDuplex){//10M全双工}elseif(reg&PHY_100M_FullDuplex){//100M全双工}//...其他模式returnstatus;}```注意:以上代码仅为示例,具体寄存器的定义和操作需要参考所使用的PHY芯片手册。最后,在完成PHY初始化后,我们需要将网络接口添加到LwIP中。这通常在`netif_add`函数中完成,并指定初始化函数(如ethernetif_init)和输入函数(ethernetif_input)。总结配置步骤:1.硬件连接检查。2.使用CubeMX配置(如果使用):-在Pinout中配置以太网引脚(自动配置GPIO)。-在ETH配置中设置MAC参数(速度、双工模式等)和DMA。-生成初始化代码。3.在代码中:-调用ETH_BSP_Config(或类似函数)初始化底层驱动。-初始化LwIP(lwip_init)。-添加网络接口(netif_add)并启用(netif_set_up)。-如果使用DHCP,调用dhcp_start。4.处理PHY中断(可选):-在EXTI中断服务函数中,调用处理链路状态变化的函数(如ethernetif_update_config)来通知LwIP。通过以上步骤,我们可以完成STM32上LwIP协议栈的PHY芯片配置。相关问题:1.如何调试STM32与PHY芯片的通信?2.在LwIP中如何处理PHY链路状态变化?3.如何配置多个PHY芯片(多网口)?4.不同PHY芯片(如DP83848和LAN8720)在配置上有何不同?</think>### STM32 LWIP PHY芯片配置步骤及方法 在STM32平台上使用LwIP协议栈配置PHY芯片是建立网络通信的基础,以下是详细配置步骤和方法: #### 一、硬件准备与连接 1. **物理层接口选择**: - 确认PHY芯片型号(如DP83848、LAN8720等)支持的接口类型(RMII/MII) - 连接STM32的MAC层接口到PHY芯片: - RMII接口:连接TXD[0:1], RXD[0:1], REF_CLK, CRS_DV, MDIO, MDC - 确保REF_CLK时钟源正确(50MHz,可由STM32或外部晶振提供) - 验证电源和接地:PHY芯片通常需要3.3V/2.5V/1.2V多级供电[^1] 2. **地址配置**: - 通过PHY芯片的PHYAD[0:4]引脚设置SMI地址 - 默认地址通常为0x01或0x00(参考芯片手册) #### 二、STM32CubeMX配置 1. **时钟配置**: ```c RCC_OscInitTypeDef RCC_OscInit = {0}; RCC_OscInit.PLL.PLLM = 4; RCC_OscInit.PLL.PLLN = 96; RCC_OscInit.PLL.PLLP = RCC_PLLP_DIV2; // 生成48MHz USB时钟 RCC_OscInit.PLL.PLLQ = 4; // 生成48MHz ETH时钟 HAL_RCC_OscConfig(&RCC_OscInit); ``` 2. **ETH外设配置**: - 启用ETH外设 - 选择接口类型:RMII/MII - 配置DMA描述符: - 发送描述符数量 ≥ 4 - 接收描述符数量 ≥ 4-8 - 设置自动重协商/固定速率(建议启用自适应)[^2] 3. **GPIO配置**: - 自动配置ETH相关引脚为复用模式 - 检查引脚映射:不同STM32型号ETH引脚可能不同 #### 三、PHY芯片初始化代码 ```c void PHY_Init(void) { uint32_t reg = 0; /* 复位PHY芯片 */ HAL_ETH_WritePHYRegister(&heth, PHY_ADDR, PHY_BCR, PHY_RESET); /* 等待复位完成 */ do { HAL_ETH_ReadPHYRegister(&heth, PHY_ADDR, PHY_BCR, &reg); } while(reg & PHY_RESET); /* 配置自适应模式 */ HAL_ETH_WritePHYRegister(&heth, PHY_ADDR, PHY_BCR, PHY_AUTONEGOTIATION | PHY_FULLDUPLEX_100M); /* 启动自适应过程 */ HAL_ETH_WritePHYRegister(&heth, PHY_ADDR, PHY_BCR, reg | PHY_RESTART_AUTONEGOTIATION); /* 等待链路建立 */ do { HAL_ETH_ReadPHYRegister(&heth, PHY_ADDR, PHY_BSR, &reg); } while(!(reg & PHY_LINKED_STATUS)); } ``` #### 四、LwIP集成配置 1. **网络接口注册**: ```c struct netif gnetif; ip4_addr_t ipaddr, netmask, gw; IP4_ADDR(&ipaddr, 192, 168, 1, 10); IP4_ADDR(&netmask, 255, 255, 255, 0); IP4_ADDR(&gw, 192, 168, 1, 1); netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, &tcpip_input); netif_set_default(&gnetif); netif_set_up(&gnetif); ``` 2. **DMA描述符配置**: ```c void ETH_MACDMA_Config(void) { heth.Init.MACAddr = (uint8_t *)MAC_ADDR; heth.Init.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE; heth.Init.Speed = ETH_SPEED_100M; heth.Init.DuplexMode = ETH_MODE_FULLDUPLEX; HAL_ETH_Init(&heth); } ``` #### 五、关键调试技巧 1. **PHY寄存器检查**: - 使用`HAL_ETH_ReadPHYRegister()`读取关键寄存器: - PHY_BSR(基本状态寄存器):检查链路状态 - PHY_BCR(基本控制寄存器):检查工作模式 - PHY_SR(特殊寄存器):检查实际连接速度 2. **常见问题排查**: - **无连接**:检查REF_CLK是否稳定(用示波器测量50MHz信号) - **自适应失败**:强制设置速度和双工模式 - **丢包问题**:增加DMA描述符数量或检查缓冲区对齐 - **PHY无响应**:确认SMI地址和MDIO/MDC接线 3. **中断配置(可选)**: ```c /* 配置PHY链路变化中断 */ HAL_ETH_WritePHYRegister(&heth, PHY_ADDR, PHY_INTERRUPT_CTRL, PHY_INT_ENABLE); /* 配置EXTI中断 */ __HAL_GPIO_EXTI_CLEAR_IT(ETH_LINK_GPIO_PIN); HAL_NVIC_EnableIRQ(EXTIx_IRQn); ``` #### 六、验证流程 1. **链路层测试**: - 使用`ping`命令测试基础连通性 - 查看PHY状态LED(如有) 2. **协议栈测试**: ```c // 创建TCP回显服务器验证协议栈 void tcp_echo_init(void) { struct tcp_pcb *pcb = tcp_new(); tcp_bind(pcb, IP_ADDR_ANY, 7); tcp_listen(pcb); tcp_accept(pcb, tcp_echo_accept); } ``` 3. **性能测试**: - 使用iperf测试带宽 - 通过Wireshark抓包分析协议交互 > **重要提示**:不同PHY芯片(如DP83848 vs LAN8720)的寄存器定义可能不同,务必参考具体芯片手册[^1][^4]。CubeMX生成的代码通常包含PHY检测逻辑,但需手动完善自适应处理。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值