SDIO Wi-Fi

1. SWT6621SL 双模 Wi-Fi 模块

1.1 基础软件框架

  • 采用 RTOS 版本的 wpa_supplicant 软件架构,基于 NXP 开源代码二次开发。

  • 数据链路层符合 IEEE 802.11 标准,默认支持 802.11ax。

  • 中间层对接 lwIP 网络协议栈。

  • 上层与 RT-Thread 中的 Wi-Fi WLAN 框架对接,用户只需通过 WLAN 框架接口进行操作。

2. 硬件连接注意事项

  • Wi-Fi 瞬时电流可达到 500 mA,电源设计中需要重点评估供电能力和压降。

  • 当前软件版本暂不支持 BT & Wi-Fi 单天线共存模式,BT 与 Wi-Fi 必须分别使用独立天线电路。

  • 为满足低功耗设计,Host 端需要使用两个 GPIO 引脚监测 Wi-Fi 状态,其中 Wi-Fi 唤醒 Host 的 GPIO 必须具备系统唤醒功能,具体请参考 Wi-Fi 规格书。

  • 当前 SWT6621SL 仅支持通过 SDIO 接口进行驱动。

4. 基本调试指令

调试采用 RT-Thread 的 FinSH 命令行:

指令

功能接口

说明

wifi scan

wifi_scan

扫描周围 Wi-Fi 热点,输出 SSID、MAC 地址、安全类型、信号强度、信道和速率等信息

wifi join

wifi_join

连接指定 Wi-Fi 网络(支持无密码 / 有密码两种格式)

wifi disc

wifi_disconnect

断开当前 Wi-Fi 连接

wifi status

wifi_status

显示 STA 和 AP 模式的详细状态信息(SSID、MAC、信道、速率、RSSI、自动连接状态等)

4.1 wifi scan 命令

日志示例如下:

TX:wifi scan
    wifi scan
    [1600924] NO_TAG: ops_wlan_scan: trigger vendor scan
    msh />
    msh />Scan:(00) 90:98:38:a1:c6:bc, RSSI[-45], SSID[CMCC-7XL4]
    [1601066] NO_TAG: scan_cb: count=1, start=0
    [1601070] NO_TAG: scan_cb: report[0] ssid=CMCC-7XL4 bssid=90:98:38:a1:c6:bc ch=1 rssi=-45
    Scan:(01) 74:ac:b9:c4:10:fa, RSSI[-63], SSID[sifli-employee]
    Scan:(02) 7a:ac:b9:c4:10:fa, RSSI[-61], SSID[sifli-guest]
    Scan:(03) b0:df:c1:b5:a4:49, RSSI[-61], SSID[HEUVAN-I906]
    Scan:(04) b8:3a:08:be:c4:04, RSSI[-65], SSID[Tenda_BEC400]
    Scan:(05) e0:63:da:ba:71:ce, RSSI[-64], SSID[sifli-employee]
    Scan:(06) 1c:68:7e:c3:08:9b, RSSI[-26], SSID[360WiFi-C3089B]
    Scan:(07) fa:0d:ac:d7:9b:ca, RSSI[-57], SSID[DIRECT-CA-HP M329dw LJ]
    Scan:(08) a2:11:d5:50:26:e9, RSSI[-57], SSID[186******71?nova 9]
    Scan:(09) e6:63:da:ba:71:ce, RSSI[-65], SSID[sifli-guest]
    Scan:(10) e0:63:da:ba:71:95, RSSI[-74], SSID[sifli-employee]
    Scan:(11) e6:63:da:ba:71:95, RSSI[-69], SSID[sifli-guest]
    Scan:(12) 64:6e:97:1f:fd:52, RSSI[-69], SSID[MAMO]
    Scan:(13) 24:fb:e3:1e:0f:17, RSSI[-72], SSID[DIRECT-16-Mi All-in-One Inkjet]
    Scan:(14) 00:4b:f3:70:95:af, RSSI[-74], SSID[MERCURY_95AF]
    [1617919] NO_TAG: scan quiet window: fill tail results 1->15
    [1617929] NO_TAG: scan quiet window elapsed, emit SCAN_DONE (total=15)
                 SSID                      MAC            security    rssi chn Mbps
    ------------------------------- -----------------  -------------- ---- --- ----
    CMCC-7XL4                       90:98:38:a1:c6:bc  WPA2_AES_PSK   -45    1    0
    186******71?nova 9            a2:11:d5:50:26:e9  WPA2_AES_PSK   -57    6    0
    DIRECT-CA-HP M329dw LJ          fa:0d:ac:d7:9b:ca  WPA2_AES_PSK   -59    6    0
    MAXUB                           70:c6:dd:69:ed:14  WPA2_AES_PSK   -59   13    0
    MERCURY_95AF                    00:4b:f3:70:95:af  OPEN           -60   13    0
    sifli-guest                     7a:ac:b9:c4:10:fa  WPA2_AES_PSK   -61    1    0
    HEUVAN-I906                     b0:df:c1:b5:a4:49  WPA2_AES_PSK   -61    2    0
    Tenda_BEC400                    b8:3a:08:be:c4:04  WPA2_AES_PSK   -61    6    0
    sifli-guest                     e6:63:da:ba:71:95  WPA2_AES_PSK   -64   11    0
    sifli-employee                  e0:63:da:ba:71:ce  WPA2_AES_PSK   -65    6    0
    sifli-guest                     e6:63:da:ba:71:ce  WPA2_AES_PSK   -65    6    0
    MAMO                            64:6e:97:1f:fd:52  WPA2_AES_PSK   -67   11    0
    sifli-employee                  74:ac:b9:c4:10:fa  WPA2_AES_PSK   -68    1    0
    DIRECT-16-Mi All-in-One Inkjet  24:fb:e3:1e:0f:17  WPA2_AES_PSK   -68   11    0
    sifli-employee                  e0:63:da:ba:71:95  WPA2_AES_PSK   -71   11    0

