Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
WIFI模块_RW007
wifi
STM32F746
RW007 WIFI模块联网与使用(一)
发布于 2021-06-16 07:29:32 浏览:3024
订阅该版
[tocm] **开发环境:** RT-Thread版本:4.0.3 操作系统:Windows10 RT-Thread Studio版本:2.0.1 开发板MCU:STM32F746ZGT6U(NUCLEO-F746ZG开发板) 本文主要介绍RW007 WiFi模块的开发使用,在联网之后,再连接到ONENet,即可将本地传感器信息上传至云端。 # 1开发板与RW007简介 ### 1.1开发板简介 NUCLEO-F746ZG开发板的处理器是STM32F746ZGT6U,基于ARM 32位Cortex®-M7内核,带FPU DSP指令、MPU、ST ART加速器、L1缓存、零等待周期执行、最高主频216MHz、性能高达462 DMIPS/2.14 DMIPS/MHz (Dhrystone 2.1)。 >1.1 M Flash,320 k SRAM,最高32位数据总线的FMC可用于扩展SRAM, PSRAM, SDRAM/LPSDR SDRAM, NOR/NAND等。 2.支持Quad-SPI 3.8080/6800并行LCD接口,LCD-TFT控制器,最高支持XGA分辨率,带图形加速器 4.1.7 V to 3.6 V灵活电源选择,Sleep, Stop , Standby三种低功耗模式和RTC事实时钟 5.3个12位ADC ,2个12位DAC 6.18个定时器,其中包括一个低功耗定时器和2个32位定时器 7.25个通信接口,包括USART,I2C,SPI,CAN,HDMI-CEC等 8.USB2.0接口,网络接口,摄像头接口 9.随机数发生器,CRC校验 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/2ba549def5b44bbe20a6d2c07f506b582e4d1222.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMxNjIwMzU=,size_16,color_FFFFFF,t_70#pic_center) ### 1.2 RW007简介 RW007 是由上海睿赛德电子科技有限公司开发的高速 WiFi 模块,模块基于 Realtek RTL8710BN(Ameba Z 系列) WIFI SOC,使用 SPI/UART 与主机通信 ,支持 IEEE 802.11b/g/n 网络、 WEP/WPA/WPA2 加密方式和 STA 和 AP 模式。 **主要特性** >1.Cortex-M4 高性能 MCU 2.可自由选择的 AT SPI 双模式,工作模式可由主机配置 3.SPI 时钟高达 30Mbps,UART 波特率高达 6Mbps。 4.SPI 模式下有效以太网带宽高达上传 1MBytes/s,下载 1MBytes/s 5.内置 Bootloader,支持固件升级、安全固件功能。 6.支持快速连接、airkiss 配网 7.支持存储多达 5 条连接信息 # 2 项目创建 为了简单起见,我这里使用RT-Thread Studio开发,关于如何使用RT-Thread Studio创建项目,请参看官方手册。 [RT-Thread Studio](https://www.rt-thread.org/document/site/rtthread-studio/nav/) 首先打开RT-Thread Studio,新建项目。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/4bf3b1bdba3c2e12a6e28409a125893aac64c94b.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMxNjIwMzU=,size_16,color_FFFFFF,t_70#pic_center) 接下来选择新建“RT-Thread项目”,然后点击“下一步”。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/ec0fa976aaef687a4a9f23d56e791a4e4c3de5f2.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMxNjIwMzU=,size_16,color_FFFFFF,t_70#pic_center) 接下来填写工程名,由于RT-Thread Studio没有NUCLEO-F746ZG开发板的demo工程,这里选择选择基于芯片,控制台是USART3。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/ed9f7dafede14b4398138072052fd39bd5bd363c.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMxNjIwMzU=,size_16,color_FFFFFF,t_70#pic_center) 点击“完成”,稍等片刻即可完成项目的创建。当然接下来你也可以使用MDK开发,我这里还是继续使用RT-Thread Studio开发。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/63e9190055fc065a2ec8e7be994d1ff6d01dde6f.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMxNjIwMzU=,size_16,color_FFFFFF,t_70#pic_center) 工程创建好了,接下里就是开发工作了。 可以先尝试编译: ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/8a12d051a815393a232ec6d750c7cda08620fdf4.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMxNjIwMzU=,size_16,color_FFFFFF,t_70#pic_center) NUCLEO-F746ZG自带ST-Link下载器,编译成功后将程序下载到板子中,打开终端,打印信息如下: ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/a1853f3daf2225f4b92a3ec11948d48e8f838a8a.png#pic_center) 以上信息表示创建工程成功。 # 3 RW007联网 RW007与MCU的电路连接示意图如下: ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/d1cf69bec486ffeaa1991b413212b8a6cf2305be.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMxNjIwMzU=,size_16,color_FFFFFF,t_70#pic_center) RW007与MCU具体IO连线如下: ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/a2e6938679f994c356ffc2f1a7e297221915ac40.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMxNjIwMzU=,size_16,color_FFFFFF,t_70#pic_center) 从上图可以看出WiFi的接口是SPI。 |STM32 引脚名 |封装管脚序号| 功能| |--|--|--| |PA5 |5 |BOOT0/CLK| |PA6 |6 |MISO| |PA7 |7 |MOSI| |PD14 |62 |BOOT1/CS| |PD15 |63 |INT/BUSY| |PF12 |252| RESET| ## 3.1 WiFi配置 **1.配置 SPI** ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/f7ab6ac429085dda84d0e47e29bc4aa676d63016.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMxNjIwMzU=,size_16,color_FFFFFF,t_70#pic_center) 进行配置 SPI1,并生成代码,保存退出即可 。 **2.配置 RW007 软件包** RT-Thread 通过软件包的形式,对 RW007 模块提供配套驱动支持,系统默认选项不包含软件包,用户需手动开启: RT-Thread online packages ---> 、IoT - internet of things --->、Wi-Fi --->,勾选 rw007: SPI WIFI rw007 driver ---> 选项 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/7d1c38976b5e50d66b90d01b1f0509f0e3254d56.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMxNjIwMzU=,size_16,color_FFFFFF,t_70#pic_center) 接着进一步设置软件包参数,完成 SPI 总线和 IO 的配置,更改总线设备名称 RW007 BUS NAME 为 spi1。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/a421bd8b5b3dc610b8ab1c81c64ff6e8044c454c.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMxNjIwMzU=,size_16,color_FFFFFF,t_70#pic_center) 当然啦,这里需要根据自己的板子来决定使用哪个SPI。还需要配置 SPI 控制 IO。 **3.开启 WiFi 框架** RW007 驱动使用了 WLAN 相关的接口,按以下选项路径打开 WiFi 框架: RT-Thread Components --->、Device Drivers --->、Using WiFi --->,勾选 Using Wi-Fi framework: ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/438fb863e2f495887d9be197571f1baa1e05d597.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMxNjIwMzU=,size_16,color_FFFFFF,t_70#pic_center) 保存即可配置完成。 ## 3.3 WiFi联网测试 一切完成后,编译,下载,打开终端。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/f2be1f670d48239801c4d6a715193259e9f7d5ab.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMxNjIwMzU=,size_16,color_FFFFFF,t_70#pic_center) 这里通过wifi命令来联网。 先对周围的无线网络进行扫描,如果你知道Wii信息可以跳过该步骤: >wifi scan ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/4dd126b352026bc330388aa5e99f304db42735e7.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMxNjIwMzU=,size_16,color_FFFFFF,t_70#pic_center) 连接网络: >wifi join ssid passwd ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/27eb3f9611c0a6e07c12b4603a56b9e7dd9d7caf.png) 联网成功后会显示IP,接下来可以使用下WiFi相关的的其他命令。 有WiFi信息不代表联网成功,接下来ping下IP。 >ping ip/域名 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/237b5dc749caa59d1e789a355c0708e18fd5222b.png) 【问题】RW007 初始化失败 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/3fffc23ee31d684bbe66bd86aead963d454fba6f.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMxNjIwMzU=,size_16,color_FFFFFF,t_70) 【问题分析】由于RW007的软件版本默认选择的是1.1.1,不是最新版本,固件和应用软件不匹配。 【解决办法】选择与固件匹配的软件版本即可。 ## 3.3 WiFi联网总结 关于WiFi的底层驱动已经封装了,这部分内容也很多,主要是协议栈内容多,但是大体的流程和其他驱动一样的。 驱动的入口是wifi_spi_device_init函数,主要要RW007硬件使能。然后跳转到rt_hw_wifi_init函数中。 ```c int wifi_spi_device_init(void) { char sn_version[32]; GPIO_TypeDef *cs_gpiox; uint16_t cs_pin; cs_gpiox = (GPIO_TypeDef *)((rt_base_t)GPIOA + (rt_base_t)(RW007_CS_PIN / 16) * 0x0400UL); cs_pin = (uint16_t)(1 << RW007_CS_PIN % 16); rw007_gpio_init(); rt_hw_spi_device_attach(RW007_SPI_BUS_NAME, "wspi", cs_gpiox, cs_pin); rt_hw_wifi_init("wspi"); rt_wlan_set_mode(RT_WLAN_DEVICE_STA_NAME, RT_WLAN_STATION); rt_wlan_set_mode(RT_WLAN_DEVICE_AP_NAME, RT_WLAN_AP); rw007_sn_get(sn_version); rt_kprintf("\nrw007 sn: [%s]\n", sn_version); rw007_version_get(sn_version); rt_kprintf("rw007 ver: [%s]\n\n", sn_version); return 0; } INIT_APP_EXPORT(wifi_spi_device_init); rt_err_t rt_hw_wifi_init(const char *spi_device_name) { static struct rt_wlan_device wlan_sta, wlan_ap; rt_err_t ret; wifi_sta.wlan = &wlan_sta; wifi_sta.hspi = &rw007_spi; wifi_ap.wlan = &wlan_ap; wifi_ap.hspi = &rw007_spi; /* align and struct size check. */ RT_ASSERT((SPI_MAX_DATA_LEN & 0x03) == 0); memset(&rw007_spi, 0, sizeof(struct rw007_spi)); rw007_spi.spi_device = (struct rt_spi_device *)rt_device_find(spi_device_name); if (rw007_spi.spi_device == RT_NULL) { LOG_E("spi device %s not found!\r", spi_device_name); return -RT_ENOSYS; } /* config spi */ { struct rt_spi_configuration cfg; cfg.data_width = 8; cfg.mode = RT_SPI_MODE_0 | RT_SPI_MSB; /* SPI Compatible: Mode 0. */ cfg.max_hz = RW007_SPI_MAX_HZ; /* 15M 007 max 30M */ rt_spi_configure(rw007_spi.spi_device, &cfg); } /* init spi send mempool */ rt_mp_init(&rw007_spi.spi_tx_mp, "spi_tx", &rw007_spi.spi_tx_mempool[0], sizeof(rw007_spi.spi_tx_mempool), sizeof(struct spi_data_packet)); /* init spi send mailbox */ rt_mb_init(&rw007_spi.spi_tx_mb, "spi_tx", &rw007_spi.spi_tx_mb_pool[0], SPI_TX_POOL_SIZE, RT_IPC_FLAG_PRIO); /* init spi recv mempool */ rt_mp_init(&rw007_spi.spi_rx_mp, "spi_rx", &rw007_spi.spi_rx_mempool[0], sizeof(rw007_spi.spi_rx_mempool), sizeof(struct spi_data_packet)); /* init spi recv mailbox */ rt_mb_init(&rw007_spi.spi_rx_mb, "spi_rx", &rw007_spi.spi_rx_mb_pool[0], SPI_RX_POOL_SIZE, RT_IPC_FLAG_PRIO); /* init spi data notify event */ rt_event_init(&spi_wifi_data_event, "wifi", RT_IPC_FLAG_FIFO); rw007_spi.rw007_cmd_event = rt_event_create("wifi_cmd", RT_IPC_FLAG_FIFO); /* register wlan device for ap */ ret = rt_wlan_dev_register(&wlan_ap, RT_WLAN_DEVICE_AP_NAME, &ops, 0, &wifi_ap); if (ret != RT_EOK) { return ret; } /* register wlan device for sta */ ret = rt_wlan_dev_register(&wlan_sta, RT_WLAN_DEVICE_STA_NAME, &ops, 0, &wifi_sta); if (ret != RT_EOK) { return ret; } { rt_thread_t tid; /* Create package parse thread */ tid = rt_thread_create("wifi_handle", wifi_data_process_thread_entry, &rw007_spi, 2048, 8, 20); if(!tid) { return -RT_ERROR; } rt_thread_startup(tid); /* Create wifi transfer thread */ tid = rt_thread_create("wifi_xfer", spi_wifi_data_thread_entry, RT_NULL, 2048, 9, 20); if(!tid) { return -RT_ERROR; } rt_thread_startup(tid); } spi_wifi_hw_init(); return RT_EOK; } ``` rt_hw_wifi_init负责创建WIFI数据处理线程,函数如下: ```c rt_err_t rt_hw_wifi_init(const char *spi_device_name) { static struct rt_wlan_device wlan_sta, wlan_ap; rt_err_t ret; wifi_sta.wlan = &wlan_sta; wifi_sta.hspi = &rw007_spi; wifi_ap.wlan = &wlan_ap; wifi_ap.hspi = &rw007_spi; /* align and struct size check. */ RT_ASSERT((SPI_MAX_DATA_LEN & 0x03) == 0); memset(&rw007_spi, 0, sizeof(struct rw007_spi)); rw007_spi.spi_device = (struct rt_spi_device *)rt_device_find(spi_device_name); if (rw007_spi.spi_device == RT_NULL) { LOG_E("spi device %s not found!\r", spi_device_name); return -RT_ENOSYS; } /* config spi */ { struct rt_spi_configuration cfg; cfg.data_width = 8; cfg.mode = RT_SPI_MODE_0 | RT_SPI_MSB; /* SPI Compatible: Mode 0. */ cfg.max_hz = RW007_SPI_MAX_HZ; /* 15M 007 max 30M */ rt_spi_configure(rw007_spi.spi_device, &cfg); } /* init spi send mempool */ rt_mp_init(&rw007_spi.spi_tx_mp, "spi_tx", &rw007_spi.spi_tx_mempool[0], sizeof(rw007_spi.spi_tx_mempool), sizeof(struct spi_data_packet)); /* init spi send mailbox */ rt_mb_init(&rw007_spi.spi_tx_mb, "spi_tx", &rw007_spi.spi_tx_mb_pool[0], SPI_TX_POOL_SIZE, RT_IPC_FLAG_PRIO); /* init spi recv mempool */ rt_mp_init(&rw007_spi.spi_rx_mp, "spi_rx", &rw007_spi.spi_rx_mempool[0], sizeof(rw007_spi.spi_rx_mempool), sizeof(struct spi_data_packet)); /* init spi recv mailbox */ rt_mb_init(&rw007_spi.spi_rx_mb, "spi_rx", &rw007_spi.spi_rx_mb_pool[0], SPI_RX_POOL_SIZE, RT_IPC_FLAG_PRIO); /* init spi data notify event */ rt_event_init(&spi_wifi_data_event, "wifi", RT_IPC_FLAG_FIFO); rw007_spi.rw007_cmd_event = rt_event_create("wifi_cmd", RT_IPC_FLAG_FIFO); /* register wlan device for ap */ ret = rt_wlan_dev_register(&wlan_ap, RT_WLAN_DEVICE_AP_NAME, &ops, 0, &wifi_ap); if (ret != RT_EOK) { return ret; } /* register wlan device for sta */ ret = rt_wlan_dev_register(&wlan_sta, RT_WLAN_DEVICE_STA_NAME, &ops, 0, &wifi_sta); if (ret != RT_EOK) { return ret; } { rt_thread_t tid; /* Create package parse thread */ tid = rt_thread_create("wifi_handle", wifi_data_process_thread_entry, &rw007_spi, 2048, 8, 20); if(!tid) { return -RT_ERROR; } rt_thread_startup(tid); /* Create wifi transfer thread */ tid = rt_thread_create("wifi_xfer", spi_wifi_data_thread_entry, RT_NULL, 2048, 9, 20); if(!tid) { return -RT_ERROR; } rt_thread_startup(tid); } spi_wifi_hw_init(); return RT_EOK; } ``` 后面就是进行WIFI 的连接断开,扫描等操作。 关于WiFi的更多信息,请参看官方手册: [WiFi](https://www.rt-thread.org/document/site/programming-manual/device/wlan/wlan/) [完整代码地址](https://gitee.com/ouxiaolong/RW007)
--- ------------ ### 欢迎访问我的网站 [BruceOu的哔哩哔哩](https://space.bilibili.com/338944611) [BruceOu的主页](https://www.bruceou.cn/) [BruceOu的博客](https://blog.bruceou.cn/) [BruceOu的CSDN博客](https://blog.csdn.net/bruceoxl) --- ### 欢迎订阅我的微信公众号 ![在这里插入图片描述](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)
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
BruceOu
这家伙很懒,什么也没写!
文章
27
回答
0
被采纳
0
关注TA
发私信
相关文章
1
wlan设备测试,除了rw007模块,还有哪些可以测试?
2
rw007 开机进不了spi模式
3
RW007wifi模块扫描热点超时的问题
4
stm32f429+RW007 初始化一直失败???
5
RW007 TCP发送数据出现瞬间卡顿问题,请问是怎么回事?
6
关于K210使用RW007的注意
7
RW007 没有作为从机连接手机的例子吗?
8
RW007 运行异常
9
RW007 wifi 模块中断回环电阻的作用?
10
RW007模块有Arduino开发板上的例程吗?
推荐文章
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
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部