LAN8720A 是一种常用的以太网 PHY 芯片,搭配 STM32 微控制器可以实现以太网通信功能。通过 CubeMX 配置 LAN8720A 并结合 LWIP(轻量级 IP 协议栈)实现网络通信,以下是详细的步骤与关键配置。
1. 硬件连接
在开始软件配置之前,需要确保硬件电路正确连接:
1.1 硬件连接图
LAN8720A 引脚 | STM32 引脚 (示例) | 描述 |
---|---|---|
TXD0 | ETH_TXD0 | 数据发送引脚 |
TXD1 | ETH_TXD1 | 数据发送引脚 |
TX_EN | ETH_TX_EN | 数据发送使能 |
RXD0 | ETH_RXD0 | 数据接收引脚 |
RXD1 | ETH_RXD1 | 数据接收引脚 |
CRS_DV | ETH_CRS_DV | 接收数据有效信号 |
MDC | ETH_MDC | MDIO 时钟 |
MDIO | ETH_MDIO | 管理数据输入/输出 |
RESET | GPIO(自定义) | 硬件复位引脚 |
VCC | 3.3V | 电源输入 |
GND | GND | 接地 |
1.2 确保连接
- STM32 的外设引脚使用 RMII(推荐,适用于 LAN8720A)。
- LAN8720A 的 RESET 引脚通过 GPIO 控制,确保启动时稳定复位。
2. CubeMX 配置步骤
2.1 创建新项目
- 打开 CubeMX 6.10。
- 选择目标 STM32 芯片(例如 STM32F407ZG)或开发板(如 STM32F4 Discovery)。
2.2 配置以太网外设
- 在 Pinout & Configuration 中启用 Ethernet:
- Peripherals > Ethernet (ETH),选择 RMII 模式。
- 自动分配与 RMII 模式相关的引脚(如 TXD0、TX_EN 等)。
2.3 配置 LWIP
- 在 Middleware > LWIP 中启用 Lightweight IP Stack。
- 配置 LWIP 的相关参数:
- Host Name: 配置主机名称。
- DHCP:
- 勾选 Enable DHCP 以动态获取 IP 地址。
- 若使用静态 IP,则取消勾选,并在代码中配置静态 IP。
- Thread Priority: 保持默认或根据需要调整优先级。
- 调整 LWIP 的内存选项(在 Memory > Heap/Stack):
- 推荐根据应用需求调整
MEM_SIZE
和PBUF_POOL_SIZE
。
- 推荐根据应用需求调整
2.4 配置时钟
在 Clock Configuration 中:
- 配置主时钟(HSE 或 PLL),确保 ETH 外设时钟可用。
- RMII 模式通常需要一个 50 MHz 的外部时钟源(如 LAN8720A 的 XTAL 引脚)。
2.5 GPIO 配置
- 手动添加 LAN8720A 的 RESET 引脚(配置为 GPIO 输出)。
- 配置以太网接口的其他 GPIO(如果 CubeMX 未自动分配)。
3. 生成代码并修改配置
3.1 生成代码
- 点击 Project > Generate Code,选择开发工具链(如 STM32CubeIDE)。
- 打开生成的工程文件。
3.2 启用 PHY 芯片
修改以太网初始化代码,确保 LAN8720A 被正确复位和初始化。
在 stm32f4xx_hal_conf.h
或 ethernetif.c
中:
#define DP83848_PHY_ADDRESS 0x01 // 根据实际 PHY 地址
LAN8720A 默认 PHY 地址为 0x01,可以通过硬件配置调整。
在 main.c
中添加复位逻辑:
void LAN8720A_Reset(void) {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // 复位低电平
HAL_Delay(50); // 延时
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // 复位完成
HAL_Delay(50); // 延时等待稳定
}
在 main()
中调用 LAN8720A_Reset
:
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
LAN8720A_Reset();
MX_ETH_Init();
MX_LWIP_Init();
while (1) {
ethernetif_input(&gnetif); // 处理以太网数据
sys_check_timeouts(); // 处理 LWIP 超时
}
}
4. 调试与验证
4.1 网络调试
- 使用 DHCP:连接到局域网,检查 DHCP 是否分配 IP 地址。
- 在
lwipopts.h
中启用LWIP_DHCP
:
- 在
#define LWIP_DHCP 1
使用静态 IP: 修改 lwipopts.h
:
#define LWIP_DHCP 0
在 ethernetif.c
配置静态 IP:
IP_ADDR4(&gnetif.ip_addr, 192, 168, 1, 100); // 设置静态 IP
IP_ADDR4(&gnetif.netmask, 255, 255, 255, 0); // 子网掩码
IP_ADDR4(&gnetif.gw, 192, 168, 1, 1); // 网关
4.2 验证通信
- 使用网络调试工具(如 Wireshark),检查 STM32 是否发送 ARP 请求或接收到数据包。
- 使用 Ping 工具测试设备连通性:
- 在命令行输入:
ping 192.168.1.100
。
- 在命令行输入:
- 在 STM32 上实现简单的 HTTP 服务器:
- 在 LWIP 配置中启用 HTTPD。
- 使用浏览器访问设备的 IP 地址,验证网页响应。
5. 常见问题与解决方案
问题1:无法获取 IP 地址
- 检查 LAN8720A 的时钟输入是否正常(XTAL 或外部 50MHz 时钟)。
- 检查 PHY 地址配置是否正确。
- 确保网线和交换机连接正常。
问题2:Ping 不通
- 确认 STM32 的引脚复用配置正确。
- 使用 Wireshark 检查网络数据包是否被发送。
问题3:LWIP 数据包丢失
- 调整
lwipopts.h
中的缓冲区大小:
#define PBUF_POOL_SIZE 16
#define PBUF_POOL_BUFSIZE 1524
通过以上步骤,可以在 CubeMX 6.10 上成功配置 LAN8720A 和 LWIP,并实现 STM32 的以太网功能。
发布者:myrgd,转载请注明出处:https://www.object-c.cn/4529