4.2 wifi join(连接热点)

⚠ 注意:如果在未执行 wifi scan 的情况下直接执行 wifi join,软件会先自动扫描,再发起连接动作。

    wifi join 360WiFi-C3089B sifli123_
    [2951862] NO_TAG: ops_wlan_scan: trigger vendor scan
    msh />
    msh />Scan:(-1) 00:00:00:00:00:00, RSSI[000], SSID[]
    [2952105] NO_TAG: scan_cb: count=0, start=0
    Scan:(00) 70:c6:dd:69:ed:14, RSSI[-63], SSID[MAXUB]
    Scan:(01) 00:4b:f3:70:95:af, RSSI[-66], SSID[MERCURY_95AF]
    Scan:(02) 54:16:51:69:ee:12, RSSI[-77], SSID[yunshigaoke]
    Scan:(03) 74:ac:b9:c4:10:fa, RSSI[-63], SSID[sifli-employee]
    Scan:(04) 7a:ac:b9:c4:10:fa, RSSI[-64], SSID[sifli-guest]
    Scan:(05) 90:98:38:a1:c6:bc, RSSI[-47], SSID[CMCC-7XL4]
    Scan:(06) 6e:aa:7e:fd:73:f8, RSSI[-82], SSID[hid40471129?nova 11 SE]
    Scan:(07) 1c:68:7e:c3:08:9b, RSSI[-25], SSID[360WiFi-C3089B]
    Scan:(08) e0:63:da:ba:71:ce, RSSI[-63], SSID[sifli-employee]
    Scan:(09) b8:3a:08:be:c4:04, RSSI[-62], SSID[Tenda_BEC400]
    Scan:(10) fa:0d:ac:d7:9b:ca, RSSI[-55], SSID[DIRECT-CA-HP M329dw LJ]
    Scan:(11) 76:48:a5:cf:3b:b1, RSSI[-72], SSID[Sifli?iPhone 11]
    Scan:(12) 74:ac:b9:c1:cd:de, RSSI[-59], SSID[74ACB9C0CDDE]
    Scan:(13) e6:63:da:ba:71:ce, RSSI[-64], SSID[sifli-guest]
    Scan:(14) 64:6e:97:1f:fd:52, RSSI[-71], SSID[MAMO]
    [2968955] NO_TAG: scan quiet window: fill tail results 0->15
    [2968965] NO_TAG: scan quiet window elapsed, emit SCAN_DONE (total=15)
    [2968974] NO_TAG: join: use scan security map (wpa3=0,wpa2=1,wpa=1,wep=0) -> type=5
    get_wpa_s_handle 123 ifname: m01,dev->num=2
    get_wpa_s_handle 123 ifname: m01,dev->num=2
    radio_start_next_work 6315 work->type=sme-connect
    [supp_if] wifi_skw_wpa_supp_authenticate 1101
    [supp_if] wifi_skw_wpa_supp_authenticate 1129 params=6098f458
    found ssid=360WiFi-C3089B i=7
    wlan_cmd_tx_frame 2384 ssid=360WiFi-C3089B 25,params=60985e28 size=284,es_len=258
    wlan_cmd_tx_frame 2402 len=258
    wlan_skw_htinfo 2334 ht_oper->field1=5
    ctx: 0, bind
    invalid lmac id: 0
    [supp_if] wifi_skw_wpa_supp_authenticate 1132 params=6098f458,params->auth_alg=1,params->auth_data_len=0
    [supp_if] wifi_skw_wpa_supp_authenticate:Authentication request sent successfully
    sme_event_auth 1660 auth_type=0
    sme_associate 2041 params=60985e28
    wlan_set_regiontable 1642 
    wlan_ops_sta_ioctl: 0x20000
    wlan_ops_sta_ioctl: MLAN_IOCTL_BSS
    wlan_bss_ioctl 346: sub_command = 131073
    wlan_bss_ioctl_start 295 i=7
    [supp_if] wifi_skw_wpa_supp_associate: Association request sent successfully
    wlan_ret_802_11_associate 1281 host_mlme=1
    wlan_ret_802_11_associate 1285 hdr->BssId=1c:68:7e:c3:08:9b
    wlan_ret_802_11_associate 1286 pmpriv->pattempted_bss_desc->mac_address=1c:68:7e:c3:08:9b
    sm_SUPP_PAE_Step 397 startWhen=2,startCount=0,maxStart=3,portValid=0,sm->eapSuccess=0,sm->eapFail=0
    sm_SUPP_PAE_Step 397 startWhen=2,startCount=0,maxStart=3,portValid=0,sm->eapSuccess=0,sm->eapFail=0
    sm_SUPP_PAE_Step 397 startWhen=2,startCount=0,maxStart=3,portValid=0,sm->eapSuccess=0,sm->eapFail=0
    [supp_if]    pairwise key
    sm_SUPP_PAE_Step 397 startWhen=2,startCount=0,maxStart=3,portValid=1,sm->eapSuccess=0,sm->eapFail=0
    [supp_if]    broadcast key
    sm_SUPP_PAE_Step 397 startWhen=2,startCount=0,maxStart=3,portValid=1,sm->eapSuccess=0,sm->eapFail=0
    sm_SUPP_PAE_Step 397 startWhen=2,startCount=0,maxStart=3,portValid=1,sm->eapSuccess=1,sm->eapFail=0
    [2974972] WLAN.mgnt: wifi connect success ssid:360WiFi-C3089B
    app_cb: WLAN: authenticated to network
    get_wpa_s_handle 123 ifname: m01,dev->num=2
    configuring interface mlan (with DHCP client) intrfc_handle=60531bd8
    net_configure_address 746 netif name=m0
    net_configure_address 749 Setting default interface to mlan
    net_configure_address 752 addr_type=1
    wm_netif_status_callback 562 DHCP SUCCESS
    skw_rt_wlan_event_forwarder 365 wifi connect success!
    [2992059] WLAN.mgnt: wifi connect success ssid:360WiFi-C3089B
    [2992069] NO_TAG: connected: ssid=360WiFi-C3089B channel=6
    [2992077] bt_service: app_bt_disable_afh_channels ret:0
    AFH: disabled 10 BT channels overlapping WiFi ch 6 (2437.0 MHz)
    BLE CHMAP: disabled data ch 16 due to WiFi ch 6 (2437.0 MHz)
    app_cb: WLAN: connected to network
    [2992105] BLE_GAP: evt 4, ret 162
    Connected to following BSS:
    SSID = [360WiFi-C3089B]
    IPv4 Address: [192.168.0.3]
    skw_wifi_set_ipaddr 1209 ipaddr=0x192.168.0.3

