1. 单片机以太网接入的背景与需求
在工业控制、智能家居和物联网设备中,让单片机具备网络通信能力已成为刚需。以太网因其稳定、高速和普及性,成为有线连接的首选方案。我在2016年第一次为STM32F407设计以太网接口时,市面上可选的方案还比较有限,如今已有更多成熟方案可供选择。
传统RS485通信的局限性日益凸显:布线复杂、速率受限(通常不超过115200bps)、无法直接对接云平台。而以太网提供100Mbps起步的带宽,支持TCP/IP协议栈,能无缝对接现有网络基础设施。根据我的项目经验,需要以太网接入的场景主要有三类:
- 工业现场设备数据采集(Modbus TCP替代Modbus RTU)
- 安防监控设备视频流传输
- 智能家居中控网关
2. 硬件方案选型与对比
2.1 内置MAC外接PHY方案
以STM32F407/STM32H743为代表的高端单片机,内部已集成以太网MAC控制器。这类方案只需要外接一个PHY芯片(如DP83848、LAN8720)即可完成硬件设计。我在多个项目中实测发现:
- LAN8720性价比突出(约5元/片),但发热量较大
- DP83848稳定性更好,支持工业级温度范围
- 电路设计时注意:PHY的50MHz时钟需从单片机MCO引脚输出
典型原理图设计要点:
- RJ45接口必须带网络变压器(如HR911105A)
- PHY的LED指示灯引脚建议保留用于状态诊断
- 电源滤波电路要严格按芯片手册设计
2.2 SPI接口以太网模块
对于没有内置MAC的单片机(如STM32F103),W5500是最成熟的解决方案。这个硬核TCP/IP协议栈芯片通过SPI接口与单片机通信,实测SPI时钟可达80MHz。我在智能插座项目中使用的配置:
c复制// W5500初始化示例
void W5500_Init(void)
{
SPI_Config(); // 配置SPI接口
W5500_Write(0x00, 0x80); // 软复位
W5500_Write(0x00, 0x03); // 设置MAC地址
// 配置4个Socket缓冲区...
}
优势在于:
- 占用资源少(仅需SPI接口+4个GPIO)
- 协议栈已固化,不占用单片机资源
- 市场价格约15元/片
2.3 串口转以太网方案
CH9121这类芯片提供UART到以太网的透明转换,适合快速改造现有串口设备。我在老旧工业设备联网改造中常用此方案,接线方式:
code复制单片机UART ----> CH9121 ----> 路由器
TX/RX RJ45
需要注意:
- 波特率需双方一致(最高支持921600bps)
- 上电后需等待10秒左右完成DHCP获取IP
- 不支持同时建立多个TCP连接
3. 软件协议栈实现
3.1 LWIP在STM32上的移植
使用内置MAC的方案需要移植LWIP协议栈。以CubeMX生成代码为基础,关键修改点:
- 在
ethernetif.c中实现low_level_output()发送函数 - 配置内存池大小(建议至少16KB)
- 启用DHCP时需要处理IP地址变更事件
c复制// DHCP事件回调示例
void dhcp_event_cb(struct netif *netif)
{
if(dhcp_supplied_address(netif)) {
printf("IP: %s\n", ip4addr_ntoa(&netif->ip_addr));
}
}
3.2 网络通信优化技巧
通过Wireshark抓包分析,我总结了几个性能优化点:
- 启用TCP_NODELAY选项减少小包延迟
- 调整MSS(最大分段大小)匹配MTU值
- 使用零拷贝API:
netconn_send()替代netconn_write()
在STM32F407+DP83848的方案中,优化后TCP吞吐量可从3MB/s提升到7MB/s。
4. 工业场景下的特殊处理
4.1 EMI防护设计
在变频器附近的设备,网络接口易受干扰。有效的防护措施包括:
- 使用带金属外壳的RJ45连接器
- 在差分线上并联TVS二极管(如SRV05-4)
- 电源输入端增加共模电感
4.2 断网重连机制
工业环境网络可能不稳定,需实现自动恢复功能。我的代码框架:
c复制while(1) {
if(link_status == DOWN) {
PHY_Reset();
netif_set_link_down(&netif);
HAL_Delay(1000);
netif_set_link_up(&netif);
}
// 业务逻辑处理...
}
4.3 协议兼容性处理
与上位机通信时要注意:
- Windows默认开启TCP延迟确认(可导致200ms延迟)
- 某些PLC只支持固定端口通信
- 防火墙可能阻断ICMP报文
5. 实测对比与方案选型建议
根据我在多个项目的实测数据:
| 方案 | 成本 | 最大速率 | 延迟 | 适用场景 |
|---|---|---|---|---|
| 内置MAC+PHY | 25元 | 100Mbps | <1ms | 高性能设备 |
| W5500模块 | 18元 | 10Mbps | 3ms | 资源受限系统 |
| CH9121转换器 | 30元 | 1Mbps | 10ms | 串口设备快速改造 |
选型决策树:
- 是否需要>10Mbps带宽? → 选内置MAC方案
- 单片机是否有足够资源? → 否→选W5500
- 是否改造现有串口设备? → 是→选CH9121
最后分享一个调试技巧:用ping -t持续测试时,添加-l参数修改包大小(如ping 192.168.1.100 -l 1024),可以测试不同负载下的网络稳定性。
