外观
02_peripheral_spi_enc28j60
2026-06-10
本文将详细介绍如何使用 ENC28J60 以太网模块实现网络通信,包括模块注册、IP 设置、ping 测试,帮助开发者快速完成以太网功能验证。
ENC28J60 以太网控制器
ENC28J60 是一款 独立以太网控制器,通过 SPI 总线接口实现以太网通信,集成 MAC 和 PHY,支持全双工 / 半双工模式,内置发送 / 接收缓冲区,适用于嵌入式设备快速联网。
在 RT-Thread 系统中,它会被注册为标准网卡,可直接使用 ifconfig、ping 等命令进行网络配置与连通性测试。
API 说明
初始化以太网设备
rt_err_t rt_eth_device_init(struct eth_device *dev, const char *name);功能说明:
注册并初始化以太网设备,将网卡注册到 RT-Thread 系统中
参数说明:
- dev:以太网设备句柄
- name:设备名(如 e2)
注销以太网设备
rt_err_t rt_eth_device_deinit(struct eth_device *dev);功能说明:
注销系统中的以太网设备,释放设备相关资源
参数说明:
- dev:以太网设备句柄
通知系统网卡接收就绪
rt_err_t rt_eth_device_ready(struct eth_device *dev);功能说明:
通知 LwIP 协议栈网卡已收到数据包,协议栈会自动从网卡驱动中读取数据
参数说明:
- dev:以太网设备句柄
上报网口链路状态变化
rt_err_t eth_device_linkchange(struct eth_device* dev, rt_bool_t up);功能说明:
上报网口物理链路通断状态,同步给 LwIP 协议栈
参数说明:
- dev:以太网设备句柄
- up:RT_TRUE 链路连接;RT_FALSE 链路断开
分配 LwIP 协议栈数据缓冲区
struct pbuf *pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type);功能说明:
为 LwIP 协议栈分配数据包内存缓冲区,用于以太网数据收发
参数说明:
- layer:协议层,以太网驱动固定填 PBUF_LINK
- length:需要分配的数据长度
- type:内存类型,固定使用 PBUF_POOL
重新设置协议栈缓冲区长度
void pbuf_realloc(struct pbuf *p, u16_t new_len);功能说明:
调整已分配 pbuf 缓冲区的有效数据长度,仅支持缩短,不支持扩展
参数说明:
- p:pbuf 数据包句柄
- new_len:新的有效数据长度
拷贝协议栈数据缓冲区
u16_t pbuf_copy_partial(const struct pbuf *buf, void *dataptr, u16_t len, u16_t offset);功能说明:
从 LwIP 协议栈 pbuf 中,从指定偏移位置拷贝指定长度数据到用户缓冲区
参数说明:
- buf:pbuf 数据包句柄
- dataptr:目标数据缓冲区
- len:需要拷贝的数据长度
- offset:从 pbuf 起始位置的偏移量
释放协议栈数据缓冲区
u8_t pbuf_free(struct pbuf *p);功能说明:
释放 LwIP 协议栈 pbuf 内存,必须与 pbuf_alloc 成对使用,防止内存泄漏
参数说明:
- p:pbuf 数据包句柄
硬件连接
V3.3 连接 3.3V
GND 连接 GND
SCK 连接 P0B3
CS 连接 P0B7
MOSI 连接 P0C1
MISO 连接 P0B7
INT 连接 POA0
RST 连接 P0A1具体接线图可参考 SPI NorFlash 读写示例 和 gpio 中断输入示例
运行示例
操作步骤
在 RT-Thread 控制台中执行 enc38j60_example 注册网卡
msh />enc38j60_example [enc28j60] spi device attach ok [enc28j60] netdev e2 register successfully [enc28j60] example init done! [enc28j60] use command: ifconfig e2 192.168.1.2 192.168.1.1 255.255.255.0 [enc28j60] then ping: 192.168.1.11使用 ifconfig 配置网卡 IP 地址
msh />ifconfig e2 192.168.1.2 192.168.1.1 255.255.255.0 config : e2 IP addr: 192.168.1.2 Gateway: 192.168.1.1 netmask: 255.255.255.0使用 ping 命令测试网络连通性
msh />ping 192.168.1.11 e2 60 bytes from 192.168.1.11 icmp_seq=1 ttl=128 time=1 ms 60 bytes from 192.168.1.11 icmp_seq=2 ttl=128 time=0 ms 60 bytes from 192.168.1.11 icmp_seq=3 ttl=128 time=0 ms 60 bytes from 192.168.1.11 icmp_seq=4 ttl=128 time=0 ms --- 192.168.1.11 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss minimum = 0ms, maximum = 1ms, average = 0ms