当日志中同时出现 “app_cb: WLAN: connected to network” 和 “IPv4 Address: […]” 时,即可认为热点已经连接成功并获取到 IPv4 地址。

4.3 wifi disc(断开连接)

TX:wifi disc
    wifi disc
    get_wpa_s_handle 123 ifname: m01,dev->num=2
    get_wpa_s_handle 123 ifname: m01,dev->num=2
    msh />
    msh />wm_netif_status_callback 562 DHCP FAILURE
    wifi_deauthenticate 78 pmpriv->media_connected=0 
    app_cb: disconnected
    [3482487] WLAN.mgnt: disconnect success!

4.4 wifi status(查询 Wi-Fi 状态)

TX:wifi status
    wifi status
    Wi-Fi STA Info
    SSID : 360WiFi-C3089B
    MAC Addr: 1c:68:7e:c3:08:9b
    Channel: 6
    DataRate: 0Mbps
    RSSI: 0
    wifi ap not start!
    Auto Connect status:Disable!

详细功能示例源码和测试代码路径如下: xxxxx\sdk\rtos\rtthread\components\drivers\wlan\wlan_cmd.c

5. 低功耗设计

  • 测量工具:Nordic PPK2。

  • 测量方式:在 Wi-Fi 供电电源上串联 PPK2,测量 Wi-Fi 供电电流。

5.1 断电模式

  • 在 WLAN 层直接调用设备的 RT_WLAN_CMD_SET_POWERSAVE 即可,参数含义:0 表示断电,1 表示上电。

static rt_err_t _rt_wlan_dev_control(rt_device_t dev, int cmd, void *args)
{
    /* 将通用 rt_device 控制命令分发到 WLAN 设备的具体实现 */
    struct rt_wlan_device *wlan = (struct rt_wlan_device *)dev;
    rt_err_t err = RT_EOK;

    RT_ASSERT(dev != RT_NULL);

    WLAN_DEV_LOCK(wlan);

    /* 根据 cmd 不同,执行不同的 WLAN 控制命令 */
    switch (cmd)
    {
        ....
        case RT_WLAN_CMD_GET_POWERSAVE:
            {
                int *level = args;

                /* 读取当前省电等级并返回给上层 */
                LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_GET_POWERSAVE, "RT_WLAN_CMD_GET_POWERSAVE");
                if (wlan->ops->wlan_get_powersave)
                    *level = wlan->ops->wlan_get_powersave(wlan);
                break;
            }
        ....
    }
}
static rt_err_t ops_wlan_set_powersave(struct rt_wlan_device *wlan, int level)
{
    /* 根据 level 选择不同的省电操作:关电 / 上电 */
    switch (level)
    {
    case WIFI_POWER_OFF:
        /* 关闭 Wi-Fi,进入深度休眠(完全断电) */
        swt6621s_wifi_suspend();
        break;
    case WIFI_POWER_ON:
        /* 打开 Wi-Fi,重新上电并初始化 */
        swt6621s_wifi_resume();
        break;
    default:
        return -RT_EINVAL;
    }
    return 0;
}

  • Suspend:通过 FinSH 指令 swt6621s_wifi_suspend 进入低功耗断电模式。

  • 直接断开 SDIO 供电时,实测平均静态电流约 9.39 µA。

Log:

../../_images/wifi_19.png ../../_images/wifi_20.png
  • Resume:通过 FinSH 指令 swt6621s_wifi_resume 恢复供电并重新初始化。

  • 唤醒时间约为 2 s。

