开始前适用开发板:ESP32-P4 + ESP32-C5 · 开发框架:ESP-IDF
适用开发板:ESP32P4-C5 4.3 寸触摸屏
工程:P4_C5_4.3_Firmware/02.beginner.mipi_lcd_touch
target:esp32p4
硬件:ST7102 MIPI DSI 480×800 + ST7123 触摸 + AXP2101 PMIC
学习时长:约 30 分钟 · 难度:★★★☆☆
学习目标
完成本节后,你将能够:
- 理解 MIPI DSI 接口的基本概念与初始化流程
- 掌握 AXP2101 PMIC 在显示系统中的关键作用
- 了解 LVGL 在 MIPI 大屏上的移植方法
- 区分 MIPI DSI(P4C5)与 SPI(Korvo)两种显示方案的差异
Korvo 为 SPI 小屏,见 Korvo spi_lcd_touch。
1. 这个例子在干嘛
MIPI DSI 屏幕的 首次点亮(bring-up)——初始化 MIPI 物理层、配置显示面板、注册触摸驱动、跑 LVGL Meter 仪表盘 Demo。这是 P4C5 所有图形例程的基础。
你会看到:一个可触摸、可旋转的 LVGL 仪表盘界面。
┌─────────────────────────────────────────────┐
│ AXP2101 PMIC │
│ LDO → MIPI PHY 供电 LDO → 背光/其他 │
├─────────────────────────────────────────────┤
│ ESP32-P4 主芯片 │
│ ┌──────────┐ ┌───────────┐ │
│ │ MIPI DSI │───→│ ST7102 │→ 4.3寸 LCD │
│ │ 控制器 │ │ 面板驱动 │ 480×800 │
│ └──────────┘ └───────────┘ │
│ ┌──────────┐ ┌───────────┐ │
│ │ I2C Bus │───→│ ST7123 │→ 触摸输入 │
│ │ SCL=8 │ │ 触摸 IC │ │
│ │ SDA=7 │ └───────────┘ │
│ └──────────┘ │
└─────────────────────────────────────────────┘
MIPI DSI vs SPI——为什么 P4 用 MIPI?
| 对比项 | SPI LCD(Korvo) | MIPI DSI(P4C5) |
|---|---|---|
| 分辨率 | 240×280 | 480×800 |
| 带宽 | 最高 ~80 MHz 单线 | 多 Lane 差分高速 |
| 刷新率 | 低(需要局部刷新) | 高(全屏 60fps 可达) |
| 接线 | 少量 GPIO | 专用 MIPI 物理层 |
| 初始化 | 简单 | 需要 PMIC 供电序列 |
2. 硬件要点
2.1 关键引脚
| 信号 | GPIO | 说明 |
|---|---|---|
| 触摸 SCL | 8 | I2C 时钟 |
| 触摸 SDA | 7 | I2C 数据 |
| 触摸 INT | 23 | 中断信号 |
| LCD RST | 22 | 面板硬件复位 |
| 背光 PWM | 6 | 亮度控制 |
2.2 AXP2101 PMIC 的角色
AXP2101 是整个显示系统能亮屏的前提。MIPI PHY(物理层)需要精确的供电电压,由 AXP2101 的 LDO 通道提供。
上电序列:
1. I2C 初始化 AXP2101
2. 配置 MIPI PHY 所需 LDO 电压
3. 等待电源稳定(延时)
4. 初始化 MIPI DSI 控制器
5. 发送面板初始化命令序列
6. 开启背光
关键理解:如果 AXP2101 没有正确初始化,MIPI PHY 没有供电,屏幕一定不会亮——这是最常见的「不亮屏」原因。
3. 编译烧录
cd P4_C5_4.3_Firmware\02.beginner.mipi_lcd_touch
idf.py set-target esp32p4
idf.py build flash monitor
4. 运行现象
| 阶段 | 屏幕表现 | 串口输出 |
|---|---|---|
| 上电 | 短暂黑屏(PMIC 初始化) | AXP2101 配置日志 |
| MIPI 初始化 | 屏幕亮起 | MIPI DSI init OK |
| LVGL 启动 | Meter 仪表盘出现 | LVGL 初始化日志 |
| 触摸交互 | 可拖动指针;ROTATE 按钮可旋转 | 触摸事件日志 |
ROTATE 功能:点击左下角 ROTATE 按钮,UI 在 0°/90°/180°/270° 间切换,触摸坐标同步旋转。
5. 关键文件与代码解析
| 文件 | 作用 | 重点关注 |
|---|---|---|
main/app_main.c | 完整初始化流程 + LVGL port | AXP → MIPI → Touch → LVGL |
main/lvgl_demo_ui.c | Meter 仪表盘 + 旋转按钮 | LVGL 9 API 用法 |
初始化流程详解
app_main()
│
├── I2C 初始化(总线 0:GPIO 7/8)
├── AXP2101 PMIC 配置
│ └── 开启 MIPI PHY 所需 LDO
│
├── MIPI DSI 初始化
│ ├── 配置 MIPI 时钟、Lane 数
│ ├── 创建 DBI(Display Bus Interface)
│ └── ST7102 面板初始化命令序列
│
├── 背光开启(GPIO6 PWM)
│
├── 触摸初始化
│ └── ST7123 I2C + 中断(GPIO23)
│
├── LVGL 初始化
│ ├── lv_init()
│ ├── 注册 display(flush → MIPI 写屏)
│ ├── 注册 indev(read → I2C 触摸)
│ └── 创建 LVGL 任务
│
└── lvgl_demo_ui_init() → Meter 仪表盘
MIPI DSI 初始化核心概念
MIPI DSI 协议栈:
┌────────────────┐
│ 应用层命令 │ DCS(Display Command Set)
├────────────────┤
│ 协议层 │ 包头、校验、数据包封装
├────────────────┤
│ 物理层 (PHY) │ 差分信号、时钟恢复、Lane 管理
└────────────────┘
ESP32-P4 内置 MIPI DSI 控制器,驱动过程:
1. 配置 PHY 时钟和 Lane
2. 通过 DCS 命令配置面板参数(反显、色深、扫描方向)
3. 通过 Video Mode 持续推送帧数据
6. 与 BSP 方式的关系
| 本例(手写移植) | BSP + adapter |
|---|---|
| 手动写 AXP、MIPI、Touch 初始化 | ksdiy_p4c5_bsp 一行搞定 |
| 手动注册 LVGL display/indev | esp_lvgl_adapter 自动处理 |
| 适合 学习原理 | 适合 产品开发 |
后续的 MP3、相册、小智等工程都使用 BSP 方式,不再重复本例的手写初始化代码。
7. 常见问题与排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 不亮屏 | AXP2101 未初始化 | 串口检查 AXP I2C 通信日志 |
| 不亮屏 | MIPI PHY LDO 未开 | 确认代码中 LDO 通道配置正确 |
| 不亮屏 | 排线松动 | 检查 MIPI FPC 排线 |
| 亮屏但全白/全黑 | 面板初始化命令序列错误 | 核对 ST7102 datasheet |
| 亮屏一闪即灭 | LDO 时序不对 | 增加上电延时 |
| 触摸无反应 | ST7123 I2C 通信失败 | 串口检查 I2C 日志;确认引脚 7/8 |
| 触摸坐标反了 | 旋转角与 LVGL 不匹配 | 使用 ROTATE 按钮调整,或修改代码中的旋转参数 |
| 编译报 OOM | LVGL 缓冲区过大 | 减小 CONFIG_LV_MEM_SIZE;启用 PSRAM |
8. 动手改造建议
- 切换 Demo:把 Meter 换成
lv_demo_music()或自己的 UI - 调节背光:修改 GPIO6 PWM 占空比,实现亮度渐变
- 旋转测试:尝试所有四个旋转方向,观察触摸坐标变化
- 显示图片:用 LVGL
lv_img显示一张自定义的 PNG/JPEG - 对比 Korvo:跑 Korvo 的 spi_lcd_touch,体会 SPI vs MIPI 的性能差距
9. 知识延伸
- MIPI DSI 的 Video Mode vs Command Mode:Video Mode 由主机持续推帧,适合视频/动画;Command Mode 按需更新,省电但不适合高帧率应用
- AXP2101:一颗多通道 PMIC(Power Management IC),除了给 MIPI 供电,还管理其他外设电源、充电等
- ESP32-P4 的显示优势:内置 MIPI DSI 控制器 + PPA(Pixel Processing Accelerator),硬件加速缩放、旋转、混合
10. 下一步
| 方向 | 推荐例程 | 说明 |
|---|---|---|
| BSP 方式跑 LVGL | lvgl_esp_adapter | 产品级集成 |
| 旋转专项 | 03.development.lvgl_esp_adapter_rotate | 四向旋转测试 |
| MP3 播放器 | MP3 | LVGL UI + 音频 |
酷世DIY · Kevincoooool