[MCU] 平頭哥RVB2601板子-NETMGR與WIFI

bigbat 樓主
2021-9-5 10:43
本帖最后由 bigbat 于 2021-9-5 15:38 編輯

CH2601開發板中集成有W800 wifi芯片,這顆芯片是套完整的mcu芯片。理論上是不需要ch2601主芯片操心網絡通訊方面的事情的,只要向w800發送指令和數據就可以。CH2601用過SPI總線與W800芯片交互使用AT指令通訊。CH2601芯片的系統為了整合多種網絡設備,采用分層的方式與系統應用通訊。

net_arch.png 從圖上可以看出:為支持不同的網絡連接芯片類型和多元的應用場景,YoC平臺提供一套完善的網絡框架。該框架主要分為四層架構,分別為網絡應用層、網絡接口層、網絡芯片驅動層和底層外設驅動層。

網絡接口層主要分為兩個通道。一是數據通道,其負責網絡數據的發送和接收。其可通過調用套接字適配層SAL或LWIP接口來實現,并對上層提供一組標準的 BSD 套接字 API。二是管理通道,即網絡管理器netmgr,其負責所有網絡的聯網、連接、管理、狀態查詢等功能。

當前YoC平臺支持多種不同的網絡芯片類型,如esp8266、rtl8723ds、GPRS等。網絡芯片驅動層提供了具體芯片的網絡層、鏈路層及驅動相關的接口對接,以滿足網絡接口層的需求。

網絡芯片可能是通過SDIO、AT等接口外接的。底層外設驅動層用于實現主控芯片和外接網絡芯片的數據交互需求。

這其中的網絡管理器就是wifi連接和管理的核心(netmgr),網絡管理器負責所有網絡的聯網管理功能,具體如下:

  • 鏈路層的開啟/初始化/配置/復位等
  • 鏈路層設備信息的獲取
  • 鏈路層事件的處理和轉發(linkup,linkdown)
  • 網絡IP的配置(DHCP或者靜態IP)

為了能夠使用wifi聯網就需要調用netmgr的API,下面我就此過程進行測試:

1、首先需要初始化w800網絡連接

2、管理連接,注冊事件。

3、進行網絡通訊

如何初始化W800芯片,我參考了web播放器的例程代碼。

#include <drv/pin.h>
#include <devices/w800.h>

netmgr_hdl_t app_netmgr_hdl;

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, "test123456", 10);
        netmgr_start(app_netmgr_hdl);
    }
}

注意其中的include文件,在官方的資料中的例程很多都沒有介紹如何引用。

netmgr_config_wifi(app_netmgr_hdl, "test", 4, "test123456", 10);

其中的被注釋的語句就是wifi的ssid和聯網密碼。只要調用該函數就可以連接到網絡上了。此時就可以ping通網絡了。

如何管理連接也是十分重要的程序,如果連接斷網或是出現什么情況需要重連等等處理,如何管理就需要使用系統事件了。

/* network event callback */
void user_local_event_cb(uint32_t event_id, const void *param, void *context)
{
    char url[128];
    if (event_id == EVENT_NETMGR_GOT_IP) { // 網絡連接成功
        printf("Net up");
    } else if (event_id == EVENT_NETMGR_NET_DISCON) {
        if ((int)param == NET_DISCON_REASON_DHCP_ERROR) {
            printf("Net down"); 
            netmgr_reset(netmgr_get_handle("wifi"), 30); // 本次網絡連接失敗,30s后自動重連
        }
    }
}


int main(void)
{
    board_yoc_init();
	event_service_init(NULL);                     // 發布訂閱服務初始化
    LOGD(TAG, "%s\n", aos_get_app_version());
    oled_init();
	network_init();
	
	/* Subscribe */
    event_subscribe(EVENT_NETMGR_GOT_IP, user_local_event_cb, NULL); // 訂閱網絡連接成功事件
    event_subscribe(EVENT_NETMGR_NET_DISCON, user_local_event_cb, NULL); // 訂閱網絡連接失敗事件
	
    while (1) {
        LOGD(TAG, "Hello world! YoC");
        aos_msleep(1000);
    }

    return 0;
}

上面的代碼不復雜,主要就是三點,

1、構造一個事件函數,處理事件

2、注冊事件函數,event_subscribe(EVENT_NETMGR_GOT_IP, user_local_event_cb, NULL); // 訂閱網絡連接成功事件

3、初始化事件函數,event_service_init(NULL); // 發布訂閱服務初始化

這句很重要,如果沒有整個系統就會停滯,系統也會不運行。

整個聯網過程就此完成。后面我會測試如何使用網絡高層接口編寫應用。

image.png  可以看到網絡啟動的事件消息,"Net up"和IP地址“192.168.1.104”

回復評論 (2)

沙發 Jacktang

2021-9-5 21:26

把wifi連接和管理的核心(netmgr)的網絡管理器負責所有網絡的聯網管理功能講的很清楚明白,謝謝

板凳 w494143467

2021-9-7 11:52

感覺操作挺便捷的!

電子工程世界版權所有 京B2-20211791 京ICP備10001474號-1 京公網安備 11010802033920號
    我也要說兩句
    發送
    評論
    萝卜大香蕉