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

文章目录

    • [LAN8671 简介](#LAN8671 简介)
    • [LAN8671 原理图](#LAN8671 原理图)
    • [与 STM32F407 的接线](#与 STM32F407 的接线)
    • [Github 工程的使用](#Github 工程的使用)
    • 测试
      • PING
      • [MAC 地址](#MAC 地址)
      • [UDP Echo](#UDP Echo)
      • IPERF
    • 部分代码说明
    • [Github 链接](#Github 链接)

LAN8671 简介

前篇介绍了SPI接口的 10BASE-T1S LAN8651, 本篇是 RMII 接口的 LAN8671:

  • 测试的是 LAN8671C2-E/U3B
  • 24-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:模拟电源(睡眠可关断)
    • VDDP:IO 电源(睡眠可关断)
    • 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, PC9 MCU 输入 RMII 50 MHz 参考时钟输入
ETH_MDC PC1 MCU 输出 PHY 管理时钟
ETH_MDIO PA2 双向 PHY 管理数据
ETH_CRS_DV PA7 MCU 输入 RMII 载波检测/接收有效
ETH_RXD0 PC4 MCU 输入 RMII RXD0
ETH_RXD1 PC5 MCU 输入 RMII RXD1
ETH_TX_EN PB11 MCU 输出 RMII 发送使能
ETH_TXD0 PB12 MCU 输出 RMII TXD0
ETH_TXD1 PB13 MCU 输出 RMII TXD1
LAN8671_IRQ_N (nINT) PC2 MCU 输入 PHY 中断输入,低有效
LAN8671_RESET_N (nRST) PC3 MCU 输出 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 8
  • MCU, 192.168.1.110, PLCA, Node ID 3, Link up 后是 10M half-duplex
  • TOTMR = 0x20, Burst Max Count = 0, Burst Timer = 0x80
  • 都连接 100Ω 终端电阻

Github 工程的使用

stm32f407_lan8671 默认的环境:

  • STM32CubeMX 6.17.0
  • STM32CubeF4 Firmware Package V1.28.3
  • LwIP 2.1.2, NO_SYS
  • CMAKE 管理工程
  • 编译: .\build.sh build, 可以带 DebugRelease (测速时 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

测试

PING

MAC 地址

bash 复制代码
> Get-NetNeighbor -AddressFamily IPv4 | Where-Object { $_.IPAddress -eq '192.168.1.110' } | Select-Object IPAddress, LinkLayerAddress

IPAddress     LinkLayerAddress
---------     ----------------
192.168.1.110 02-00-00-00-67-11

UDP Echo

IPERF

bash 复制代码
iperf.exe -c 192.168.1.110 -i 1 -p 5010 -t 10

或者用 jperf

部分代码说明

LAN8671 的代码放在了:

  • stm32f407_lan8671\LWIP\Target\eth_custom_phy_interface.h
  • stm32f407_lan8671\LWIP\Target\eth_custom_phy_interface.c

主要对接的是 PHY 的 初始化, 软件复位, 获取或设置连接状态 等. 通过 Clause 22 访问 PHY 基本寄存器, 通过 MMD 访问 Clause 45 风格的扩展寄存器. 参考数据手册 4.3.1. Clause 45 Register Access

PHY 的地址探测:

  • 扫描 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 Register

PLCA 的一些寄存器的设置:

MMD Device 寄存器 当前值 作用
31 PLCA_TOTMR (0xCA04) 0x0020 PLCA TOT 定时
31 PLCA_BURST (0xCA05) 0x0080 Burst timer=0x80, max count=0
31 PLCA_CTRL1 (0xCA02) 0x0803 NodeCount=8, NodeID=3
31 PLCA_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

相关推荐
EdmundXjs9 小时前
flashrom v1.5.1 Windows
windows·stm32·单片机
wearegogog12312 小时前
NEC红外线协议编码与解码(STM32实现)
网络·stm32·嵌入式硬件
意法半导体STM3214 小时前
【官方原创】STM32 USBx Host HID standardalone移植示例 LAT1449
开发语言·前端·stm32·单片机·嵌入式硬件
辰哥单片机设计14 小时前
STM32项目分享:空气质量检测系统(机智云)
stm32·单片机·嵌入式硬件
一月千帆15 小时前
基于STM32的智能小型洗碗机控制系统设计
stm32·单片机·嵌入式硬件
送外卖的CV工程师15 小时前
STM32 CubeMX Makefile 工程编译 入门指南
stm32·单片机·嵌入式硬件·学习·makefile·stm32cubemx
项目題供诗15 小时前
STM32-新建工程(二)
stm32·单片机·嵌入式硬件
ghie909016 小时前
STM32 待机模式与唤醒实验(标准库函数版)
stm32·单片机·嵌入式硬件
篮子里的玫瑰16 小时前
一个隐藏的坑:MicroLib与串口打印的关系
驱动开发·stm32·嵌入式硬件