完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、概述
1、平头哥RVB2601开发板,板载资源W800是一颗WiFi/蓝牙SoC芯片。具备高性能、高集成度,高安全级别、高扩展性、体积小、易开发等优势。芯片封装尺寸4mm*4mm,采用平头哥玄铁804(32位)CPU内核,最高主频达到240MHz;内置TEE安全引擎,为芯片提供了高性能的核心处理能力及安全可信的执行环境;内置DSP与浮点运算单元,支持2.4G IEEE802.11b/g/n Wi-Fi 标准协议,支持 BT/BLE4.2 蓝牙协议;支持丰富的MCU数字接口。芯片内置2MB Flash,288KB RAM;支持大容量PSRAM的扩展。适用于智能家居、智能家电、无线音视频、智能玩具、工业控制、医疗监护等广泛的物联网应用领域。 2、这颗W800 wifi芯片是套完整的mcu芯片。理论上是不需要ch2601主芯片操心网络通讯方面的事情的,只要向w800发送指令和数据就可以。CH2601通过SPI总线与W800芯片交互使用AT指令通讯。CH2601芯片的系统为了整合多种网络设备,采用分层的方式与系统应用通讯。 3、为支持不同的网络连接芯片类型和多元的应用场景,YoC平台提供一套完善的网络框架。该框架主要分为四层架构,分别为网络应用层、网络接口层、网络芯片驱动层和底层外设驱动层。 二、测试W800连接 1、改跳线,查看原理图,检查W800调试串口接线,图中J4排针3、4是串口转USB接口,默认连接到1、2分别是CH2601串口0的RX和TX,把短接片取下,连接到5、6即W800串口0的RX和TX,这样更改以后,就可以通过电脑上的Serial Pane,显示W800调试信息 2、设置调试串口,在CDK的Serial Pane窗口,右键设置串口Port为cp21x对应端口,其他参数默认,确定 3、设备连接成功,显示以下信息,提示wifi failed,默认的wifi路由器接入点和密码:[netmgr_wifi]ssid{CSKY-T}, psk{test1234}。 Connected. [ 110.427352][I][netmgr_wifi]ssid{CSKY-T}, psk{test1234} [ 130.426123][D][WIFI ]wifi failed [ 130.430761][E][at_server_init]spi peer may not be ready [ 130.436078][D][app_net ]Net down [ 130.439322][D][app_net ]net reset cnt 5 4、测试AT指令,AT+FWVER,查看固件版本号 返回AT+FWVER:Command not found. 这个w800已经烧写了固件,AT指令和数据交换是通过SPI接口进行的,此串口只能用作打印调试信息。 三、管理网络设备,建立WIFI连接 1、新建一个WorkSpace,导入CH2601_SDK包中的ch2601_webplayer_demo示例程序到项目,并更改名称,打开Packages文件夹,下载缺失的组件 2、为了能够使用wifi联网就需要调用netmgr的API,首先需要初始化w800网络连接,在init.c文件中找到network_init(),更改接入点。 void w800_in(int linkid, void *data, size_t len, char remote_ip[16], uint16_t remote_ports) { uint8_t* d; d=(uint8_t *)data; printf("data:%x,%x,%x,%x,%x",d[0],d[1],d[2],d[3],d[4]); } typedef void (*net_data_input_cb_t)(int linkid, void *data, size_t len, char remote_ip[16], uint16_t remote_ports); extern int w800_packet_input_cb_register(net_data_input_cb_t cb); //net_data_input_cb_t cb = &w800_in; extern int w800_module_init(utask_t *task, w800_wifi_param_t *param); static void network_init() { w800_wifi_param_t w800_param; /* init wifi driver and network */ w800_param.reset_pin = PA21; w800_param.baud = 1*1000000; w800_param.cs_pin = PA15; w800_param.wakeup_pin = PA25; w800_param.int_pin = PA22; w800_param.channel_id = 0; w800_param.buffer_size = 4*1024; wifi_w800_register(NULL, &w800_param); app_netmgr_hdl = netmgr_dev_wifi_init(); if (app_netmgr_hdl) { utask_t *task = utask_new("netmgr", 2 * 1024, QUEUE_MSG_COUNT, AOS_DEFAULT_APP_PRI); netmgr_service_init(task); //netmgr_config_wifi(app_netmgr_hdl, "TEST", 4, "TEST1234", 10); w800_module_init(task, &w800_param); w800_packet_input_cb_register(&w800_in); netmgr_start(app_netmgr_hdl); } } 函数说明: w800_in(int linkid, void *data, size_t len, char remote_ip[16], uint16_t remote_ports)当模块接收到数据时,作为回调函数,数量数据,这里仅简单地把数据打印出来。 netmgr_dev_wifi_init()注册netmgr_dev_t结构中的provision配网等回调函数,打开已注册的wifi设备节点,调用该设备实现的hal层初始化接口,并将该设备加入到网络设备列表中统一管理。返回值:调用失败时返回NULL。 netmgr_service_init(task) 初始化网络管理微服务,若外部微任务task为空,则内部创建微任务,将微服务加入到微任务中。 netmgr_config_wifi(app_netmgr_hdl, "er_suo_shang_zhan", 17, "", 0),配置无线设备的ssid名称和对应的秘钥psk,更改为所在连接路由器账号和密码er_suo_shang_zhan、无密码。 netmgr_start(app_netmgr_hdl),当网络参数配置后,就可以调用该接口使能指定网络设备开始正常工作。该函数最终会调用到对应网络设备初始化配置的provision配网回调。该接口是非阻塞的,网络连接成功后,网络管理器会上报EVENT_NETMGR_GOT_IP事件,否则上报EVENT_NETMGR_NET_DISCON事件。应用开发者可通过event_subscribe接口订阅这两个消息来判断网络是否连接成功。用户也可通过调用netmgr_is_gotip判断是否正常获取到ip。 w800_module_init(task, &w800_param);初始化w800模块,启动监听连接断开,收到数据等事件。 w800_packet_input_cb_register(&w800_in);注册接收数据回调函数。 3、事件服务初始化,网络连接,注册事件。 event_service_init(NULL); network_init(); event_subscribe(EVENT_NETMGR_GOT_IP, network_event, NULL); event_subscribe(EVENT_NETMGR_NET_DISCON, network_event, NULL); 4、恢复J4排针3、4串口转USB接口,连接到1、2分别是CH2601串口0的RX和TX。 5、查看网络连接信息,获取IP成功。 [ 1.760] [ 1.760] [ 1.780] [ 1.790]netmgr start wifi [ 2.550] [ 2.560]atparser line(+CME ERROR:50), format(OK%n), count=-1 [ 2.560] [ 2.690]netmgr IP: 192.168.5.134 [ 2.700] 6、测试cli命令行,输入help ====Build-in Commands==== ====Support 4 cmds once, seperate by ; ==== help : print this sysver : system version reboot : reboot system time : system time p : print memory m : modify memory echo : echo for command exit : close CLI devname : print device name ====User Commands==== ping : ping command. ifconfig : network config kv : kv tools ps : show tasks free : show memory info factory : set/get factory info sys : sys comand attest : at client test 从命令列表来看,可以用ifconfig命令配置网络连接参数,在此我们不用ifconfig命令,而是使用程序中介绍的netmgr_start(app_netmgr_hdl),attest命令是用户自定义命令,我用来启动收发数据。 四、使用sal接口通信 1、tcp通讯程序,参考occ社区的优秀博文,RVB2601评估板试用3: 以太网通讯测试,文章介绍了TCPClient和命令行调用的测试,经过实践,证明是可以用的。 我用串口调试助手SSCOM 打开一个TCPServer, wifi连接成功后,命令行输入tcptest,建立socket,连接server,发送数据 [ 18.310] [ 18.310] [ 18.320] [ 18.660] [ ID] Interval Transfer Bandwidth [ 18.680] [ 18.720] [ 18.830] 2、接收数据 使用轮询的方法接收数据,在while(1)循环中调用recv(),这里要注意一下,需要包含头文件“sockets.h”。 中断的方法,本人还不知道,有知道的兄弟,麻烦请告知一下!! 五、使用w800_api接口通信 1、在主函数文件中自定义控制台命令,调用w800_api.c外部函数,以便在控制台进行测试 extern int w800_software_reset(void); extern int w800_ap_info(char ssid[32], int bssid[6], int *channel, int *rssi); extern int w800_get_status(int *stat); extern int w800_connect_srv(char *srvname, uint16_t port); extern int w800_send_data(const uint8_t *pdata, int len,int timeout); static void cmd_at_client_handler(char *wbuf, int wbuf_len, int argc, char **argv) { char ssid[32]; int bssid[6]; int channel; int rssi; w800_ap_info( ssid, bssid , &channel, &rssi); printf("ssid: %srn", ssid); printf("channel: %drn", channel); printf("rssi: %drn", rssi); int stat; w800_get_status( &stat); //[ 16.360] char *srvname="192.168.12.6"; uint16_t port = 3333; w800_connect_srv(srvname, port); const uint8_t pdata[5]={0,1,55,3,2}; int len=5; int timeout=120; w800_send_data(pdata, len, timeout); } #include int cli_reg_cmd_at(void) { static const struct cli_command at_cmd_info = { "attest", "at client test", cmd_at_client_handler, }; aos_cli_register_command(&at_cmd_info); return 0; } 2、在w800_api.c中加入连接服务器的程序,以简化调用参数 int w800_connect_srv(char *srvname, uint16_t port) { int ret = -1; ret = w800_connect_remote(0, NET_TYPE_TCP_CLIENT, srvname, port); return ret; } 3、定义接收到数据时的处理程序,并注册到回调,这样的话就能够及时通信,相当于接收中断调用 void w800_in(int linkid, void *data, size_t len, char remote_ip[16], uint16_t remote_ports) { uint8_t* d; d=(uint8_t *)data; printf("data:%x,%x,%x,%x,%x",d[0],d[1],d[2],d[3],d[4]); } typedef void (*net_data_input_cb_t)(int linkid, void *data, size_t len, char remote_ip[16], uint16_t remote_ports); extern int w800_packet_input_cb_register(net_data_input_cb_t cb); net_data_input_cb_t cb = &w800_in; 4、编译后下载到开发板,打开串口面板,连接,用串口调试助手SSCOM 打开一个TCPServer,在命令行输入attest,查看效果 [2811.060] [2812.110] [2812.150] 服务端收到数据 客户端接收到数据 六、总结 RVB2601开发板的功能丰富,软件也很好用,缺点是资料太少了,比如说我在使用这个drv_wifi_at_w800模块之前,学习了w800的资料,那是用串口at指令,但是在RVB2601上,多了一层spi接口.......(此处省略1000字),还好,功夫不负有心人,经过仔细查阅源代码,终于调通了!最后,还是要赞一个,RVB2601开发板挺牛的!! |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
【平头哥Sipeed LicheeRV 86开发板试用体验】Waft初体验
15662 浏览 1 评论
13712 浏览 4 评论
【平头哥Sipeed LicheeRV 86开发板试用体验】四、烧写waft系统&搭建waft测试环境
19629 浏览 2 评论
59037 浏览 19 评论
【限时福利】加入芯片开发社区,领100G电子工程师资料大礼包
87765 浏览 121 评论
邀请函 | 3月2日 来上海参加平头哥“玄铁RISC-V生态大会”
746浏览 0评论
读书分享会 | 玄铁RISC-V处理器入门与实战电子书免费下载!
643浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 18:36 , Processed in 0.684727 second(s), Total 63, Slave 48 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号