TX:swt6621s_wifi_resume
    swt6621s_wifi_resume
    [7667896] drv.sdhci: rt_hw_sdmmc_init 1 begin
    [7668070] drv.sdhci: host version = 2
    [7668074] drv.sdhci: SDHCI clock 288000000
    [7668078] drv.sdhci: Maximum Clock Supported by HOST : 288 MHz 
    [7668085] drv.sdhci: host minclock 400000  host maxclock 288000000  
    [7668091] drv.sdhci: SDHCI controller on sdmmc using DMA
    [7668097] drv.sdhci: Add host success
    [7668101] drv.sdhci: rt_hw_sdmmc_init 1 done
    msh />
    msh />clock 0Hz busmode 1 powermode 1 cs 0 Vdd 23 width 0 
    [7668114] drv.sdhci: sdhci_set_clock2 0
    clock 400000Hz busmode 1 powermode 2 cs 0 Vdd 23 width 0 
    [7668208] drv.sdhci: sdhci_set_clock2 400000
    [7668300] SDIO: detect SDIO begin
    clock 400000Hz busmode 1 powermode 2 cs 1 Vdd 23 width 0 
    clock 400000Hz busmode 1 powermode 2 cs 0 Vdd 23 width 0 
    clock 400000Hz busmode 1 powermode 2 cs 0 Vdd 8 width 0 
    clock 400000Hz busmode 2 powermode 2 cs 0 Vdd 8 width 0 
    clock 50000000Hz busmode 2 powermode 2 cs 0 Vdd 8 width 0 
    [7668426] drv.sdhci: sdhci_set_clock2 24000000
    clock 50000000Hz busmode 2 powermode 2 cs 0 Vdd 8 width 2 
    [7668445] drv.sdhci: sdhci_set_clock2 24000000
    [7668458] drv.sdhci: Enable DDR mode 0
    [7668462] drv.sdhci: Set to 4 line mode
    skw_sdio_probe 606 
    SDIO: enabling function 1
    SDIO: enabled function successfull
    SDIO: enabling IRQ for function 1
    skw_sdio_dt_read 495 address=0x40000000 len=16 buf=60517568
    fwk dram open file success, size=192492
    fwk maxsize dram: 192492
    skw_sdio_dt_write 438 address=0x20200000 maxsize=192492
    debug----the address=0x20200000 
    fwk iram open file success, size=357024
    fwk maxsize iram: 357024
    skw_sdio_dt_write 438 address=0x100000 maxsize=357024
    debug----the address=0x100000 
    BOOT CP BY SDIO
     wifi version:trunk_W23.20.2-rev33829-rev33881-rev33848 20250110-01:39:39, slp=2
    
    BOOT CP BY SDIO DONE
    skw_sdio2_handle_packet 704 WIFIREADY
    skw_sdio_dt_read 495 address=0x40000000 len=16 buf=60517568
    l2_packet_init: iface m01 ifindex 2
    fwk calibration open file success, size=2372
    fwk maxsize calibration: 2372
    wifi resume ok

电流数据如下:

../../_images/wifi_22.png

5.2 常供电模式

5.2.1 空闲待机低功耗

  1. Wi-Fi 上电初始化完成后,如无数据传输,约 10 s 后自动进入低功耗:

../../_images/wifi_23.png
  1. 进入低功耗模式后,平均电流约为 76.61 µA:

../../_images/wifi_24.png

5.2.2 Connect 保持连接时电流

在 STA 已连接到 AP 且处于空闲保持状态时:

  1. 自动进入低功耗:在连接成功约 1 分钟后自动进入低功耗。

../../_images/wifi_25.png
  1. 低功耗心跳:约每 81 ms 出现一次心跳电流,持续时间约 20 ms,平均电流约 25.33 mA。

../../_images/wifi_26.png
  1. 大电流心跳:约每 1 分钟出现一次,持续时间约 818.9 ms,平均电流约 63.37 mA,峰值电流约 450.13 mA。

../../_images/wifi_27.png
  1. 统计平均电流:测量时间约 1.14 分钟,整体平均电流约 4 mA。

../../_images/wifi_28.png
  1. 底电流:在心跳间隙的静止段,底电流约 78.26 µA。

../../_images/wifi_29.png

5.2.3 Connect + 数据传输(ping)电流

在已连接状态下进行少量数据收发,以 4 次 ICMP ping 为例:

  1. 典型电流波形如下:

../../_images/wifi_30.png
  1. 统计结果:平均电流约 54.98 mA,峰值电流约 253 mA。

../../_images/wifi_31.png

5.3 Wi-Fi 各阶段启动时间

  • 上电 Wi-Fi → 初始化完成:约 2 s。

  • Scan:扫描到约 15 个热点或超时 2 s(以先到为准)。

  • 从 Scan 结束到 Connect 成功:视网络环境而定,较快约 1.5 s,较慢约 6 s。

5.4 低功耗唤醒流程

Wi-Fi 模块在空闲一段时间后会自动进入睡眠模式。进入睡眠后,Wi-Fi 侧的 GPIO0 为低电平。

在每次向 Wi-Fi 发送数据前,Host 需要先检测该 GPIO 电平状态:

  • 若 GPIO0 为低电平,需要在 Wi-Fi 侧的 GPIO1 输出一个大于 5 µs 的脉冲信号以唤醒 Wi-Fi 芯片;

  • 之后需要等待 GPIO0 变为高电平,再开始正常的数据交互。

相关代码流程如下:

../../_images/wifi_32.png ../../_images/wifi_33.png

6. Wi-Fi 调试与日志

6.1 打开调试配置

  • 在 Menuconfig 中打开相关调试选项:

../../_images/wifi_34.png

6.2 配置日志保存路径

  • 设置 Wi-Fi 日志文件保存路径:

../../_images/wifi_35.png

6.3 Wi-Fi 内部日志

  • 完成以上配置后,可通过 FinSH 指令 wifi_log_enable 0 打开日志功能(参数 0:打开,1:关闭)。

../../_images/wifi_36.png

6.4 Wi-Fi RAM Dump 保存

  • 完成以上配置后,可通过 FinSH 指令 skw_sdio_memdump 保存 RAM Dump。

../../_images/wifi_37.png
  • 注:发送该指令后,Wi-Fi 需要重启后才能继续正常使用。

6.5 ASSERT 信息

  • 如果 Wi-Fi 侧出现死机,会发送 “BSPASSERT”,并自动保存 Wi-Fi Dump 信息,同时打印当前 Wi-Fi 固件版本号,便于问题追踪。

../../_images/wifi_38.png

7. Wi-Fi 固件存放方式

