打印
[活动]

《Nordic nRF7002开发板试用体验---5GHzWifi连接》

[复制链接]
197|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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/


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

164

帖子

2

粉丝