LAN8671 10BASE-T1S STM32F407 RMII LwIP 测试笔记

张开发
2026/4/20 0:36:11 15 分钟阅读

分享文章

LAN8671 10BASE-T1S STM32F407 RMII LwIP 测试笔记
文章目录LAN8671 简介LAN8671 原理图与 STM32F407 的接线Github 工程的使用测试PINGMAC 地址UDP EchoIPERF部分代码说明Github 链接LAN8671 简介前篇介绍了SPI接口的 10BASE-T1S LAN8651, 本篇是 RMII 接口的 LAN8671:测试的是 LAN8671C2-E/U3B24-pin VQFN, -40ºC to 125ºC, 单3.3V供电内置 1.8V 稳压器RMII 接口, 需要 50MHz 外部参考时钟, 可以用有源晶振或者 MCU 的 MCO 引脚提供, 本篇用的是STM32F407 的 MCO2(PC9) 输出 50MHz 同时供给 PHY 和 ETH_REF_CLK(PA1)管理接口 SMI (MDIO/MDC)最高 4 MHz兼容 IEEE 802.3 Clause 22/45 寄存器访问电源域:VDDA模拟电源(睡眠可关断)VDDPIO 电源(睡眠可关断)VDDAU持续供电(睡眠期维持唤醒电路)复位:上电复位 (POR)约 2 ms自动加载配置 strap外部复位RESET_N 引脚拉低≥5 μs软件复位寄存器触发不重载配置 strap初始化流程: 复位解除 → 内部初始化≈7 μs→ IRQ_N 提示就绪 → SMI 寄存器配置PHYAD[3:0] 可配置16个地址LAN8671 原理图上面绿色小板子的参考原理图:供电是单 3.3V 供电PHY 地址直接设成 0不使用的引脚:INH, 悬空WAKE_IN, 接地WAKE_OUT, 悬空GPIO0, 悬空与 STM32F407 的接线除了 3V3 GND 电源引脚, 连接了以下信号:信号STM32F407 引脚方向说明ETH_REF_CLK (CLK50M)PA1, PC9MCU 输入RMII 50 MHz 参考时钟输入ETH_MDCPC1MCU 输出PHY 管理时钟ETH_MDIOPA2双向PHY 管理数据ETH_CRS_DVPA7MCU 输入RMII 载波检测/接收有效ETH_RXD0PC4MCU 输入RMII RXD0ETH_RXD1PC5MCU 输入RMII RXD1ETH_TX_ENPB11MCU 输出RMII 发送使能ETH_TXD0PB12MCU 输出RMII TXD0ETH_TXD1PB13MCU 输出RMII TXD1LAN8671_IRQ_N (nINT)PC2MCU 输入PHY 中断输入低有效LAN8671_RESET_N (nRST)PC3MCU 输出PHY 复位输出低有效注:STM32F407 的 MCO2(PC9) 输出 50MHz 同时供给 PHY 和 ETH_REF_CLK(PA1), 本篇直连仅供测试, 实际是否加缓冲或电阻或改用50MHz有源晶振 硬件可自行评估. 示波器应能看到 50MHz 的时钟.SWD 调试口: PA13, DIO; PA14 CLK; 连接 ST-Link V3调试串口 USART1: PA9 TX; PA10 RX; 115200-8-N-1看图应该直观一些:立创天空星的板子上贴的是 8M 晶振, 实际使用的时钟树可参考下图:LAN8671 的 10BASE-T1S 连接 USB-10BASE-T1S:PC, 192.168.1.2, PLCA, Node ID 0 作为Coordinator, 负责周期性发送 BEACON 信标等, Node Count 8MCU, 192.168.1.110, PLCA, Node ID 3, Link up 后是 10M half-duplexTOTMR 0x20, Burst Max Count 0, Burst Timer 0x80都连接 100Ω 终端电阻Github 工程的使用stm32f407_lan8671 默认的环境:STM32CubeMX 6.17.0STM32CubeF4 Firmware Package V1.28.3LwIP 2.1.2, NO_SYSCMAKE 管理工程编译:.\build.sh build, 可以带Debug或Release(测速时 Debug 更稳, Releas版本会偶发整秒塌陷, 尽管已做特殊处理, 全局 Release 仍然是 -Os -g0但stm32f4xx_hal_eth.c 和 LWIP/Target/ethernetif.c都作为独立对象目标在 Release 下按 O0 编译), 工具链C:\ST\STM32CubeIDE_2.1.0\STM32CubeIDE\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.14.3.rel1.win32_1.0.100.202602081740下载.\build.sh flash, 使用 ST-Link V3, 默认用以下目录里的命令行工具C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer测试PINGMAC 地址Get-NetNeighbor-AddressFamilyIPv4|Where-Object{$_.IPAddress-eq192.168.1.110}|Select-Object IPAddress, LinkLayerAddress IPAddress LinkLayerAddress --------- ----------------192.168.1.110 02-00-00-00-67-11UDP EchoIPERFiperf.exe-c192.168.1.110-i1-p5010-t10或者用 jperf部分代码说明LAN8671 的代码放在了:stm32f407_lan8671\LWIP\Target\eth_custom_phy_interface.hstm32f407_lan8671\LWIP\Target\eth_custom_phy_interface.c主要对接的是 PHY 的 初始化, 软件复位, 获取或设置连接状态 等. 通过 Clause 22 访问 PHY 基本寄存器, 通过 MMD 访问 Clause 45 风格的扩展寄存器. 参考数据手册4.3.1. Clause 45 Register AccessPHY 的地址探测:扫描 0~31 的 PHY 地址寄存器 PHYID1 (0x0002) 等于 0x0007, 对应数据手册5.1.4. PHY Identifier 1 Register寄存器 PHYID2 (0x0003) 等于 0xC16x, 实际读出来是 0xC165, 是Silicon revision 5 (Rev C2 default), 对应数据手册5.1.5. PHY Identifier 2 RegisterPLCA 的一些寄存器的设置:MMD Device寄存器当前值作用31PLCA_TOTMR (0xCA04)0x0020PLCA TOT 定时31PLCA_BURST (0xCA05)0x0080Burst timer0x80, max count031PLCA_CTRL1 (0xCA02)0x0803NodeCount8, NodeID331PLCA_CTRL0 (0xCA01)0x8000使能 PLCA部分状态寄存器:寄存器用途BSR (0x0001)读两次确认基本链路状态PLCA_STS (MMD31:0xCA03)读取 PLCA 状态AN1699: LAN8670/1/2 Configuration Application Note 中对 D0 和 C2 版本有一些配置说明, 本篇的C2版本未按照这个文档设置, 此处截图作为记录参考:Github 链接Github 开源链接 https://github.com/weifengdq/embedded/tree/main/lan8671

更多文章