7.1 固件存储方式选择

  • 系统通过宏定义 SKW_BOOT_MODE_RAM 来选择 Wi-Fi 固件 bin 文件的存储方式:

    • 选中时:Wi-Fi 固件 bin 以数组形式内置在系统代码中,会增加代码区容量,适用于无文件系统场景;

    • 未选中时:Wi-Fi 固件 bin 存放在文件系统中,以文件形式存在。

../../_images/wifi_39.png

7.2 文件系统方式配置

  • 默认推荐使用文件系统方式,需要正确配置固件 bin 文件的存放目录及文件名,并区分 IRAM、DRAM 及校准文件。

../../_images/wifi_40.png

7.3 Butterfli 内置文件

  • 在 Butterfli 中,将固件文件以内置文件形式放入文件系统中,分为固件文件和校准文件。

../../_images/wifi_41.png

7.4 配置内置文件路径

  • 配置内置文件路径:

../../_images/wifi_42.png

8. 常见异常排查

8.1 初始化失败

  1. 检查 Wi-Fi 是否已经上电;

  2. 检查 SDIO / SDHCI 相关配置是否正确打开;

  3. 检查软件 PinMux 配置是否与原理图一致;

  4. 检查 SDIO / SDHCI 寄存器是否已正确使能;

  5. 若使用 SDHCI 模式,确认已配置为 SDIO 模式(参考前文 Menuconfig 配置);

  6. 检查 Host 端与 Wi-Fi 芯片连接的两个 GPIO 的方向是否正确(一个为输入、一个为输出)。

8.2 速率低 / 丢包 / 总线错误

  1. 尝试降低 SDIO 总线频率,若有改善,请使用示波器检查 SDIO 信号完整性和电气特性;

  2. 确认当前 Wi-Fi 是否处于低功耗模式,若 GPIO 唤醒信号配置不正确,可能导致唤醒失败从而影响通信质量。

8.3 编译库后出现死机

  1. 检查sdio/sdhci IP是否正常初始化

  2. 在IP正常初始化后再检查wifi固件是否正常的下载。log如下:

    skw_sdio_dt_read 495 address=0x40000000 len=16 buf=60517568
    fwk dram open file success, size=192492
    fwk maxsize dram: 192492
    skw_sdio_dt_write 438 address=0x20200000 maxsize=192492
    debug----the address=0x20200000 
    fwk iram open file success, size=357024
    fwk maxsize iram: 357024
    skw_sdio_dt_write 438 address=0x100000 maxsize=357024
    debug----the address=0x100000 
  1. 固件下载后再次查看wifi固件是否正确返回固件信息。log如下:

    wifi version:trunk_W23.20.2-rev33829-rev33881-rev33848 20250110-01:39:39, slp=2
  1. 返回固件后再次查看是否WiFi启动成功,log如下:

    skw_sdio2_handle_packet 704 WIFIREADY
  1. 在上面都正常后,再后续的启动网络部分中出现死机,可能原因是lwip/wifi/wlan/wpa某些配置没有开启。 如再wpa中没有find到“m0”的网卡设备,但是再wpa上又配置了网卡设备名,再导出现场来看发现netif_list中的name不对,就导致了find不到网卡设备。出现这个的原因是库上的netif里面的client_data[4]结构体与外面代码的client_data[3]结构体没有对齐导致的偏移不正确。

../../_images/wifi_52.png

8.4 参考配置如下

  1. menuconfig参考配置如下

#define BSP_USING_SDIO 1
#define BSP_USING_SDHCI 1
#define BSP_USING_SDHCI1 1
#define SD_MAX_FREQ 48000000
#define SD_DMA_MODE 2
#define SDIO_CARD_MODE 2

#define BSP_WIFI_SWT6621 1
#define WIFI_WAKEUP_OUT_PIN 2
#define WIFI_WAKEUP_IN_PIN 5
#define WIFI_POWER_PIN 53

#define WIFI_DRAM_PATH "wifi/boot/SWT6621S_DRAM_SDIO.bin"
#define WIFI_IRAM_PATH "wifi/boot/SWT6621S_IRAM_SDIO.bin"
#define WIFI_CALIBRATION_PATH "wifi/calibration/SWT6621S_SEEKWAVE_R00000.bin"
#define SKW_WIFI_DEBUG 1
#define WIFI_DEBUG_PATH "wifi/debug"

#define RT_USING_SDIO 1
#define RT_SDIO_STACK_SIZE 2048
#define RT_SDIO_THREAD_PRIORITY 6
#define RT_MMCSD_STACK_SIZE 2048
#define RT_MMCSD_THREAD_PREORITY 22
#define RT_MMCSD_MAX_PARTITION 16
#define RT_MMCSD_USER_OFFSET 0

#define RT_USING_WIFI 1
#define RT_WLAN_DEVICE_STA_NAME "wlan0"
#define RT_WLAN_DEVICE_AP_NAME "wlan1"
#define RT_WLAN_DEFAULT_PROT "lwip"
#define RT_WLAN_SCAN_WAIT_MS 10000
#define RT_WLAN_CONNECT_WAIT_MS 10000
#define RT_WLAN_SSID_MAX_LENGTH 32
#define RT_WLAN_PASSWORD_MAX_LENGTH 32
#define RT_WLAN_SCAN_SORT 1
#define RT_WLAN_CFG_INFO_MAX 3
#define RT_WLAN_WORKQUEUE_THREAD_NAME "wlan_job"
#define RT_WLAN_WORKQUEUE_THREAD_SIZE 2048
#define RT_WLAN_WORKQUEUE_THREAD_PRIO 22
#define RT_WLAN_DEV_EVENT_NUM 2

#define NETDEV_USING_PING 1
#define RT_USING_LWIP 1

