目录
参考示例
前言
以太网芯片有很多种,常见的大致可以分成 3 种:
- 以太网芯片只有 PHY(物理接口收发器 ),需要单片机带 MAC(以太网媒体接入控制器 ),通过 MII 或者 RMII 接口和单片机通讯。例如 LAN8720。
- 以太网芯片带 MAC 和 PHY,通过 SPI 接口和单片机通讯。例如 ENC28J60。
- 以太网芯片带 MAC 和 PHY,通过 SPI 接口和单片机通讯,同时内置硬件协议栈,适合低速单片机。例如 W5500。
板卡上使用的是LAN8720以太网芯片,只有 PHY(物理接口收发器 ),单片机带 MAC(以太网媒体接入控制器 ),通过RMII 接口和单片机通讯,复位引脚是PH3
一、RT-Thread中的lwip
RT-Thread在移植lwIP的过程中根据RT-Thread的特点进行了适当调整。
RT-Thread操作系统中的lwIP是从lwIP发布原始版本移植过来,然后添加了设备层以替换原来的驱动层。不同于原版,这里RT-Thread对于以太网数据的收发采用了独立的双线程(erx线程与etx线程)结构:
- erx线程用于以太网报文的接收──当以太网硬件设备收到网络报文产生中断时,中断服务例程将会通过邮箱的形式唤醒erx线程,让erx线程主动进行以太网报文收取过程,当erx线程收到有效网络报文后,它通过邮箱的形式通知给LwIP的主线程(tcp线程);
- tcp的发送操作则是通过邮箱的形式唤醒etx线程进行实际的以太网硬件写入。在正常情况下,erx线程和etx线程的优先级是相同的,用户可以根据自身实际要求进行微调以侧重接收或发送。
RT-Thread中将lwIP应用起来主要包括三个核心步骤:
1. 创建收发包线程,调用接口eth_system_device_init_private(),这步在已经在lwip_system_init()中调用了
2. 提供网卡驱动,调用网卡初始化函数eth_device_init,注册网卡设备(为网卡添加名称,IP、子网掩码、网关,网卡设备使用的发包和收包接口函数等)
3. 初始化lwIP,创建lwIP线程,调用接口lwip_system_init()。系统已经通过自动初始化机制自动调用了(INIT_PREV_EXPORT(lwip_system_init);)。
至此,三个步骤完成之后,应用层便可以直接与外界通讯。
二、驱动添加
网卡外设驱动部分rtthread已经在\libraries\HAL_Drivers\drv_eth.c/h中写好了,唯一要改的就是在phy_reset.c中添加PHY网卡的复位。在drv_eth.c中会调用HAL库的HAL_ETH_Init函数来初始化ETH外设,调用顺序如下:
rt_stm32_eth_init()/dev_eth.c ---> HAL_ETH_Init()/stm32f4xx_hal_eth.c ---> HAL_ETH_MspInit()/stm32f4xx_hal_msp.c;所以在添加以太网外设之前,需要先通过CubeMX配置ETH生成HAL_ETH_MspInit函数,完成对ETH外设时钟、IO引脚的配置
2.1 CubeMX配置
2.2、添加复位驱动
#define ETH_RESET_IO GET_PIN(H, 3) //PHY RESET PIN
/* phy reset */
void phy_reset(void)
{
rt_pin_write(ETH_RESET_IO, PIN_HIGH);
rt_thread_mdelay(100);
rt_pin_write(ETH_RESET_IO, PIN_LOW);
rt_thread_mdelay(100);
}
int phy_init(void)
{
rt_pin_mode(ETH_RESET_IO, PIN_MODE_OUTPUT);
rt_pin_write(ETH_RESET_IO, PIN_LOW);
return RT_EOK;
}
INIT_BOARD_EXPORT(phy_init);
三、ENV配置
在ENV中选中的组件或软件包,如果开启了包管理器自动更新或者手动使用 pkgs --update 命令,就能自动将选择的软件包更新到BSP中;然后再使用 scons --target=xxx 命令编译BSP时,选择的软件包相关源代码就会被自动添加进工程中并进行编译
3.1、添加以太网驱动
选中网卡驱动,开启 BSP_USING_ETH 和 PHY_USING_LAN8720A宏定义,开启后在scons构建工程时,drv_eth.c 和 phy_reset.c 就能自动添加进工程中
3.2、选中 lwIP 与 net dev
启用 lwIP 与 net device:
3.3、选中 SAL 与 DFS
打开 SAL 层,并打开 BSD socket:
fd 的管理在文件系统中,所以需要添加文件系统:
3.4、选中 network_samples
这个软件包包含一些网络操作的例程,在添加完网络驱动后可以用来进行网络功能的测试