news 2026/6/10 20:31:22

ST7735 SPI模式选择与极性配置详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ST7735 SPI模式选择与极性配置详解

搞定ST7735屏幕黑屏、花屏?一文讲透SPI模式与时钟极性配置

你有没有遇到过这样的情况:接上ST7735彩屏,代码烧进去,结果——黑屏、乱码、颜色错乱、只显示半幅画面

别急,这多半不是你的代码写错了,也不是硬件焊坏了。
真正的问题,往往藏在最底层的通信细节里:SPI时序配置不匹配

尤其是对新手而言,ST7735虽然便宜好用,但“脾气”有点怪——它支持多种SPI模式,而不同模块出厂设置还不一样。稍有不慎,主控MCU和屏幕就“鸡同鸭讲”,根本没法正常通信。

今天我们就来彻底拆解ST7735的SPI通信机制,从原理到实战,手把手教你避开那些坑,一次点亮!


为什么我的ST7735没反应?先看SPI模式对不对

我们常说的SPI(Serial Peripheral Interface),是一种高速同步串行总线,常用于MCU与外设之间的短距离通信。对于像ST7735这种TFT驱动芯片来说,它是靠SPI接收命令和图像数据的核心通道。

但问题来了:SPI有四种工作模式(Mode 0~3),由两个关键参数决定:

  • CPOL(Clock Polarity):时钟空闲状态是高还是低?
  • CPHA(Clock Phase):数据是在第一个边沿采样,还是第二个?
SPI ModeCPOLCPHASCLK空闲电平数据采样边沿
000上升沿
101下降沿
210下降沿
311上升沿

那么,ST7735到底该用哪种模式?

答案是:主要支持 Mode 0 和 Mode 3,具体取决于你手上的模块设计。

⚠️ 注意!这里有个大坑:官方手册说支持,不代表所有模组都默认启用同一个模式。有些厂商做的PCB拉了不同的上拉电阻,或者内部寄存器初始化流程不同,会导致模块上电后期望的SPI行为不一样。

所以你会发现:同样的代码,在A家买的板子能亮,在B家买的就不行——很可能就是因为SPI模式不匹配。


ST7735是怎么通过SPI收数据的?搞懂这个才能调通

我们来看一次典型的写操作流程:

  1. MCU拉低CS引脚,表示“我要开始说话了”;
  2. 设置DC引脚电平:
    -DC = 0→ 接下来传的是命令(比如清屏、设置区域)
    -DC = 1→ 接下来传的是数据(比如像素点阵)
  3. 发送SCLK时钟,同时通过MOSI一位位发送字节;
  4. ST7735在指定的时钟边沿把数据“抓”下来;
  5. 传输完成,释放CS

整个过程必须保证双方对时钟怎么跳、什么时候读数据达成一致。

举个例子:

如果你的MCU配置成Mode 0(CPOL=0, CPHA=0)
- SCLK平时是低电平;
- 第一个上升沿采样第一位数据。

但如果ST7735模组实际需要的是Mode 3(CPOL=1, CPHA=1)
- 它认为SCLK平时应该是高电平;
- 要等到第二个边沿才采样。

结果就是:两边节奏完全错开,收到的数据全是错的,轻则花屏,重则毫无反应。

🔍 实测建议:用示波器看一下SCLK上电后的空闲电平。如果是高电平,大概率要用Mode 3;如果是低电平,则优先尝试Mode 0。


关键引脚不止SPI三根线,DC和RST同样重要

很多人只关注SCLK、MOSI、CS,却忽略了两个隐藏的关键角色:DC 和 RST

DC引脚:命令与数据的“开关”

这是ST7735区别于普通SPI设备的最大特点之一。

没有DC引脚的话,芯片怎么知道你发的0x2C是“开始写显存”的命令,还是某个像素的颜色值?

所以每次传输前,必须提前设置好DC:

// 写命令 HAL_GPIO_WritePin(DC_PORT, DC_PIN, GPIO_PIN_RESET); HAL_SPI_Transmit(&hspi, &cmd, 1, 10); // 写数据 HAL_GPIO_WritePin(DC_PORT, DC_PIN, GPIO_PIN_SET); HAL_SPI_Transmit(&hspi, pixel_data, len, 100);

如果DC接反或没控制,后果很严重——可能把“复位命令”当成颜色数据处理,直接导致状态混乱。

RST引脚:别忘了“重启一下”

虽然有些模块可以软启动,但稳妥起见,一定要在初始化时主动触发一次硬件复位:

HAL_GPIO_WritePin(RST_PORT, RST_PIN, GPIO_PIN_RESET); HAL_Delay(10); // 至少保持10ms低电平 HAL_GPIO_WritePin(RST_PORT, RST_PIN, GPIO_PIN_SET); HAL_Delay(120); // 等待内部电路稳定

跳过这一步,芯片可能停留在未知状态,后续命令全部失效。


STM32实战配置:如何正确初始化SPI接口

以STM32 HAL库为例,下面是推荐的SPI初始化方式(适用于大多数ST7735模块):

SPI_HandleTypeDef hspi1; void MX_SPI1_Init(void) { hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; // 必须为主机! hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // CPOL = 0 hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // CPHA = 0 → Mode 0 hspi1.Init.NSS = SPI_NSS_SOFT; // 软件控制CS hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; // 假设APB2为84MHz → SCLK≈21MHz hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; if (HAL_SPI_Init(&hspi1) != HAL_OK) { Error_Handler(); } }

📌重点提醒
-SPI_MODE_SLAVE是笔误常见坑!MCU必须作为主机;
- 若通信失败,可尝试改为SPI_POLARITY_HIGH+SPI_PHASE_2EDGE切换至Mode 3
- 波特率不宜过高,初次调试建议降到DIV16或更低,排除信号完整性干扰。


初始化之后还不能显示?检查这几个环节

即使SPI配置正确,仍可能出现以下问题:

黑屏无反应?

  • ✅ 是否执行了RST复位?
  • ✅ CS是否全程拉低?中途切换可能导致中断写入;
  • ✅ VCC、背光供电是否正常?部分模块需额外供LED阳极电压。

显示花屏、颜色颠倒?

  • ✅ 检查RGB565字节顺序:某些MCU小端模式下需交换高低字节;
  • ✅ 尝试切换SPI Mode 0 ↔ Mode 3;
  • ✅ 查看是否有DMA内存对齐问题(若使用DMA传输)。

只显示一部分内容?

  • ✅ 是否正确设置了GRAM区域?记得发CASET(列地址)和RASET(行地址);
  • ✅ 写入数据量是否超过设定范围?多余数据会被丢弃;
  • ✅ 是否重复发送了错误命令导致地址指针偏移?

工程师私藏经验:这些设计细节决定成败

✔️ 优先尝试 Mode 0,不行再切 Mode 3

90% 的国产ST7735模块出厂默认使用 Mode 0,建议先以此为基础调试。失败后再改配置测试 Mode 3。

✔️ 用硬件SPI + DMA,别靠GPIO模拟

软件模拟SPI(bit-banging)虽然灵活,但刷一帧128×160的图片要几十毫秒,用户体验极差。
建议启用硬件SPI配合DMA进行批量数据传输,显著提升刷新效率。

✔️ 电源去耦不能省

ST7735工作电流可达50mA以上,尤其背光开启时波动剧烈。务必在VDD、AVDD附近加0.1μF陶瓷电容,最好再并联一个10μF钽电容滤低频噪声。

✔️ 走线尽量短,远离干扰源

SPI属于高速信号,长线易受电磁干扰。特别是SCLK,最好与其他数字线平行且远离电源线或晶振。

✔️ 使用经过验证的初始化序列

不同批次的ST7735可能存在细微差异,不要自己瞎猜寄存器配置。
推荐使用Adafruit GFX库中的init code,经过大量项目验证,稳定性极高。


总结:点亮ST7735的核心逻辑链

要想让这块小小的彩屏乖乖听话,你需要打通这条完整的链路:

硬件连接正确 → RST复位生效 → SPI模式匹配(CPOL/CPHA)→ DC精准控制 → 初始化序列完整 → GRAM地址设置准确 → 数据格式无误

任何一个环节出问题,都会表现为“屏幕不亮”或“显示异常”。

而其中最容易被忽视的,就是SPI模式的选择与时钟极性的配置

记住一句话:

不是代码有问题,而是你们没在同一频道上对话。

当你面对一块沉默的屏幕时,不妨拿起示波器,看看SCLK的真实波形——也许答案就在那条跳动的曲线上。


如果你正在做智能手表、物联网面板、DIY仪表盘,或是学习嵌入式图形开发,掌握ST7735这类常用驱动芯片的底层通信逻辑,绝对是一项硬核技能。

下次再遇到屏幕不亮,别再盲目换线、重烧代码了。静下心来,从SPI时序开始排查,往往事半功倍。

💡你在调试ST7735时踩过哪些坑?欢迎在评论区分享你的解决方案!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/2 12:52:17

JUCE频谱可视化:用FFT技术打造专业级音频分析界面

JUCE频谱可视化:用FFT技术打造专业级音频分析界面 【免费下载链接】JUCE 项目地址: https://gitcode.com/gh_mirrors/juce/JUCE JUCE框架为音频开发者提供了强大的频谱可视化能力,特别是通过FFT(快速傅里叶变换)技术实现的…

作者头像 李华
网站建设 2026/6/10 17:38:30

DISM++系统修复工具弱爆了?ms-swift能修复你的模型训练流程

ms-swift:不只是修复模型训练,更是重塑AI工程范式 在大模型时代,我们正面临一个看似矛盾的现象:模型能力飞速进化,但将其真正落地的门槛却越来越高。一个70亿参数的模型,理论上只需一张消费级显卡就能微调&…

作者头像 李华
网站建设 2026/6/10 14:59:56

如何快速上手ASCII艺术生成器:面向初学者的完整指南

如何快速上手ASCII艺术生成器:面向初学者的完整指南 【免费下载链接】ascii-art A Node.js library for ansi codes, figlet fonts, ascii art and other ASCII graphics 项目地址: https://gitcode.com/gh_mirrors/as/ascii-art ASCII艺术生成器是一个功能强…

作者头像 李华
网站建设 2026/6/9 21:37:19

OpenSCAD革命性突破:为何代码优先策略正在重塑3D设计行业格局

OpenSCAD革命性突破:为何代码优先策略正在重塑3D设计行业格局 【免费下载链接】openscad OpenSCAD - The Programmers Solid 3D CAD Modeller 项目地址: https://gitcode.com/gh_mirrors/op/openscad 在传统CAD软件主导的设计领域,一种全新的设计…

作者头像 李华
网站建设 2026/5/22 10:37:22

OpenWrt第三方WiFi芯片驱动编译实战指南

OpenWrt第三方WiFi芯片驱动编译实战指南 【免费下载链接】OpenWrt_x86-r2s-r4s-r5s-N1 一分钟在线定制编译 X86/64, NanoPi R2S R4S R5S R6S, 斐讯 Phicomm N1 K2P, 树莓派 Raspberry Pi, 香橙派 Orange Pi, 红米AX6, 小米AX3600, 小米AX9000, 红米AX6S 小米AX3200, 红米AC2100…

作者头像 李华
网站建设 2026/6/10 15:48:20

构建可靠驱动:ioctl异常处理完整示例

构建可靠驱动:从零实现一个带完整异常处理的ioctl接口你有没有遇到过这样的情况?用户程序一个简单的ioctl()调用,直接让内核“啪”地一声崩溃了——Oops 甚至 Panic,日志里只留下一行神秘的 page fault 地址,排查起来头…

作者头像 李华