#define RT_USING_LWIP212 1
/* RT_USING_LWIP_LATEST is not set */
#define RT_USING_LWIP_VER_NUM 0x20102
/* RT_USING_LWIP_IPV6 is not set */
#define RT_LWIP_MEM_ALIGNMENT 4
#define RT_LWIP_IGMP 1
#define RT_LWIP_ICMP 1
/* RT_LWIP_SNMP is not set */
#define RT_LWIP_DNS 1
#define RT_LWIP_DHCP 1
#define IP_SOF_BROADCAST 1
#define IP_SOF_BROADCAST_RECV 1

/* Static IPv4 Address */

#define RT_LWIP_IPADDR "192.168.1.30"
#define RT_LWIP_GWADDR "192.168.1.1"
#define RT_LWIP_MSKADDR "255.255.255.0"
/* end of Static IPv4 Address */
#define RT_LWIP_UDP 1
#define RT_LWIP_TCP 1
#define RT_LWIP_RAW 1
/* RT_LWIP_PPP is not set */
#define RT_MEMP_NUM_NETCONN 8
#define RT_LWIP_PBUF_NUM 32
#define RT_LWIP_RAW_PCB_NUM 4
#define RT_LWIP_UDP_PCB_NUM 4
#define RT_LWIP_TCP_PCB_NUM 4
#define RT_LWIP_TCP_SEG_NUM 60
#define RT_LWIP_TCP_SND_BUF 14600
#define RT_LWIP_TCP_WND 14600
#define RT_LWIP_TCPTHREAD_PRIORITY 8
#define RT_LWIP_TCPTHREAD_MBOX_SIZE 32
#define RT_LWIP_TCPTHREAD_STACKSIZE 4096
/* LWIP_NO_RX_THREAD is not set */
/* LWIP_NO_TX_THREAD is not set */
#define RT_LWIP_ETHTHREAD_PRIORITY 12
#define RT_LWIP_ETHTHREAD_STACKSIZE 2048
#define RT_LWIP_ETHTHREAD_MBOX_SIZE 32
#define RT_LWIP_REASSEMBLY_FRAG 1
#define LWIP_NETIF_STATUS_CALLBACK 1
#define LWIP_NETIF_LINK_CALLBACK 1
#define RT_LWIP_NETIF_NAMESIZE 6
#define SO_REUSE 1
#define LWIP_SO_RCVTIMEO 1
#define LWIP_SO_SNDTIMEO 1
#define LWIP_SO_RCVBUF 1
#define LWIP_SO_LINGER 0
/* RT_LWIP_NETIF_LOOPBACK is not set */
#define LWIP_NETIF_LOOPBACK 0
/* RT_LWIP_STATS is not set */
/* RT_LWIP_USING_HW_CHECKSUM is not set */
#define RT_LWIP_USING_PING 1
/* RT_LWIP_USING_MQTT is not set */
#define RT_LWIP_USING_WEBSOCKET 1
#define LWIP_ALTCP 1
#define LWIP_ALTCP_TLS 1

#define PKG_USING_MBEDTLS 1
/* PKG_USING_MBEDTLS_DEBUG is not set */
#define PKG_USING_MBEDTLS_USE_ALL_CERTS 1
#define PKG_USING_MBEDTLS_USER_CERTS 1

#define PKG_USING_WPA_SUPPLICANT 1
#define PKG_USING_WPA_NET_NAME "m0"
#define PKG_USING_OS_FREERTOS 1


