Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread
wifi
Ethernet_以太网
《玩转ART-Pi开发板》第8章 APT-Pi双网络实现自动切换
发布于 2021-08-07 11:28:32 浏览:1156
订阅该版
[tocm] ART-Pi中有多种联网方式,最常用有两种:一**个是自带的Wifi模块AP6212,另外一个是以太网,ART-Pi使用的PHY芯片是LAN8720A**。 笔者在前面的文章已经讲解了Wifi的使用。 [Wifi的移植使用](https://bruceou.blog.csdn.net/article/details/115825831) 关于以太网的讲解请看笔者以前文章: [详解以太网(一)](https://bruceou.blog.csdn.net/article/details/118916814) [详解以太网(二)](https://bruceou.blog.csdn.net/article/details/118925889) 接下来将讲解以太网的使用。 ## 8.1以太网硬件介绍 在讲解移植步骤之前,有必须先介绍我们的实验硬件设计,主要是 LAN8720A 通过 RMII 和 SMI接口与 ART-Pi控制器连接,见下图。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/f60d09a4c888835f074519308db7cb64dd37ac62.png#pic_center) ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/c43b418213513705a7f96f695d9d8c16988b7a10.png#pic_center) LAN8720A与ART-Pi之间的引脚连接如下表所示。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/b9d75d515bcf608db11ab8d620995278c64882d8.png#pic_center) ART-Pi通过RMII 接口连接PHY芯片LAN8720A,然后经过百兆网络变压器到RJ45接口。因为 LAN8720A只有 RMII 接口,因此这里与开发板的连接采用了 RMII 接口。电路设计时,将 nINTSEL 引脚通过下拉电阻拉低,也就是REF_CLK Out 模式,设置 nINT/FEFCLKO 为输出 50MHz 时钟,当然前提是在 XTAL1 和 XTAL2 接入了 25MHz 的时钟源。 PHY芯片LAN8720A的nRST复位引脚连接到了ART-Pi的PA3引脚。 ## 8.2 RT-studio配置以太网 继续在上一节的程序中修改。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/3a53b30f4ab51bad59d37c696a3e9cb10ef3fddb.png#pic_center) 勾选Industry-IO,Ethernet就默认使能了,看一看到复位的引脚是PA3。当然啦,如果是自己的开发板这里的复位引脚可能不一样,更换一下就可以了。 接下来保存,重新编译即可。 ## 8.3双网卡手动切换实现 既然有了双网络,必然就会有网络切换,可类比我们的笔记本,可接以太网和WiFi,当WiFi信号不好就使用以太网,当以太网断了,就自动切换到WiFi。ART-Pi也是一样的。 RT-Thread提供了网卡管理和控制的网路组件netdev 网卡。netdev 组件主要作用是解决设备多网卡连接时网络连接问题,用于统一管理各个网卡信息与网络连接状态,并且提供统一的网卡调试命令接口。 [Netdev官网地址](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/netdev/netdev.md) 关于Netdev的原理和API请参看官方手册。笔者这里给出网卡切换的代码。 如下示例,导出命令用于切换默认网卡: ```c #include
#include
/* 当需要网卡操作是,需要包含这两个头文件 */ static int netdev_set_default_test(int argc, char **argv) { struct netdev *netdev = RT_NULL; if (argc != 2) { rt_kprintf("netdev_set_default [netdev_name] --set default network interface device.\n"); return -1; } /* 通过网卡名称获取网卡对象,名称可以通过 ifconfig 命令查看 */ netdev = netdev_get_by_name(argv[1]); if (netdev == RT_NULL) { rt_kprintf("not find network interface device name(%s).\n", argv[1]); return -1; } /* 设置默认网卡对象 */ netdev_set_default(netdev); rt_kprintf("set default network interface device(%s) success.\n", argv[1]); return 0; } #ifdef FINSH_USING_MSH #include
/* 导出命令到 FinSH 控制台 */ MSH_CMD_EXPORT_ALIAS(netdev_set_default_test, netdev_set_default, set default network interface device); #endif /* FINSH_USING_MSH */ ``` 重点代码就两句,一句是netdev_get_by_name获取网卡,另外一句是netdev_set_default设置获取的网卡作为默认网卡。这两句在后面也会使用。 接下来编译下载。 默认关闭wifi的自动连接功能,连接网线,打印信息如下: ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/ee1e9ad8c67a46fc9d33b34ddb49d943faccab0f.png#pic_center) 接下来查看网络连接状态: ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/0a1cee6278ef61759d986d0823a07383e3ea6a80.png#pic_center) 可以看到默认使用的是以太网。接着看看是否连网。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/7fb1a8a60da0b9a6acf8dcea3d96f5b5def3c077.png#pic_center) 说明网络是正常的。 我们通过netdev_set_status_test命令切换网络。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/5054df798448c771d6764de8b77818411c8b8f45.png#pic_center) 可以看到网络切换到WiFi,只是WiFi没有连接而已。 关于WiFi配置有两种方式,不清楚的请参看笔者以前的文章。 [Wifi的移植使用](https://bruceou.blog.csdn.net/article/details/115825831) 笔者这是使用的时蓝牙配置,联网后打印信息如下: ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/be3778138e4b5a7290903fd63e24bbe7c3086bea.png#pic_center) ## 8.4双网卡自动切换 在netdev.c文件中static void netdev_auto_change_default(struct netdev *netdev)这个函数进行了默认网卡的设置。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/93203569ee5774bacb76361bb84bf6e3fadf1080.png#pic_center) 当然,要想实现这个功能,需要配置如下选项,可使能默认网卡自动切换功能: ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/23ea36a7a33bad47308d399e308c50da8ef5589d.png#pic_center) 多网卡模式下,如果开启默认网卡自动切换功能,当前默认网卡状态改变为 down 或 link_down 时,默认网卡会切换到网卡列表中第一个状态为 up 和 link_up 的网卡。这样可以使一个网卡断开后快速切换到另一个可用网卡,简化用户应用层网卡切换操作。如果未开启该功能,则不会自动切换默认网卡。 但是这个自动切换是由缺陷的,默认板子是使用以太网,不管网线插上与断开与否,当没有插网线时,尽管连接了WiFi,还是不会自动切换,需要手动切换,当WiFi连接后,默认也不会切换到以太网。 我们根据实际应用需求,我们知道: 1.默认使用以太网,如果断开以太网,当连接WiFi后,会自动切换到WiFi,WiFi可通过蓝牙配置,并且记录在Flash中,以便下次使用; 2.如果连接了WiFi,再插上网线,则会自动切换到以太网。 因此需要修改两处代码: 第一处:增加WiFi联网自动切换到WiFi ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/bdcda6f11e61c585045af413f12ec15317fda72b.png#pic_center) 这是在rt_wlan_event_dispatch函数中,当WiFi连接后,就切换到WiFi。 第二处:增加以太网联网自动切换到以太网 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/fcca5da3308080ddaef8cb5e3fbe8d9e19996917.png#pic_center) 这是在phy_linkchange()函数中添加的,当以太网插上后,就切换到以太网。 好了,最后的编译下载即可。开启easyflash记住WiFi账号密码,将会自动联网。自动切换网卡。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/c8f80a2c4b76aba03ca9656925cafa0e3e74717f.png#pic_center) 最后总结下,**有以太网就使用以太网,连接了WiFi就切换到WiFi,WiFi可自动保存账号密码。断开以太网后,如果WiFi已经连接,就会切换到WiFi**。 Wifi联网比较复杂,大体流程如下: ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/e92b4be273f873921381dd973f7e5e69e218c222.png#pic_center) ### 代码获取方法 1.长按下面二维码,关注公众号[**嵌入式实验楼**] 2.在公众号回复关键词[**Art-Pi]**]获取资料 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/fd420eff5a1e144b53d5c2bfca8ec412f963c8db.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMxNjIwMzU=,size_16,color_FFFFFF,t_70#pic_center) ------------ ### 欢迎访问我的网站 [BruceOu的主页](https://www.bruceou.cn/) [BruceOu的博客](https://blog.bruceou.cn/) [BruceOu的CSDN博客](https://blog.csdn.net/bruceoxl)
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
BruceOu
这家伙很懒,什么也没写!
文章
27
回答
0
被采纳
0
关注TA
发私信
相关文章
1
RT-THREAD在STM32H747平台上移植lwip
2
正点原子miniSTM32开发板读写sdcard
3
反馈rtt串口驱动对低功耗串口lpuart1不兼容的问题
4
Keil MDK 移植 RT-Thread Nano
5
RT1061/1052 带 RTT + LWIP和LPSPI,有什么坑要注意吗?
6
RT thread HID 如何收发数据
7
求一份基于RTT系统封装好的STM32F1系列的FLASH操作程序
8
RT-Thread修改项目名称之后不能下载
9
rt-studio编译c++
10
有木有移植rt-thread(nano)到riscv 32位MCU上
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
3
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部