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:
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
电流数据如下:
5.2 常供电模式¶
5.2.1 空闲待机低功耗¶
Wi-Fi 上电初始化完成后,如无数据传输,约 10 s 后自动进入低功耗:
进入低功耗模式后,平均电流约为 76.61 µA:
5.2.2 Connect 保持连接时电流¶
在 STA 已连接到 AP 且处于空闲保持状态时:
自动进入低功耗:在连接成功约 1 分钟后自动进入低功耗。
低功耗心跳:约每 81 ms 出现一次心跳电流,持续时间约 20 ms,平均电流约 25.33 mA。
大电流心跳:约每 1 分钟出现一次,持续时间约 818.9 ms,平均电流约 63.37 mA,峰值电流约 450.13 mA。
统计平均电流:测量时间约 1.14 分钟,整体平均电流约 4 mA。
底电流:在心跳间隙的静止段,底电流约 78.26 µA。
5.2.3 Connect + 数据传输(ping)电流¶
在已连接状态下进行少量数据收发,以 4 次 ICMP ping 为例:
典型电流波形如下:
统计结果:平均电流约 54.98 mA,峰值电流约 253 mA。
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 变为高电平,再开始正常的数据交互。
相关代码流程如下:
6. Wi-Fi 调试与日志¶
6.1 打开调试配置¶
在 Menuconfig 中打开相关调试选项:
6.2 配置日志保存路径¶
设置 Wi-Fi 日志文件保存路径:
6.3 Wi-Fi 内部日志¶
完成以上配置后,可通过 FinSH 指令
wifi_log_enable 0打开日志功能(参数 0:打开,1:关闭)。
6.4 Wi-Fi RAM Dump 保存¶
完成以上配置后,可通过 FinSH 指令
skw_sdio_memdump保存 RAM Dump。
注:发送该指令后,Wi-Fi 需要重启后才能继续正常使用。
6.5 ASSERT 信息¶
如果 Wi-Fi 侧出现死机,会发送 “BSPASSERT”,并自动保存 Wi-Fi Dump 信息,同时打印当前 Wi-Fi 固件版本号,便于问题追踪。
7. Wi-Fi 固件存放方式¶
7.1 固件存储方式选择¶
系统通过宏定义
SKW_BOOT_MODE_RAM来选择 Wi-Fi 固件 bin 文件的存储方式:选中时:Wi-Fi 固件 bin 以数组形式内置在系统代码中,会增加代码区容量,适用于无文件系统场景;
未选中时:Wi-Fi 固件 bin 存放在文件系统中,以文件形式存在。
7.2 文件系统方式配置¶
默认推荐使用文件系统方式,需要正确配置固件 bin 文件的存放目录及文件名,并区分 IRAM、DRAM 及校准文件。
7.3 Butterfli 内置文件¶
在 Butterfli 中,将固件文件以内置文件形式放入文件系统中,分为固件文件和校准文件。
7.4 配置内置文件路径¶
配置内置文件路径:
8. 常见异常排查¶
8.1 初始化失败¶
检查 Wi-Fi 是否已经上电;
检查 SDIO / SDHCI 相关配置是否正确打开;
检查软件 PinMux 配置是否与原理图一致;
检查 SDIO / SDHCI 寄存器是否已正确使能;
若使用 SDHCI 模式,确认已配置为 SDIO 模式(参考前文 Menuconfig 配置);
检查 Host 端与 Wi-Fi 芯片连接的两个 GPIO 的方向是否正确(一个为输入、一个为输出)。
8.2 速率低 / 丢包 / 总线错误¶
尝试降低 SDIO 总线频率,若有改善,请使用示波器检查 SDIO 信号完整性和电气特性;
确认当前 Wi-Fi 是否处于低功耗模式,若 GPIO 唤醒信号配置不正确,可能导致唤醒失败从而影响通信质量。
8.3 编译库后出现死机¶
检查sdio/sdhci IP是否正常初始化
在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
固件下载后再次查看wifi固件是否正确返回固件信息。log如下:
wifi version:trunk_W23.20.2-rev33829-rev33881-rev33848 20250110-01:39:39, slp=2
返回固件后再次查看是否WiFi启动成功,log如下:
skw_sdio2_handle_packet 704 WIFIREADY
在上面都正常后,再后续的启动网络部分中出现死机,可能原因是lwip/wifi/wlan/wpa某些配置没有开启。 如再wpa中没有find到“m0”的网卡设备,但是再wpa上又配置了网卡设备名,再导出现场来看发现netif_list中的name不对,就导致了find不到网卡设备。出现这个的原因是库上的netif里面的client_data[4]结构体与外面代码的client_data[3]结构体没有对齐导致的偏移不正确。
8.4 参考配置如下¶
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
关键宏含义说明
SDIO / SDHCI 相关:
BSP_USING_SDIO、BSP_USING_SDHCI、BSP_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_enable、skw_sdio_memdump使用)。
RT-Thread SDIO / MMCSD:
RT_USING_SDIO:使能 RT-Thread SDIO 框架;RT_SDIO_STACK_SIZE、RT_SDIO_THREAD_PRIORITY:SDIO 业务线程的栈大小与优先级;RT_MMCSD_STACK_SIZE、RT_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_NAME、RT_WLAN_DEVICE_AP_NAME:STA / AP 设备在 RT-Thread 中注册的名称;RT_WLAN_DEFAULT_PROT:WLAN 上层使用的网络协议栈类型(此处为lwip);RT_WLAN_SCAN_WAIT_MS、RT_WLAN_CONNECT_WAIT_MS:扫描与连接的超时时间;RT_WLAN_SSID_MAX_LENGTH、RT_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_LWIP212、RT_USING_LWIP_VER_NUM:选择 lwIP 2.1.2 版本;RT_LWIP_IGMP、RT_LWIP_ICMP、RT_LWIP_DNS、RT_LWIP_DHCP:分别打开 IGMP、ICMP、DNS、DHCP 功能;RT_LWIP_IPADDR、RT_LWIP_GWADDR、RT_LWIP_MSKADDR:静态 IPv4 地址 / 网关 / 子网掩码配置(在未使用 DHCP 或作为默认回退时使用);RT_LWIP_UDP、RT_LWIP_TCP、RT_LWIP_RAW:打开 UDP / TCP / RAW 套接字支持;RT_MEMP_NUM_NETCONN、RT_LWIP_PBUF_NUM、RT_LWIP_*_PCB_NUM、RT_LWIP_TCP_SEG_NUM:lwIP 内部连接、缓存、PCB、分段等资源数量;RT_LWIP_TCP_SND_BUF、RT_LWIP_TCP_WND:TCP 发送缓冲和接收窗口大小;RT_LWIP_TCPTHREAD_*、RT_LWIP_ETHTHREAD_*:TCP/IP 线程和以太网输入线程的优先级、栈大小和邮箱大小;RT_LWIP_REASSEMBLY_FRAG:使能 IP 分片重组;LWIP_NETIF_STATUS_CALLBACK、LWIP_NETIF_LINK_CALLBACK:打开 netif 状态 / 链路回调;RT_LWIP_NETIF_NAMESIZE:网卡名称最大长度;SO_REUSE、LWIP_SO_RCVTIMEO、LWIP_SO_SNDTIMEO、LWIP_SO_RCVBUF、LWIP_SO_LINGER:常见 socket 选项支持;LWIP_NETIF_LOOPBACK:是否开启协议栈内部 loopback(此处为关闭);RT_LWIP_USING_PING:在 lwIP 中使能 ping 命令;RT_LWIP_USING_WEBSOCKET、LWIP_ALTCP、LWIP_ALTCP_TLS:使能 WebSocket 以及基于 ALTCP 的 TLS 支持。
安全相关组件:
PKG_USING_MBEDTLS:使能 mbedtls 加解密组件;PKG_USING_MBEDTLS_USE_ALL_CERTS、PKG_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。
net work 相关配置如下:
在 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 [32m[1760] I/drv.sdhci: sdhci_set_clock2 400000
01-21 14:46:44:982 [0m[32m[2132] I/SDIO: detect SDIO begin
01-21 14:46:44:985 [0mclock 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 [32m[2284] I/SDIO: detect SD card BEGIN
01-21 14:46:44:993 [0mclock 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 [32m[2446] I/SDIO: detect MMC begin
01-21 14:46:44:996 [0mclock 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各个引脚的电气特性是否正常
WiFi寻卡成功了,但是在固件下载失败了
2.1. 可能是wifi睡眠了,使用万用表测量wifi的gpio0引脚看是否是低电平;解决方法,检查wifi的gpio0与gpio1引脚是否配置正确
2.2. sdio总线通讯失败;请检查与sdio总线通信地址。
2.3. 请降低sdio的频率再尝试
8.5 开关WIFI出现wifi启动失败¶
可能原因是断开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 接口。