#define APP_WIFI_USED 1

  1. 关键宏含义说明

  • SDIO / SDHCI 相关:

    • BSP_USING_SDIOBSP_USING_SDHCIBSP_USING_SDHCI1:打开板级 SDIO / SDHCI 控制器以及对应实例 1;

    • SD_MAX_FREQ:SDIO 总线最高工作频率,单位 Hz(建议根据硬件信号质量评估);

    • SD_DMA_MODE:DMA 传输模式选择;

    • SDIO_CARD_MODE:控制器工作在 SDIO 卡模式,而非普通存储卡模式。

  • Wi-Fi 模块与引脚:

    • BSP_WIFI_SWT6621:使能 SWT6621SL Wi-Fi 模块支持;

    • WIFI_WAKEUP_OUT_PIN:Wi-Fi 唤醒 Host 的 GPIO 引脚号(Wi-Fi -> Host);

    • WIFI_WAKEUP_IN_PIN:Host 唤醒 Wi-Fi 的 GPIO 引脚号(Host -> Wi-Fi);

    • WIFI_POWER_PIN:Wi-Fi 供电控制 / 使能引脚号。

  • Wi-Fi 固件与调试:

    • WIFI_DRAM_PATH:Wi-Fi DRAM 段固件 bin 文件在文件系统中的路径;

    • WIFI_IRAM_PATH:Wi-Fi IRAM 段固件 bin 文件路径;

    • WIFI_CALIBRATION_PATH:Wi-Fi 射频校准(calibration)文件路径;

    • SKW_WIFI_DEBUG:打开 Wi-Fi 内部调试功能;

    • WIFI_DEBUG_PATH:Wi-Fi 调试日志 / Dump 保存目录(配合 wifi_log_enableskw_sdio_memdump 使用)。

  • RT-Thread SDIO / MMCSD:

    • RT_USING_SDIO:使能 RT-Thread SDIO 框架;

    • RT_SDIO_STACK_SIZERT_SDIO_THREAD_PRIORITY:SDIO 业务线程的栈大小与优先级;

    • RT_MMCSD_STACK_SIZERT_MMCSD_THREAD_PREORITY:MMC/SD 线程的栈大小与优先级;

    • RT_MMCSD_MAX_PARTITION:最多支持的分区数量;

    • RT_MMCSD_USER_OFFSET:用户分区起始偏移。

  • RT-Thread Wi-Fi 框架:

    • RT_USING_WIFI:总开关,打开 RT-Thread WLAN 框架;

    • RT_WLAN_DEVICE_STA_NAMERT_WLAN_DEVICE_AP_NAME:STA / AP 设备在 RT-Thread 中注册的名称;

    • RT_WLAN_DEFAULT_PROT:WLAN 上层使用的网络协议栈类型(此处为 lwip);

    • RT_WLAN_SCAN_WAIT_MSRT_WLAN_CONNECT_WAIT_MS:扫描与连接的超时时间;

    • RT_WLAN_SSID_MAX_LENGTHRT_WLAN_PASSWORD_MAX_LENGTH:SSID 与密码最大长度;

    • RT_WLAN_SCAN_SORT:扫描结果是否排序;

    • RT_WLAN_CFG_INFO_MAX:最多保存的 Wi-Fi 配置信息条数;

    • RT_WLAN_WORKQUEUE_THREAD_NAME / SIZE / PRIO:WLAN 工作队列线程的名称、栈大小和优先级;

    • RT_WLAN_DEV_EVENT_NUM:WLAN 设备支持的事件数量。

  • 网络协议栈(lwIP):

    • NETDEV_USING_PING:在 netdev 中使能 ping 功能;

    • RT_USING_LWIP:总开关,使用 lwIP 作为 TCP/IP 协议栈;

    • RT_USING_LWIP212RT_USING_LWIP_VER_NUM:选择 lwIP 2.1.2 版本;

    • RT_LWIP_IGMPRT_LWIP_ICMPRT_LWIP_DNSRT_LWIP_DHCP:分别打开 IGMP、ICMP、DNS、DHCP 功能;

    • RT_LWIP_IPADDRRT_LWIP_GWADDRRT_LWIP_MSKADDR:静态 IPv4 地址 / 网关 / 子网掩码配置(在未使用 DHCP 或作为默认回退时使用);

    • RT_LWIP_UDPRT_LWIP_TCPRT_LWIP_RAW:打开 UDP / TCP / RAW 套接字支持;

    • RT_MEMP_NUM_NETCONNRT_LWIP_PBUF_NUMRT_LWIP_*_PCB_NUMRT_LWIP_TCP_SEG_NUM:lwIP 内部连接、缓存、PCB、分段等资源数量;

    • RT_LWIP_TCP_SND_BUFRT_LWIP_TCP_WND:TCP 发送缓冲和接收窗口大小;

    • RT_LWIP_TCPTHREAD_*RT_LWIP_ETHTHREAD_*:TCP/IP 线程和以太网输入线程的优先级、栈大小和邮箱大小;

    • RT_LWIP_REASSEMBLY_FRAG:使能 IP 分片重组;

    • LWIP_NETIF_STATUS_CALLBACKLWIP_NETIF_LINK_CALLBACK:打开 netif 状态 / 链路回调;

    • RT_LWIP_NETIF_NAMESIZE:网卡名称最大长度;

    • SO_REUSELWIP_SO_RCVTIMEOLWIP_SO_SNDTIMEOLWIP_SO_RCVBUFLWIP_SO_LINGER:常见 socket 选项支持;

    • LWIP_NETIF_LOOPBACK:是否开启协议栈内部 loopback(此处为关闭);

    • RT_LWIP_USING_PING:在 lwIP 中使能 ping 命令;

    • RT_LWIP_USING_WEBSOCKETLWIP_ALTCPLWIP_ALTCP_TLS:使能 WebSocket 以及基于 ALTCP 的 TLS 支持。

  • 安全相关组件:

    • PKG_USING_MBEDTLS:使能 mbedtls 加解密组件;

    • PKG_USING_MBEDTLS_USE_ALL_CERTSPKG_USING_MBEDTLS_USER_CERTS:证书加载策略(全部证书 / 用户证书);

    • PKG_USING_WPA_SUPPLICANT:使能 wpa_supplicant Wi-Fi 安全框架;

    • PKG_USING_WPA_NET_NAME:wpa_supplicant 对应使用的 netif 名称(此处为 m0,需和实际 netif 对齐);

    • PKG_USING_OS_FREERTOS:wpa_supplicant 运行所依赖的 OS 适配层选择为 FreeRTOS。

  • 应用层开关:

    • APP_WIFI_USED:应用层是否使用 Wi-Fi 功能的总开关,关闭后上层不再初始化 / 使用 Wi-Fi。

  1. net work 相关配置如下:

    1. 在 xxxxx\sdk\rtos\rtthread\components\net\lwip\port\lwipopts.h中添加如下配置

/**
 * LWIP_NETIF_EXT_STATUS_CALLBACK==1: Support an extended callback function
 * for several netif related event that supports multiple subscribers.
 * @see netif_ext_status_callback
 */
#if !defined LWIP_NETIF_EXT_STATUS_CALLBACK || defined __DOXYGEN__
    #define LWIP_NETIF_EXT_STATUS_CALLBACK  1
