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

[复制链接]
1091|0
 楼主| 二哲科技 发表于 2023-9-20 09:48 | 显示全部楼层 |阅读模式
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】。
之后就是添加串口功能,首先要打开串口接收中断。
然后添加串口的头文件。
在主函数中添加串口的初始化。
添加串口函数。
  1. /* change this to any other UART peripheral if desired */
  2. #define UART_DEVICE_NODE DT_CHOSEN(zephyr_shell_uart)

  3. #define MSG_SIZE 32

  4. /* queue to store up to 10 messages (aligned to 4-byte boundary) */
  5. K_MSGQ_DEFINE(uart_msgq, MSG_SIZE, 10, 4);

  6. static const struct device *const uart_dev = DEVICE_DT_GET(UART_DEVICE_NODE);

  7. /* receive buffer used in UART ISR callback */
  8. static char rx_buf[MSG_SIZE];
  9. static int rx_buf_pos;


  10. /*
  11. * Read characters from UART until line end is detected. Afterwards push the
  12. * data to the message queue.
  13. */
  14. void serial_cb(const struct device *dev, void *user_data)
  15. {
  16.         uint8_t c;

  17.         if (!uart_irq_update(uart_dev)) {
  18.                 return;
  19.         }

  20.         if (!uart_irq_rx_ready(uart_dev)) {
  21.                 return;
  22.         }

  23.         /* read until FIFO empty */
  24.         while (uart_fifo_read(uart_dev, &c, 1) == 1) {
  25.                 if ((c == '\n' || c == '\r') && rx_buf_pos > 0) {
  26.                         /* terminate string */
  27.                         rx_buf[rx_buf_pos] = '\0';

  28.                         /* if queue is full, message is silently dropped */
  29.                         k_msgq_put(&uart_msgq, &rx_buf, K_NO_WAIT);

  30.                         /* reset the buffer (it was copied to the msgq) */
  31.                         rx_buf_pos = 0;
  32.                 } else if (rx_buf_pos < (sizeof(rx_buf) - 1)) {
  33.                         rx_buf[rx_buf_pos++] = c;
  34.                 }
  35.                 /* else: characters beyond buffer size are dropped */
  36.         }
  37. }

  38. /*
  39. * Print a null-terminated string character by character to the UART interface
  40. */
  41. void print_uart(char *buf)
  42. {
  43.         int msg_len = strlen(buf);

  44.         for (int i = 0; i < msg_len; i++) {
  45.                 uart_poll_out(uart_dev, buf[i]);
  46.         }
  47. }

之后在WIFI扫描和While中间添加上提示,让输入WIFI的SSID和密码,具体实现代码。
  1.         while(k_msgq_get(&uart_msgq, &tx_buf, K_FOREVER) == 0)
  2.         {
  3.                 if(tx_buf[0] != 0x0A)
  4.                 {
  5.                         printk("Rec:%s %d\n", tx_buf, strlen(tx_buf));
  6.                         for(int i = 0;i < wifiListCnt;i++)
  7.                         {
  8.                                 if(memcmp(wifiList[i], tx_buf, strlen(tx_buf)) == 0)
  9.                                 {
  10.                                         memcpy(mySSID, tx_buf, strlen(tx_buf));
  11.                                         break;
  12.                                 }
  13.                         }
  14.                 }
  15.                 else
  16.                 {
  17.                         printk("Rec:%s %d\n", &tx_buf[1], strlen(tx_buf) - 1);
  18.                         for(int i = 0;i < wifiListCnt;i++)
  19.                         {
  20.                                 if(memcmp(wifiList[i], &tx_buf[1], strlen(tx_buf)) == 0)
  21.                                 {
  22.                                         memcpy(mySSID, &tx_buf[1], strlen(tx_buf));
  23.                                         break;
  24.                                 }
  25.                         }
  26.                 }
  27.                
  28.                 memset(tx_buf, 0, 32);
  29.                 if(mySSID[0] != 0)
  30.                         break;
  31.                 printk("SSID error!");
  32.         }
  33.         printk("Please enter the WiFi password:");

  34.         while(k_msgq_get(&uart_msgq, &tx_buf, K_FOREVER) == 0)
  35.         {
  36.                 printk("Rec:%s %d\n", &tx_buf[1], strlen(tx_buf) - 1);
  37.                 memcpy(myPassword, &tx_buf[1], strlen(tx_buf) - 1);
  38.                 memset(tx_buf, 0, 32);
  39.                 break;
  40.         }

  41.         k_sleep(K_SECONDS(2));


  42.         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/


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

175

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部