一、概述
RVB2601是基于平头哥生态芯片CH2601的一款开发板,板载JTAG调试器,WIFI&BLE芯片W800,音频ADC,音频DAC,OLED,RGB,用户按键等。
W800芯片的存在决定了RVB2601是能够进行WiFi无线通信的。
其实W800本身是一个支持wifi的无线MCU,其联网并不依赖与ch2601芯片。
开发板板载W800就是为了让开发板具有wifi的功能,可以理解为平头哥CH2601芯片外挂了一颗wifi芯片。
W800与CH2601之间是通过SPI进行交互的。
二、硬件原理图
W800芯片除了与CH2601进行SPI连接以外,还引出了swd的烧录口,同时还是UART。
也就是说,RVB2601开发板不仅能够对CH2601主芯片进行程序下载和调试,还能对W800进行程序下载和调试,两块MCU可以进行独立开发。
三、WIFI收发测试
RVB2601开发板官方适配了几个典型的demo程序,其中webplayer是与联网相关的demo,可以直接在这个demo的基础上进行修改。
webplayer这个demo是能够成功联网并播放在线音乐的,说明这个代码已经帮我们把网络这块的初始化已经做好了。
我们只需要根据我们自己的需求进行修改就可以了。
代码里进行网络的配置是在static void network_init()里面做的。
其中需要修改两个地方:
①netmgr_config_wifi函数配置网络的ssid和密码需要改成直接路由器的ssid和密码,这样在进行W800初始化的时候就能直接连接上路由器。
②调用W800的api函数w800_packet_input_cb_register进行接收回调函数的注册
修改完以后,需要自己实现回调函数:
void w800_data_receive_callback(int linkid, void *data, size_t len, char remote_ip[16], uint16_t remote_ports)
{
uint8_t *buf;
buf = (uint8_t *)data;
if(len == 0)
{
return;
}
printf("receive data len: %d\r\n",len);
printf("receive data:");
for(uint16_t i = 0; i < len; i++)
{
printf("%c ",buf);
}
printf("\r\n");
}
回调函数里面,我就把接收数据的长度,和接收到的数据打印出来。
接收做好以后,那还有一个问题:我们需要将W800连接到一个指定的服务器才能进行数据交互。
所以就有了下面的函数,将W800连接到对应的TCP服务器上:
同样是调用W800的api接口
void connect_tcp_server(char *server_ip, uint16_t port)
{
char ssid[32];
int bssid[6];
int channel;
int rssi;
w800_ap_info( ssid, bssid , &channel, &rssi);
printf("ssid: %s\r\n", ssid);
printf("channel: %d\r\n", channel);
printf("rssi: %d\r\n", rssi);
w800_connect_remote(0, NET_TYPE_TCP_CLIENT, server_ip, port);
}
要注意connect_tcp_server()函数只有在W800联网成功以后才能去调用。
所以我把它放在了这里进行调用:
到这里就已经可以进行数据的收发了。
为了方便进行数据的发送,可以使用命令行的方式来触发发送:
int cli_reg_cmd_at(void)
{
static const struct cli_command at_cmd_info = {
"tcp_client_test",
"tcp client test",
cmd_at_client_handler,
};
aos_cli_register_command(&at_cmd_info);
return 0;
}
发送函数:
static void cmd_at_client_handler(char *wbuf, int wbuf_len, int argc, char **argv)
{
const uint8_t pdata[] = "Hello RVB2601!\r\n";
int len = sizeof(pdata);
int timeout=120;
w800_send_data(pdata, len, timeout);
}
注意:以上调用W800接口的地方都需要包含#include "w800_api.h"
编译下载测试:
上电:
说明网络连接成功,并且连接服务器成功。
数据发送与接收:
通过测试,发送与接收都能够成功。
在此,参考了两篇优秀博文,感谢两位博主。
博文链接:
本帖最后由 xinmeng_wit 于 2022-4-2 16:42 编辑
引用: lugl4313820 发表于 2022-4-2 16:13 感谢分享,你这篇写得通俗易懂,我立马就想抄作业。谢谢!
我也是参考了很多优秀博文,也是按照他们的思路做的,站在巨人的肩膀上。
我引用#include "w800_api.h" 提示说找到不文件,我看了库文件,包含:#include <devices/w800.h>。是不是我们用的不是同一个包呀。。。
引用: lugl4313820 发表于 2022-4-2 17:34 我引用#include "w800_api.h" 提示说找到不文件,我看了库文件,包含:#include <devices/w800.h> ...
要在CDK里面添加文件包含路径
引用: xinmeng_wit 发表于 2022-4-2 19:59 要在CDK里面添加文件包含路径
谢谢呀,我这里包含#include <devices/w800.h>,编译通过了,就还有一句警告:
app/src/init.c:57:9: warning: implicit declaration of function 'w800_packet_input_cb_register' [-Wimplicit-function-declaration]
非常感谢您的分享,我终于调通了。
再想问一句,如果对W800进行编程的话,跳线怎么弄,我感觉我的项目,RVB2601串口资源不够用。。。死了,死了。
引用: lugl4313820 发表于 2022-4-2 20:43 再次感谢,我还想问一下,你是重写了printf吗?还是用LOG也可以,用LOG,不能条一行。。。
没有重写,直接用就行,demo代码已经重定向好了,LOG里面其实也是调的printf
引用: xinmeng_wit 发表于 2022-4-2 19:59 要在CDK里面添加文件包含路径
具体怎么添加?