适用开发板:ESP32P4-C5 4.3 寸触摸屏
工程:P4_C5_4.3_Firmware/02.beginner.wifi_station
target:esp32p4
学习时长:约 25 分钟 · 难度:★★★☆☆
API 概念:WiFi使用教程
学习目标
完成本节后,你将能够:
- 理解 P4C5 双芯片 Wi-Fi 架构(P4 主控 + C5 协处理器)
- 掌握
esp_wifi_*API 在 P4 上的使用方法 - 了解 C5 协处理器的启动等待机制
- 为后续 HTTP/MQTT/OTA 等网络例程打好基础
1. 这个例子在干嘛
Station 模式连接路由器、DHCP 获取 IP 地址;MIPI 大屏显示连接状态、IP 与重试次数。
P4C5 的 Wi-Fi 与 Korvo 有本质区别:
Korvo(ESP32-S3):Wi-Fi 在芯片内部
┌─────────────────┐
│ ESP32-S3 │
│ CPU + Wi-Fi │ ← 一颗芯片搞定
│ 直接调用 │
└─────────────────┘
P4C5:Wi-Fi 在外置 C5 协处理器上
┌─────────────────┐ SDIO 总线 ┌──────────┐
│ ESP32-P4 │◄──────────────►│ ESP32-C5 │
│ CPU(强算力) │ esp_hosted │ Wi-Fi │
│ 无 Wi-Fi! │ 协议透传 │ 2.4GHz │
└─────────────────┘ └──────────┘
关键区别:应用层代码 完全一样(都用 esp_wifi_connect()),但 P4C5 底层多了一个 esp_hosted 层,负责将 Wi-Fi 命令通过 SDIO 总线转发给 C5。
2. 编译烧录
cd P4_C5_4.3_Firmware\02.beginner.wifi_station
idf.py set-target esp32p4
idf.py menuconfig # 必须配置 Wi-Fi SSID/密码!
idf.py build flash monitor
3. menuconfig 配置
Example Connection Configuration:
| 选项 | 说明 | 示例 |
|---|---|---|
| WiFi SSID | 路由器名称 | MyHome_2.4G |
| WiFi Password | Wi-Fi 密码 | 12345678 |
| Maximum retry | 最大重连次数 | 默认 5 |
必须 2.4GHz 网络! C5 仅支持 2.4GHz,不支持 5GHz。
4. P4C5 联网核心要点
4.1 C5 启动等待(最重要!)
上电后 C5 协处理器需要 10~20 秒 完成自身固件加载和 SDIO 链路建立。在此期间调用 esp_wifi_connect() 会失败。
时间线:
0s P4 上电 → app_main 开始
│
3s C5 固件加载中...
│
10s 串口出现 "Transport active" ← C5 就绪!
│
12s esp_wifi_connect() → 成功
│
15s GOT_IP → 屏幕显示 IP
新手常犯错误:上电 5 秒内看到 DISCONNECTED 就以为板子坏了——不是,只是 C5 还没准备好。
4.2 判断 C5 是否就绪
| 串口关键字 | 含义 |
|---|---|
esp_hosted: Transport active | SDIO 链路建立,C5 就绪 |
wifi:connected with ... | Wi-Fi 连接成功 |
wifi:got ip:192.168.x.x | DHCP 获取 IP |
4.3 底层协议栈
应用层:esp_wifi_connect() ← 你写的代码
↓
抽象层:esp_wifi_remote ← IDF 内部透明封装
↓
传输层:esp_hosted ← SDIO 通道管理
↓
硬件层:SDIO Bus → C5 芯片 ← 实际执行 Wi-Fi 操作
应用层代码与 Korvo 完全兼容——同一个 station_example_main.c 换个 target 就能编译。
5. 核心流程
app_main
├── LVGL 屏幕初始化(BSP)
├── nvs_flash_init()
├── wifi_init_sta()
│ ├── esp_netif_init()
│ ├── esp_event_loop_create()
│ ├── esp_wifi_init()
│ ├── 注册事件回调:
│ │ ├── STA_START → esp_wifi_connect()
│ │ ├── DISCONNECTED → 重连 + 屏幕 retry
│ │ └── GOT_IP → 屏幕显示 IP
│ ├── esp_wifi_set_config(SSID/密码)
│ └── esp_wifi_start() → 触发 STA_START
│
└── 事件循环持续运行...
Wi-Fi 是 事件驱动,不要在
app_main里写while(!connected)阻塞等 IP。
6. 运行现象
| 阶段 | MIPI 屏幕显示 | 串口输出 |
|---|---|---|
| 等待 C5 | 连接中... | esp_hosted 日志 |
| C5 就绪 | — | Transport active |
| 连接 Wi-Fi | SSID + "连接中" | wifi:connected with ... |
| 获取 IP | IP 地址 | wifi:got ip:192.168.x.x |
| 连接失败 | 重试次数递增 | DISCONNECTED, retry N |
7. 关键文件
| 文件 | 作用 | 重点关注 |
|---|---|---|
main/station_example_main.c | Wi-Fi 事件处理、重连逻辑 | 事件回调函数 |
main/Kconfig.projbuild | menuconfig 选项 | SSID/密码/重试 |
ksdiy_p4c5_bsp / display | 屏幕 UI | 状态显示 |
8. 常见问题与排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 上电 5 秒内失败 | C5 未就绪 | 等 10~20 秒!看到 Transport active 再判断 |
| 一直 retry 到上限 | SSID/密码错误 | 核对大小写和空格 |
| 一直 retry 到上限 | 路由器是 5GHz | 切换到 2.4GHz |
| 一直 retry 到上限 | 隐藏 SSID | 关闭隐藏或用 BSSID |
| P4 正常但无 Wi-Fi | C5 协固件版本不匹配 | 确认 esp_hosted 组件版本 |
| P4 正常但无 Wi-Fi | SDIO 分区数据异常 | idf.py erase-flash 重烧 |
| 连上无 IP | 路由器 DHCP 池满 | 重启路由器 |
| 改 SSID 无效 | 没重新编译 | menuconfig 保存后 idf.py build flash |
9. 隔离测试 C5
如果怀疑 C5 本身有问题,可以先跑单独的 Wi-Fi 扫描测试:
cd P4_C5_4.3_Firmware\05.test.wifi_scan_c5
idf.py set-target esp32p4
idf.py build flash monitor
这个测试只扫描周围 AP 列表,不需要密码,能确认 C5 硬件是否正常。
10. 动手改造建议
- 显示 RSSI:获取 IP 后调用
esp_wifi_sta_get_ap_info()显示信号强度 - 友好提示:失败超过 N 次在 MIPI 大屏显示「请检查路由器设置」
- Wi-Fi 扫描:对比
05.test.wifi_scan_c5,显示周围所有可用网络 - 自动重连:改为无限重连 + 指数退避延时
11. Korvo vs P4C5 Wi-Fi 对比
| 对比项 | Korvo S3 | P4C5 |
|---|---|---|
| Wi-Fi 芯片 | S3 内置 | C5 外置协处理器 |
| 上电到可连接 | 即时(2~3秒) | 需等 C5(10~20秒) |
| 频段 | 2.4GHz | 2.4GHz |
| 应用层 API | esp_wifi_* | 完全相同 |
| 底层传输 | 内部 | SDIO + esp_hosted |
| 代码兼容 | — | 同一份 main.c 两板均可编译 |
12. 下一步
本例是 P4C5 所有网络例程的起点:
| 方向 | 推荐例程 | 说明 |
|---|---|---|
| HTTP 服务器 | HTTP Server | Web 服务 |
| MQTT 通信 | MQTT | 物联网消息 |
| OTA 升级 | OTA | 远程更新固件 |
| C5 隔离测试 | 05.test.wifi_scan_c5 | 验证 C5 硬件 |
酷世DIY · Kevincoooool