#endif
msh />clock 0Hz busmode 1 powermode 1 cs 0 Vdd 23 width 0 
    clock 400000Hz busmode 1 powermode 2 cs 0 Vdd 23 width 0 
    ���[32m[1760] I/drv.sdhci: sdhci_set_clock2 400000
    ���[0m���[32m[2132] I/SDIO: detect SDIO begin
    ���[0mclock 400000Hz busmode 1 powermode 2 cs 1 Vdd 23 width 0 
    clock 400000Hz busmode 1 powermode 2 cs 0 Vdd 23 width 0 
    ���[32m[2284] I/SDIO: detect SD card BEGIN
    ���[0mclock 400000Hz busmode 1 powermode 2 cs 1 Vdd 23 width 0 
    clock 400000Hz busmode 1 powermode 2 cs 0 Vdd 23 width 0 
    ���[32m[2446] I/SDIO: detect MMC begin
    ���[0mclock 400000Hz busmode 1 powermode 2 cs 1 Vdd 23 width 0 
    clock 400000Hz busmode 1 powermode 2 cs 0 Vdd 23 width 0 
    sdio_scan_card
    [SKWSDIO ERROR] skw_sdio_scan_card: 773 
    sdio_register_driver error :-4
    Assertion failed at function:rt_mutex_take, line number:663 
01-21 14:46:44:980    clock 400000Hz busmode 1 powermode 2 cs 0 Vdd 23 width 0 
01-21 14:46:44:980    [1760] I/drv.sdhci: sdhci_set_clock2 400000
01-21 14:46:44:982    [2132] I/SDIO: detect SDIO begin
01-21 14:46:44:985    clock 400000Hz busmode 1 powermode 2 cs 1 Vdd 23 width 0 
01-21 14:46:44:985    clock 400000Hz busmode 1 powermode 2 cs 0 Vdd 23 width 0 
01-21 14:46:44:990    [2284] I/SDIO: detect SD card BEGIN
01-21 14:46:44:993    clock 400000Hz busmode 1 powermode 2 cs 1 Vdd 23 width 0 
01-21 14:46:44:996    clock 400000Hz busmode 1 powermode 2 cs 0 Vdd 23 width 0 
01-21 14:46:44:996    [2446] I/SDIO: detect MMC begin
01-21 14:46:44:996    clock 400000Hz busmode 1 powermode 2 cs 1 Vdd 23 width 0 
01-21 14:46:45:001    clock 400000Hz busmode 1 powermode 2 cs 0 Vdd 23 width 0 
01-21 14:46:50:039    sdio_scan_card
01-21 14:46:50:043    [SKWSDIO ERROR] skw_sdio_scan_card: 773 
01-21 14:46:50:044    sdio_register_driver error :-4
01-21 14:46:50:047    Assertion failed at function:rt_mutex_take, line number:663 

这就是wifi寻卡阶段失败了,也就是没有找到wifi这个外挂设备。出现这个依次检查步骤如下:

  • 检查WiFi供电

  • 检查WiFi相关的pinmux引脚是否配置正确

  • 检查wifi相关的chip en等引脚是否正确上拉

  • 检查sdio中clk是否正确输出波形

  • 检查sdio各个引脚的电气特性是否正常

  1. WiFi寻卡成功了,但是在固件下载失败了

    2.1. 可能是wifi睡眠了,使用万用表测量wifi的gpio0引脚看是否是低电平;解决方法,检查wifi的gpio0与gpio1引脚是否配置正确

    2.2. sdio总线通讯失败;请检查与sdio总线通信地址。

    2.3. 请降低sdio的频率再尝试

8.5 开关WIFI出现wifi启动失败

  1. 可能原因是断开wifi电源时没有断干净,这个时候在关闭wifi后去量wifi的电源硬件是否为0 V电压,如果不是但控制ldo的引脚又是低电平,就需要检查连接到wifi上面的各个gpio口与电源是否有电压漏电过去,导致wifi的电源没有完全关闭。

  • 解决方法:

    • 关闭WiFi电源后将sdio口配置为高阻状态或者下拉状态,在开wifi的时候又将其恢复过来。

void BSP_WIFI_PowerUp(void)
{
    BSP_GPIO_Set(WIFI_POWER_PIN, 1, 1);//wifi power
    BSP_GPIO_Set(WIFI_WAKEUP_OUT_PIN, 1, 1);
    BSP_GPIO_Set(WIFI_CHIP_POWER_PIN, 1, 1);
    /*SDHCI2 config*/
#ifdef BSP_USING_SDHCI2
    void BSP_sd2_pinmux_config();
    BSP_sd2_pinmux_config();
    HAL_PIN_Set(PAD_PA73, GPIO_A73, PIN_PULLUP, 1); // wifi mode power pin
    HAL_PIN_Set(PAD_PA69, GPIO_A69, PIN_NOPULL, 1); //output wifi wakeup pin
    HAL_PIN_Set(PAD_PA68, GPIO_A68, PIN_PULLDOWN, 1);//input wifi wakeup pin
    HAL_PIN_Set(PAD_PA85, GPIO_A85, PIN_PULLUP, 1); // wifi chip power pin
#endif

}

void BSP_WIFI_PowerDown(void)
{
    BSP_GPIO_Set(WIFI_POWER_PIN, 0, 1);//wifi power
    BSP_GPIO_Set(WIFI_WAKEUP_OUT_PIN, 0, 1);
    BSP_GPIO_Set(WIFI_CHIP_POWER_PIN, 0, 1);
#ifdef BSP_USING_SDHCI2
    void BSP_sd2_pinmux_suspend();
    BSP_sd2_pinmux_suspend();
#endif
}
void rt_wifi_power(uint8_t power)
{
    rt_wifi_set_flag(NULL, power ? WIFI_DEVICE_INITING : WIFI_DEVICE_IDLE);
    if (power)
    {
        BSP_WIFI_PowerUp();
    }
    else
    {
        BSP_WIFI_PowerDown();
    }
    rt_thread_mdelay(200);
}
- 如果还是没有关闭干净就需要检查连接到wifi上的其他引脚或者电源,保证在关闭wifi后没有任何高电压输送到wifi模块上。

9. 注意事项

  • SWT6621SL 的 AP 功能暂未开放。

  • SWT6621SL 暂不支持 USB 接口。