1、介绍
其实很早之前就有看到Nordic的WIFI芯片,最近看到有测评,就想着申请来测评一下,之前也一直在用Nordic 的BLE芯片,不知道WIFI芯片是否有BLE芯片一样惊艳。
2、安装环境
首先论坛大佬以及有人安装好环境,我就照着他们按照就好了,按照很简单,科学上网很重要!
首先去Nordic官网下载【nRF Connect for Desktop】开发软件,类似一个开发工具集合:
【https://www.nordicsemi.com/Products/Development-tools/nRF-Connect-for-desktop/Download】
然后去下载命令行工具【nRF Command Line Tools】,为了在VSCode中能开发:
【https://www.nordicsemi.com/Products/Development-tools/nRF-Command-Line-Tools/Download】
都一直下一步安装就行,安装完成后打开【nRF Connect for Desktop】,选择【Toolchain Manager】工具进行安装,这个工具是按照SDK包和编译环境的。
【Toolchain Manager】打开之后,选择其中一个SDK安装就行,安装最新的就好了,这里就需要用到科学上网,否则安装出来的环境是会缺少很多文件的,会导致后面VSCode中编译不了。
如果包没安装全,可以尝试用这个进行更新。
最后就是在VSCode安装环境了,打开VSCode安装插件,只需要安装一个集合包即可。
安装完成之后就可以打开,SDK的例程了,默认是【C:\ncs\v2.4.1\zephyr\samples】,在这个目录打开对应的项目即可。
打开项目后,在操作里面进行编译(Build),下载(Flash)就可以了。
3、WIFI连接测试
选择WIFI连接的例程,我的路径如下【F:\ncs\v2.4.1\nrf\samples\wifi\sta】,打开之后需要修改要连接的路由器SSID和密码,如下图一样修改。
编译下载,就可以正常连接WIFI了。
怎么看WIFI的IP呢,点击连接打开LOG输出,连接【VCOM1】就可以看到WIFI连接情况了,直接用串口调试助手也是可以的。
我这边直接用sscom5连接串口,就看到下面的LOG输出了。
这时候,使用电脑Ping一下这个IP,可以看到下面的结果。
延时还是有一些的,不过也不是很高,和ESP32差不多。
4、Demo设计
WIFI连接例程的SSID和密码是固定的,不能修改,所以准备做一个通过串口输入WIFI名和密码连接指定WIFI。
代码基础采用上面的WIFI连接作为基础,首先添加一个WIFI的扫描功能,例程是【F:\ncs\v2.4.1\nrf\samples\wifi\scan】,将扫描的代码拷贝过来,主要是以下部分。
添加事件和添加返回值。
下面是定义的要连接的WIFI名、密码和扫描的WIFI列表。
之后添加WIFI扫描的函数,因为需要存储WIFI扫描SSID的内容,这里在扫描时将WIFI的SSID添加在数组中。
然后修改事件函数的事件接收。
然后在主函数的wihle前面添加下面语句即可。
wifi_scan();
串口例程的路径【F:\ncs\v2.4.1\zephyr\samples\drivers\uart\echo_bot】。
之后就是添加串口功能,首先要打开串口接收中断。
然后添加串口的头文件。
在主函数中添加串口的初始化。
添加串口函数。
/* change this to any other UART peripheral if desired */
#define UART_DEVICE_NODE DT_CHOSEN(zephyr_shell_uart)
#define MSG_SIZE 32
/* queue to store up to 10 messages (aligned to 4-byte boundary) */
K_MSGQ_DEFINE(uart_msgq, MSG_SIZE, 10, 4);
static const struct device *const uart_dev = DEVICE_DT_GET(UART_DEVICE_NODE);
/* receive buffer used in UART ISR callback */
static char rx_buf[MSG_SIZE];
static int rx_buf_pos;
/*
* Read characters from UART until line end is detected. Afterwards push the
* data to the message queue.
*/
void serial_cb(const struct device *dev, void *user_data)
{
uint8_t c;
if (!uart_irq_update(uart_dev)) {
return;
}
if (!uart_irq_rx_ready(uart_dev)) {
return;
}
/* read until FIFO empty */
while (uart_fifo_read(uart_dev, &c, 1) == 1) {
if ((c == '\n' || c == '\r') && rx_buf_pos > 0) {
/* terminate string */
rx_buf[rx_buf_pos] = '\0';
/* if queue is full, message is silently dropped */
k_msgq_put(&uart_msgq, &rx_buf, K_NO_WAIT);
/* reset the buffer (it was copied to the msgq) */
rx_buf_pos = 0;
} else if (rx_buf_pos < (sizeof(rx_buf) - 1)) {
rx_buf[rx_buf_pos++] = c;
}
/* else: characters beyond buffer size are dropped */
}
}
/*
* Print a null-terminated string character by character to the UART interface
*/
void print_uart(char *buf)
{
int msg_len = strlen(buf);
for (int i = 0; i < msg_len; i++) {
uart_poll_out(uart_dev, buf[i]);
}
}
之后在WIFI扫描和While中间添加上提示,让输入WIFI的SSID和密码,具体实现代码。
while(k_msgq_get(&uart_msgq, &tx_buf, K_FOREVER) == 0)
{
if(tx_buf[0] != 0x0A)
{
printk("Rec:%s %d\n", tx_buf, strlen(tx_buf));
for(int i = 0;i < wifiListCnt;i++)
{
if(memcmp(wifiList[i], tx_buf, strlen(tx_buf)) == 0)
{
memcpy(mySSID, tx_buf, strlen(tx_buf));
break;
}
}
}
else
{
printk("Rec:%s %d\n", &tx_buf[1], strlen(tx_buf) - 1);
for(int i = 0;i < wifiListCnt;i++)
{
if(memcmp(wifiList[i], &tx_buf[1], strlen(tx_buf)) == 0)
{
memcpy(mySSID, &tx_buf[1], strlen(tx_buf));
break;
}
}
}
memset(tx_buf, 0, 32);
if(mySSID[0] != 0)
break;
printk("SSID error!");
}
printk("Please enter the WiFi password:");
while(k_msgq_get(&uart_msgq, &tx_buf, K_FOREVER) == 0)
{
printk("Rec:%s %d\n", &tx_buf[1], strlen(tx_buf) - 1);
memcpy(myPassword, &tx_buf[1], strlen(tx_buf) - 1);
memset(tx_buf, 0, 32);
break;
}
k_sleep(K_SECONDS(2));
print_uart("Start connecting...");
最后修改WIFI连接函数即可。
这样就完成了通过串口连接指定WIFI的Demo了。
5、总结
nRF7002DK设计起来整体是不难的,环境安装主要注意科学上网即可,例程给的也很多,不过是多种开发板的集合,**可以标注nRF7002专用的,毕竟和BLE还是有些区别的。再提一个建议就是**可以在一些TCP、UDP和MQTT等这些WIFI专用的例程中,将WIFI连接的功能加上,毕竟要测试这些功能是一定要连接WIFI才能完成的。也非常感谢21IC举行的活动,也**Nordic在WIFI的道路上能越走越远,越做越好!
Demo的演示视频:https://www.bilibili.com/video/BV1hm4y1u7Fg/
|