针对您的问题,STM32无法通过SPI驱动ST7796 LCD且出现短暂黑屏后白屏的现象,通常与SPI配置、初始化序列或硬件连接相关。以下是详细的排查步骤和CubeMX配置指南:
1. 硬件连接检查
确保以下关键引脚正确连接(对照ST7796手册): |
STM32引脚 |
ST7796引脚 |
作用 |
|---|
SPIx_MOSI |
SDA/DIN |
数据输入 |
SPIx_SCK |
SCL |
时钟信号 |
GPIO |
CS |
片选 (低有效) |
GPIO |
DC/RS |
命令/数据切换 |
GPIO |
RESET |
硬件复位 |
GPIO |
BLK |
背光控制 |
3.3V |
VCC |
电源 (3.3V) |
GND |
GND |
地线 |
注意:
- 使用示波器或逻辑分析仪检查SCK、MOSI信号是否正常。
- RESET必须在初始化前执行有效复位(拉低>10ms)。
- BLK背光引脚需使能(拉高或PWM驱动)。
2. STM32CubeMX关键配置
(1) SPI配置
- Mode: Full-Duplex Master
- Data Size: 8 bits
- Baud Rate: ≤10Mbps(初始建议1-2Mbps,后续可提速)
- Clock Polarity (CPOL):
- 尝试 Low (0) 或 High (1)(参考ST7796时序图)。
- Clock Phase (CPHA):
- 尝试 1 Edge (0) 或 2 Edge (1)(通常与CPOL组合为Mode 0或Mode 3)。
- NSS Signal Type: Software(手动控制CS引脚)。
(2) GPIO配置
引脚类型 |
配置模式 |
初始状态 |
描述 |
|---|
CS |
Output Push-Pull |
High |
片选(空闲高) |
DC |
Output Push-Pull |
Low |
命令/数据选择 |
RESET |
Output Push-Pull |
High |
复位信号 |
BLK |
Output Push-Pull |
High |
背光控制 |
3. 初始化代码常见问题
(1) 复位时序错误
// 硬件复位(必须!)
HAL_GPIO_WritePin(RESET_GPIO_Port, RESET_Pin, GPIO_PIN_RESET); // 拉低复位
HAL_Delay(15); // 保持低电平15ms
HAL_GPIO_WritePin(RESET_GPIO_Port, RESET_Pin, GPIO_PIN_SET); // 释放复位
HAL_Delay(120); // 等待复位完成(手册要求>120ms)
(2) SPI发送函数错误
确保正确处理DC引脚和CS片选:
void ST7796_WriteCommand(uint8_t cmd) {
HAL_GPIO_WritePin(DC_GPIO_Port, DC_Pin, GPIO_PIN_RESET); // DC=0 (命令)
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); // CS=0 (选中)
HAL_SPI_Transmit(&hspi, &cmd, 1, HAL_MAX_DELAY);
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); // CS=1 (释放)
}
void ST7796_WriteData(uint8_t data) {
HAL_GPIO_WritePin(DC_GPIO_Port, DC_Pin, GPIO_PIN_SET); // DC=1 (数据)
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); // CS=0
HAL_SPI_Transmit(&hspi, &data, 1, HAL_MAX_DELAY);
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); // CS=1
}
(3) 初始化序列问题
参考ST7796数据手册或厂商提供的序列(示例片段):
// 软件复位
ST7796_WriteCommand(0x01);
HAL_Delay(150); // 等待复位完成
// 退出睡眠模式
ST7796_WriteCommand(0x11);
HAL_Delay(120); // 手册要求120ms
// 设置像素格式 (如RGB565)
ST7796_WriteCommand(0x3A);
ST7796_WriteData(0x55); // 16-bit模式
// 开启显示
ST7796_WriteCommand(0x29);
HAL_Delay(100);
4. 关键排查点
SPI时序模式:
80%的问题源于CPOL/CPHA设置错误!
尝试4种组合:(CPOL=0, CPHA=0) -> (0,1) -> (1,0) -> (1,1)。
初始化延迟不足:
复位后必须等待>120ms,睡眠模式退出需>120ms。
背光未使能:
确认BLK引脚已设置为高电平。
显存数据未写入:
初始化后需发送完整的显存数据(例如全屏填充红色测试)。
电源稳定性:
检查VCC电压(需稳定3.3V),必要时增加10μF电容滤波。
5. 调试技巧
逻辑分析仪:
捕获SPI波形,确认DC/CS信号与数据时序匹配ST7796手册。
简化测试代码:
// 填充屏幕为红色 (RGB565)
ST7796_WriteCommand(0x2C); // 显存写入命令
for (uint32_t i = 0; i < (320*480); i++) {
ST7796_WriteData(0xF8); // R:5位=11111, G:6位的前3位=111
ST7796_WriteData(0x00); // G:后3位=000, B:5位=00000
}
替换驱动库:
使用成熟开源库(如Tilen Majerle的STM32 LCD驱动)对比验证。
推荐解决方案流程
- 检查硬件电源和接线。
- 在CubeMX中配置SPI模式为 Mode 0 (CPOL=0, CPHA=0)。
- 在代码中严格遵循复位时序(拉低>10ms + 等待120ms)。
- 使用厂商提供的完整初始化序列(可从屏幕卖家获取或查找GitHub同型号驱动)。
- 全屏填充颜色测试(排除显存写入问题)。
- 逐步提高SPI速度至稳定上限。
如问题仍存在,请提供:
- 完整的SPI初始化代码(CubeMX截图)
- 实际硬件接线图
- ST7796的具体型号和购买链接(不同批次可能时序差异)
- 逻辑分析仪波形(如有)
通过以上步骤,90%的SPI驱动问题可解决。