潘多拉 RT-Thread 以太网模块
实验概述
本实验将使用 ENC28J60 模块连接到潘多拉 IoT 开发板上,实现以太网连接。ENC28J60 是一款带 SPI 接口的独立以太网控制器,兼容 IEEE 802.3,集成 MAC 和 10 BASE-T PHY,最高速度可达 10Mb/s。
硬件连接
ENC28J60 是通过开发板左侧的 WIRELESS 插座连接单片机的,利用 SPI2 和单片机进行通讯。原理图和实物图如下所示。
示例代码
参考《潘多拉 IoT Board 开发环境》创建工程,在 applications/main.c 中输入如下代码。
#include <rtthread.h>
int main(void)
{
extern rt_err_t ping(char* target_name, rt_uint32_t times, rt_size_t size);
/* 等待网络连接成功 */
rt_thread_mdelay(500);
while(1) {
if(ping("www.rt-thread.org", 4, 0) != RT_EOK) {
rt_thread_mdelay(5000);
}
else {
break;
}
}
return 0;
}
编译运行
添加 ENC28J60 驱动
编译工程
$ scons
...
LINK rtthread-stm32l4xx.elf
arm-none-eabi-objcopy -O binary rtthread-stm32l4xx.elf rt-thread.bin
arm-none-eabi-size rtthread-stm32l4xx.elf
text data bss dec hex filename
206892 2376 45204 254472 3e208 rtthread-stm32l4xx.elf
scons: done building targets.
将 bin 文件上传到 STM32
st-flash write rt-thread.bin 0x8000000
打开串口终端,输出如下内容
\ | /
- RT - Thread Operating System
/ | \ 4.0.1 build Jan 4 2022
2006 - 2019 Copyright by rt-thread team
lwIP -2.0.2 initialized!
msh />60 bytes from 118.31.15.152 icmp_seq=0 ttl=52 time=12 ticks
60 bytes from 118.31.15.152 icmp_seq=1 ttl=52 time=16 ticks
60 bytes from 118.31.15.152 icmp_seq=2 ttl=52 time=12 ticks
60 bytes from 118.31.15.152 icmp_seq=3 ttl=52 time=12 ticks
现在,网络已经准备初始化成功,可以和外网进行通讯了!
联网成功后,开发者可以通过 BSD Socket API 进行网络开发了,也可以通过 ENV 选择 RT-Thread 提供的网络软件包来加速应用开发。
思考总结
ENC28J60 初始化的源代码位于 drivers/drv_enc28j60.c 中。因为 ENC28J60 是通过 SPI 和单片机进行通讯的,所以需要通过 enc28j60_attach()
函数将 ENC28J60 连接到 SPI 设备上,潘多拉 IoT Board 提供了专门的接口,对应 SPI21 设备。这样,就能利用 RT-Thread 的 SPI 框架和 ENC28J60 进行通讯了。
然后就是将 ENC28J60 的中断处理函数通过 rt_pin_attach_irq()
函数绑定到对应的管脚上去,这里用到的是 PD3 号管脚。
最后利用 RT-Thread 的 INIT_COMPONENT_EXPORT
宏定义,将 enc28j60_init()
函数加入开机自动初始化。这样,板子上电后,就会自动执行 ENC28J60 的初始化函数,无需用户手动调用。
drv_enc28j60.c 里面并没有真正的初始化代码,只是调用了 RT_Thread 提供的 enc28j60.c 文件里的函数来初始化的,想了解 ENC28J60 初始化和中断函数的具体实现,可以查看 rt-thread/components/drivers/spi/enc28j60.c 文件来学习。