2. 读不到数据:完全没反应或读回全 FF
"读不到数据"是出现频率最高的一类问题:有的完全没反应,有的能通信但读回的值不对。这一章按"先硬件、再通信"的顺序排查。
2.1 动手前先查:上电与硬件检查清单
先用万用表和目检过一遍这 8 项,很多"读不到"在这一步就解决了:
| 序号 | 检查项 | 正常要求 | 常见问题 |
|---|---|---|---|
| 1 | 供电 | 按手册,常见 3.3V | 5V 直供、纹波大 |
| 2 | 去耦 | VCC 就近 0.1μF | 无去耦、走线长 |
| 3 | CS 上拉 | 典型 10kΩ 至 VCC | 悬空,上电被误选中 |
| 4 | SO/SI/CLK | 不悬空,长线加串阻 | 杜邦线、排线过长 |
| 5 | 共地 | 地线短而粗 | 只连一根细地线 |
| 6 | 焊接 | 无虚焊、连锡、错位 | QFN/DFN 底部虚焊 |
| 7 | 电平 | 3.3V 器件,5V 需转换 | 5V GPIO 直连 |
| 8 | 上电时序 | CS 上电为高 | MCU 先上电、IO 倒灌 |
2.2 读不到数据五步排查法
第一步:确认 MCU 有没有发波形
- 四根线都无波形 → 软件 / 引脚复用 / SPI 未使能 / 程序未执行。
- MCU 端有、芯片端没有 → 断线、虚焊、排线。
- 幅度不对 → 供电、上拉、短路、电平匹配。
第二步:确认 CS 是否选中
- CS 空闲必须为高,读操作期间为低。
- CS 常高 → 片选未调用 / 映射错 / 被占用。
- CS 常低 → 上电默认低 / 上拉缺失 / 多从设备争用。
第三步:确认 SPI 模式、位序、速率
- 多为 Mode 0 或 Mode 3,MSB first,以手册为准。
- 先 ≤1MHz 验证。
- 数据整体移位 → 改 CPHA;全错 → 改 CPOL / 位序。
第四步:确认指令、地址、dummy
- 读操作:CS 低 → 读指令 → 地址(通常 3 字节,MSB)→(dummy)→ 读 N 字节 → CS 高。
- 少发 / 多发字节、地址序反、dummy 数错,都会读回 0xFF 或错位。
第五步:确认库与型号匹配
- 库必须按实际型号生成;换型号沿用旧库,可能初始化"成功"但取模全 0(见第 4 章)。
抓到波形后,按下面的要点逐项核对:
| 观察点 | 正常表现 | 异常含义 |
|---|---|---|
| CS 保持时间 | 最后一个 CLK 后 CS 才拉高 | 末字节可能丢失 |
| CLK 空闲电平 | 与 CPOL 一致 | 模式配错 |
| CLK 边沿 | 单调、无振铃 | 反射导致误采样 |
| MISO 采样沿 | 稳定、幅度接近 VCC | 未选中 / 未供电 / 未接 |
| 帧长度 | 指令 + 地址 + dummy + 数据完整 | 少一位后续全错 |
| 字节间 CS | 保持低 | 中途拉高会终止读 |
完整的读操作驱动代码(硬件 SPI / 软件模拟两种)见字库芯片开发资料 · SPI 驱动。
2.3 Q03 四根线都没有波形,从哪里查
现象
字库读不出数据、出现乱码;用示波器看 CS、DI(MOSI)、DO(MISO)、CLK 四根线都没有波形。
原因分析
四根线都无波形,说明 MCU 根本没有发起 SPI 传输——问题通常在软件、引脚配置或供电,而不是字库芯片。(如果波形正常但数据错乱,直接看 2.4 Q04。)
解决办法
- 程序是否执行到读函数:在读函数入口翻转空闲 GPIO,用示波器确认。
- SPI 外设是否使能:时钟、初始化、
SPI_Enable。 - 引脚复用:AF 编号、复用推挽、上下拉。
- 片选:CS 引脚映射、片选函数是否调用。
- 外设占用:同一组 SPI 是否已分配给 Flash / 屏幕。
- 硬件通路:排线断线、虚焊、芯片未供电。
- 测量方法:探头地、量程、触发、是否测错引脚。
- 断开芯片测 MCU 端波形;用万用表测通断;确认 VCC/GND。
验证方法
写一个只做"读 ID"的最小测试:拉低 CS → 发一个 0x9F → 读回 8 字节 → 拉高 CS,用逻辑分析仪看四根线。最小测试通过后再接库函数。
spi_id_min_test.c
// 最小读 ID 测试:绕开字库库文件,直接验证 SPI 底层
uint8_t tmp_buf[8] = {0};
tmp_buf[0] = 0x9F;
gt_read_data(tmp_buf, 1, tmp_buf, 8); // 发送 1 字节指令,读回 8 字节
for (int i = 0; i < 8; i++)
{
printf("tmp_buf:%x\r\n", tmp_buf[i]); // 打印返回的值
}
gt_read_data的实现与移植说明见字库芯片开发资料 · SPI 驱动;读回值的判读见下一节。
2.4 Q04 发 0x9F 读回的数据异常
现象
发 0x9F 读 ID,读回的数据是 FF 0B 40 17… 这样的异常值。
原因分析
- 全 FF:MISO 未被驱动(未选中、未供电、MISO 未接、CS 时序错)。
- 部分字节"有值"但顺序不对:地址字节数、dummy、位序、CPHA 错。
- 数据整体移位:SPI 模式或位序错。
- 偶发错:速率过高、干扰、上拉缺失。
解决办法
- 确认 CS 整帧保持低,最后才拉高。
- 对照手册确认:指令码、地址字节数、字节序、dummy 数、读长度。
- 确认 SPI 模式和位序(MSB first)。
- 降速到 1MHz 以下重试。
- 逻辑分析仪抓完整帧,逐位对照时序图。
- 确认该型号是否支持 0x9F,以及 ID 定义(见字库芯片规格书)。
- 读 ID 正确、读字模错误 → 查地址和排置(Q15)。
- 读 ID 也错 → 通信层问题(Q03)。
对照帧结构检查每一部分是否完整:
SPI 读操作帧结构示意(Mode 0,具体指令、地址字节数、dummy 以型号数据手册为准)
验证方法
读手册中明确给出初值的地址(版本 / 头信息),再读字母 A 的 8×16 点阵(16 字节)。各型号 A 的期望点阵数据与调用代码见各型号字库芯片数据验证表,逐字节比对即可定位是"读错"还是"用错"。

