[经验分享] 【平头哥RVB2601创意应用开发】3、wifi网络通信

xinmeng_wit   2022-4-2 14:50 楼主

一、概述

 

RVB2601是基于平头哥生态芯片CH2601的一款开发板,板载JTAG调试器,WIFI&BLE芯片W800,音频ADC,音频DAC,OLED,RGB,用户按键等。

W800芯片的存在决定了RVB2601是能够进行WiFi无线通信的。

其实W800本身是一个支持wifi的无线MCU,其联网并不依赖与ch2601芯片。

开发板板载W800就是为了让开发板具有wifi的功能,可以理解为平头哥CH2601芯片外挂了一颗wifi芯片。

W800与CH2601之间是通过SPI进行交互的。

 

二、硬件原理图

 

1.png

W800芯片除了与CH2601进行SPI连接以外,还引出了swd的烧录口,同时还是UART。

也就是说,RVB2601开发板不仅能够对CH2601主芯片进行程序下载和调试,还能对W800进行程序下载和调试,两块MCU可以进行独立开发。

 

三、WIFI收发测试

 

RVB2601开发板官方适配了几个典型的demo程序,其中webplayer是与联网相关的demo,可以直接在这个demo的基础上进行修改。

 

2.png

webplayer这个demo是能够成功联网并播放在线音乐的,说明这个代码已经帮我们把网络这块的初始化已经做好了。

我们只需要根据我们自己的需求进行修改就可以了。

 

代码里进行网络的配置是在static void network_init()里面做的。

其中需要修改两个地方:

①netmgr_config_wifi函数配置网络的ssid和密码需要改成直接路由器的ssid和密码,这样在进行W800初始化的时候就能直接连接上路由器。

②调用W800的api函数w800_packet_input_cb_register进行接收回调函数的注册

 

3.png

修改完以后,需要自己实现回调函数:

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联网成功以后才能去调用。

所以我把它放在了这里进行调用:

4.png

到这里就已经可以进行数据的收发了。

为了方便进行数据的发送,可以使用命令行的方式来触发发送:


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"

 

编译下载测试:

上电:

5.png

说明网络连接成功,并且连接服务器成功。

 

数据发送与接收:

 

6.png

通过测试,发送与接收都能够成功。

在此,参考了两篇优秀博文,感谢两位博主。

博文链接:

RVB2601评估板试用3: 以太网通讯测试

【平头哥RVB2601开发板试用体验】WiFi无线通信

 

 

本帖最后由 xinmeng_wit 于 2022-4-2 16:42 编辑

回复评论 (10)

感谢分享,你这篇写得通俗易懂,我立马就想抄作业。谢谢!
点赞  2022-4-2 16:13
引用: lugl4313820 发表于 2022-4-2 16:13 感谢分享,你这篇写得通俗易懂,我立马就想抄作业。谢谢!

我也是参考了很多优秀博文,也是按照他们的思路做的,站在巨人的肩膀上。

点赞  2022-4-2 16:39

我引用#include "w800_api.h" 提示说找到不文件,我看了库文件,包含:#include <devices/w800.h>。是不是我们用的不是同一个包呀。。。

点赞  2022-4-2 17:34
引用: lugl4313820 发表于 2022-4-2 17:34 我引用#include "w800_api.h" 提示说找到不文件,我看了库文件,包含:#include <devices/w800.h> ...

要在CDK里面添加文件包含路径

点赞  2022-4-2 19:59
引用: 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]

非常感谢您的分享,我终于调通了。

点赞  2022-4-2 20:41

image.png

再次感谢,我还想问一下,你是重写了printf吗?还是用LOG也可以,用LOG,不能条一行。。。 

点赞  2022-4-2 20:43

再想问一句,如果对W800进行编程的话,跳线怎么弄,我感觉我的项目,RVB2601串口资源不够用。。。死了,死了。

点赞  2022-4-2 20:45
引用: lugl4313820 发表于 2022-4-2 20:43 再次感谢,我还想问一下,你是重写了printf吗?还是用LOG也可以,用LOG,不能条一行。。。 

没有重写,直接用就行,demo代码已经重定向好了,LOG里面其实也是调的printf

点赞  2022-4-2 20:51
引用: xinmeng_wit 发表于 2022-4-2 19:59 要在CDK里面添加文件包含路径

具体怎么添加?

点赞  2022-5-2 22:16
引用: symic 发表于 2022-5-2 22:16 具体怎么添加?

屏幕截图 2022-05-03 173409.png

屏幕截图 2022-05-03 173531.png

点赞  2022-5-3 17:36
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复