📚 SPI 技术系列 · 持续更新中
本系列从推挽电气层一路打到 Linux spi 子系统,把"四根线"背后的电气/协议/控制器/驱动/实战全拧成一根线。
👉 想系统追更,戳这里查看完整专栏:
👉 其他技术系列专栏,欢迎关注、交流、共同成长:
本篇定位:SPI 比 I2C 难调------没有 ACK,全双工双向,高速 SI。本篇讲 SPI 调试工具链(逻辑分析仪/示波器/spidev/dmesg/ftrace)、典型故障定位(CPOL/CPHA 错配/CS 时序/首末字节错/速度不稳)、降速调试法。读完你能独立排查 SPI 现场问题。
SPI 调试核心:逻辑分析仪 + 模式对比I2C 调试靠 i2c-tools 一条命令验证。SPI 没有等效工具,核心是逻辑分析仪抓波形 + 示波器看 SI + spidev 验证 。SPI 最常见故障是 CPOL/CPHA 错配(数据全错但无标志),靠逻辑分析仪解码一眼看出。对照 【I2C 技术系列 13】I2C 调试与排查 看,理解调试方法论的共通。
目录
- 一、调试工具链总览
-
- [1.1 工具分层](#1.1 工具分层)
- [1.2 SPI vs I2C 调试对比](#1.2 SPI vs I2C 调试对比)
- [1.3 调试流程](#1.3 调试流程)
- 二、逻辑分析仪解码
-
- [2.1 为什么逻辑分析仪是 SPI 调试核心](#2.1 为什么逻辑分析仪是 SPI 调试核心)
- [2.2 工具](#2.2 工具)
- [2.3 采样率要求](#2.3 采样率要求)
- [2.4 SPI 解码配置](#2.4 SPI 解码配置)
- [2.5 解码示例](#2.5 解码示例)
- [2.6 看什么](#2.6 看什么)
- [三、示波器看 SI](#三、示波器看 SI)
-
- [3.1 示波器看什么(逻辑分析仪看不到的)](#3.1 示波器看什么(逻辑分析仪看不到的))
- [3.2 探头设置](#3.2 探头设置)
- [3.3 关键测量](#3.3 关键测量)
- [3.4 典型 SI 问题波形](#3.4 典型 SI 问题波形)
- [四、spidev 用户态验证](#四、spidev 用户态验证)
-
- [4.1 spidev_test(内核自带)](#4.1 spidev_test(内核自带))
- [4.2 自定义测试程序](#4.2 自定义测试程序)
- [4.3 spidev 调试流程](#4.3 spidev 调试流程)
- [4.4 优势](#4.4 优势)
- [五、dmesg 与内核日志](#五、dmesg 与内核日志)
-
-
- [5.1 常见 SPI 错误码](#5.1 常见 SPI 错误码)
- [5.2 dmesg 看 SPI](#5.2 dmesg 看 SPI)
- [5.3 调试日志开大](#5.3 调试日志开大)
-
- [六、ftrace 与 regmap debugfs](#六、ftrace 与 regmap debugfs)
-
- [6.1 ftrace 抓 SPI 调用](#6.1 ftrace 抓 SPI 调用)
- [6.2 spi debugfs](#6.2 spi debugfs)
- [6.3 regmap debugfs(SPI 设备用 regmap 时)](#6.3 regmap debugfs(SPI 设备用 regmap 时))
- 七、典型故障定位
-
- [7.1 读不到器件(全 0xFF)](#7.1 读不到器件(全 0xFF))
- [7.2 数据全错(CPOL/CPHA 错配)](#7.2 数据全错(CPOL/CPHA 错配))
- [7.3 首字节错(CS 时序)](#7.3 首字节错(CS 时序))
- [7.4 末字节错(CS 时序)](#7.4 末字节错(CS 时序))
- [7.5 偶发数据错(SI/速度)](#7.5 偶发数据错(SI/速度))
- [7.6 QSPI 首字节错(dummy)](#7.6 QSPI 首字节错(dummy))
- [7.7 OVR 频发](#7.7 OVR 频发)
- 八、降速调试法
-
- [8.1 降速是 SPI 调试第一步](#8.1 降速是 SPI 调试第一步)
- [8.2 降速流程](#8.2 降速流程)
- [8.3 降速排查表](#8.3 降速排查表)
- [8.4 逐步提速](#8.4 逐步提速)
- [九、关键问题 Q&A](#九、关键问题 Q&A)
-
- [Q1:SPI 数据全错,无错误标志,怎么定位?](#Q1:SPI 数据全错,无错误标志,怎么定位?)
- Q2:逻辑分析仪采样率怎么选?
- [Q3:spidev 调试和内核驱动结果不一致?](#Q3:spidev 调试和内核驱动结果不一致?)
- [Q4:QSPI 读首字节错,常见原因?](#Q4:QSPI 读首字节错,常见原因?)
- [Q5:SPI 高速偶发错,低速稳定,什么原因?](#Q5:SPI 高速偶发错,低速稳定,什么原因?)
- [Q6:ftrace 抓 SPI 调用,看不到我的驱动函数?](#Q6:ftrace 抓 SPI 调用,看不到我的驱动函数?)
- 十、实战案例
-
- [案例 1:W25Q 读 ID 返回 0xFFFFFF](#案例 1:W25Q 读 ID 返回 0xFFFFFF)
- [案例 2:Flash burst 读首字节错](#案例 2:Flash burst 读首字节错)
- [案例 3:50MHz SPI 偶发数据错](#案例 3:50MHz SPI 偶发数据错)
- [案例 4:QSPI 读首字节错](#案例 4:QSPI 读首字节错)
- [案例 5:DMA 末字节丢](#案例 5:DMA 末字节丢)
- [案例 6:多设备切换首字节错](#案例 6:多设备切换首字节错)
- [案例 7:cache 一致性,DMA 数据偶发错](#案例 7:cache 一致性,DMA 数据偶发错)
- [案例 8:SPI 传输超时,从机掉电](#案例 8:SPI 传输超时,从机掉电)
- 十一、本篇小结与速查
- 延伸阅读
- 参考资料
一、调试工具链总览
1.1 工具分层
| 层 | 工具 | 看什么 |
|---|---|---|
| 协议层 | 逻辑分析仪 | 命令/数据/时序解码 |
| 信号层 | 示波器 | 波形/SI/边沿/电平 |
| 电气层 | 万用表 | 静态电平/通断/上拉 |
| 软件层 | spidev | 用户态收发验证 |
| 内核层 | dmesg/ftrace | 错误码/调用栈 |
| 寄存器层 | debugfs/mem | 寄存器值确认 |
1.2 SPI vs I2C 调试对比
| 维度 | SPI | I2C |
|---|---|---|
| 协议验证 | 逻辑分析仪 | i2c-tools(命令行) |
| 硬件工具 | 示波器/逻辑分析仪 | 同 |
| 用户态 | spidev | i2c-tools |
| 错误码 | -EIO/-ETIMEDOUT | -ENXIO/-EREMOTEIO |
| 难点 | CPOL/CPHA 错配(无标志) | 地址错(NACK) |
1.3 调试流程
现象 → 软件层(spidev/dmesg)→ 协议层(逻辑分析仪)→ 信号层(示波器)→ 电气层(万用表)
二、逻辑分析仪解码
2.1 为什么逻辑分析仪是 SPI 调试核心
- SPI 全双工 4 线(SCK/MOSI/MISO/CS),示波器 4 通道难同时看
- 逻辑分析仪多通道(8/16)+ 协议解码,直接显示命令/数据
- 采样率高(100MHz+),抓 ns 级时序
2.2 工具
- Saleae Logic:商业,软件好用
- sigrok/PulseView:开源,支持多种分析仪
- DSLogic:国产开源
2.3 采样率要求
- 10× 信号频率:50MHz SPI 用 500MHz 采样
- 低了抓不到边沿,时序错
2.4 SPI 解码配置
PulseView 解码 SPI:
- 添加 SPI 协议解码器
- 分配通道:SCK/MOSI/MISO/CS
- 配 CPOL/CPHA/位序/字长
- 解码显示命令字节流
2.5 解码示例
抓 W25Q 读 ID(0x9F):
CS: ──\________________________/──
SCK: /‾\_/‾\_/‾\_/‾\_/‾\_/‾\_/...
MOSI: 1 0 0 1 1 1 1 1 ← 0x9F
MISO: x x x x x x x x ← 0xFF(dummy)
1 1 1 0 1 1 1 1 ← 0xEF(ID高)
0 1 0 0 0 0 0 0 ← 0x40(ID中)
0 0 0 1 1 0 0 0 ← 0x18(ID低)
- 解码后直接看 MOSI 发了 0x9F,MISO 回了 0xEF 40 18
- 一眼看出命令对不对、回数据对不对
2.6 看什么
| 看点 | 判断 |
|---|---|
| CS 时序 | 拉低到首 SCK(tCSS)、末 SCK 到拉高(tCST) |
| SCK 频率 | 实测频率 vs 配置 |
| MOSI 数据 | 命令/地址对不对 |
| MISO 数据 | 回数据对不对 |
| CPOL/CPHA | 空闲电平 + 采样沿 |
| dummy | 数量够不够(QSPI) |
三、示波器看 SI
3.1 示波器看什么(逻辑分析仪看不到的)
- 边沿质量:上升/下降时间,过冲,振铃
- 电平:VIH/VIL 是否满足
- SI 问题:反射、串扰、振铃
- 占空比:DDR 模式关键
3.2 探头设置
- ×10 档:减小探头电容(减小测量影响),高速必用
- 接地线短:减小寄生电感(用接地弹簧)
- 测 SCK + 数据线:双通道看时序
3.3 关键测量
| 测量 | 方法 | 判断 |
|---|---|---|
| SCK 频率 | 测周期 | vs 配置值 |
| 上升时间 tr | 10%→90% | < 1/10 周期 |
| 过冲 | 峰值-稳态 | < 10% VDD |
| 振铃 | 衰减振荡 | 越小越好 |
| 占空比 | 高/周期 | 45~55%(DDR 严) |
| 串扰 | 邻线干扰 | < 10% VDD |
3.4 典型 SI 问题波形
正常: ┌────┐
│ │
───┘ └───
过冲: ┌─┐─┐
│ │ │
───┘ └─└───
(尖峰超出,终端匹配问题)
振铃: ┌─┐─┐─┐
│ │ │ │
───┘ └─└─└───
(阻尼不足,反射)
边沿慢: ┌─╲
│ ╲
───┘ ╲___
(驱动不足/负载重)
四、spidev 用户态验证
4.1 spidev_test(内核自带)
bash
# 基本收发
spidev_test -D /dev/spidev0.0 -s 50000000 -b 8 -H -O
# -s 速度 -b 字长 -H CPHA=1 -O CPOL=1(Mode 3)
# 不加 -H -O 是 Mode 0
4.2 自定义测试程序
c
#include <linux/spi/spidev.h>
int fd = open("/dev/spidev0.0", O_RDWR);
// 配 Mode 0, 50MHz, 8bit
int mode = SPI_MODE_0;
ioctl(fd, SPI_IOC_WR_MODE, &mode);
int speed = 50000000;
ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
int bits = 8;
ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
// 读 Flash ID
uint8_t tx[4] = {0x9F, 0, 0, 0};
uint8_t rx[4] = {0};
struct spi_ioc_transfer tr = {
.tx_buf = (unsigned long)tx,
.rx_buf = (unsigned long)rx,
.len = 4,
};
ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
printf("ID: %02X %02X %02X\n", rx[1], rx[2], rx[3]); // 期望 EF 40 18
4.3 spidev 调试流程
- 设备树配
compatible = "spidev" - 加载,出现 /dev/spidevX.Y
- 用 spidev_test 或自写程序收发
- 看返回数据对不对
4.4 优势
- 不用写内核驱动
- 快速验证器件 + 控制器
- 可调模式/速度/字长
五、dmesg 与内核日志
5.1 常见 SPI 错误码
| 错误码 | 值 | 含义 |
|---|---|---|
| -EIO | -5 | I/O 错(OVR/MODF) |
| -ETIMEDOUT | -110 | 超时(从机无响应) |
| -ENODEV | -19 | 无设备 |
| -ENOMEM | -12 | 内存不足 |
| -EBUSY | -16 | 总线忙 |
5.2 dmesg 看 SPI
bash
dmesg | grep -i spi
典型日志:
spi-dw xxx: registered master spi0
spi-nor spi0.0: w25q128 (16384 Kbytes)
spi-nor spi0.0: JEDEC probe failed ← 探测失败
spi-dw xxx: transfer timeout ← 传输超时
spi-dw xxx: RX FIFO overrun ← OVR
5.3 调试日志开大
bash
echo 8 > /proc/sys/kernel/printk # 内核日志级别最高
# 或动态调试
echo "file spi-dw.c +p" > /sys/kernel/debug/dynamic_debug/control
六、ftrace 与 regmap debugfs
6.1 ftrace 抓 SPI 调用
bash
cd /sys/kernel/debug/tracing
echo function > current_tracer
echo "spi_*" > set_ftrace_filter
echo 1 > tracing_on
# 运行 SPI 操作
cat trace
输出:
spi_sync
spi_transfer_one_message
dw_spi_transfer_one
dw_spi_irq
6.2 spi debugfs
bash
ls /sys/kernel/debug/spi/
# spi0/ 目录
cat /sys/kernel/debug/spi/spi0/registers # 控制器寄存器(若驱动支持)
6.3 regmap debugfs(SPI 设备用 regmap 时)
bash
ls /sys/kernel/kernel/debug/regmap/
# 0-0033/ (LIS3DH)
cat /sys/kernel/debug/regmap/0-0033/name
cat /sys/kernel/debug/regmap/0-0033/registers # 所有寄存器值
echo "0x20 0x57" > /sys/kernel/debug/regmap/0-0033/registers # 写
七、典型故障定位
7.1 读不到器件(全 0xFF)
现象:SPI 读 Flash ID 返回 0xFFFFFF
排查:
1. 万用表:CS/SCK/MOSI/MISO 电平,上电?
2. spidev:发 0x9F + 3 dummy,看 MISO
3. 逻辑分析仪:CS 拉低了?SCK 有?MOSI 发了 0x9F?
4. MISO 全 1:① CS 没拉低 ② 模式错 ③ 器件没上电 ④ 接线错
7.2 数据全错(CPOL/CPHA 错配)
现象:SPI 收发数据全错,但 CS/SCK 都有
排查:
1. 逻辑分析仪解码:配的 CPOL/CPHA 和实际波形对?
2. 看器件 datasheet 要求的 Mode
3. 改控制器 CPOL/CPHA,试 4 种模式
4. 典型:W25Q 要 Mode 0/3,配成 Mode 1/2 全错
7.3 首字节错(CS 时序)
现象:burst 读,首字节错,后续对
排查:
1. 逻辑分析仪看 CS↓ 到首 SCK(tCSS)够不够
2. tCSS 太短(< 50ns):CS 拉低后 delay 再发 SCK
3. GPIO CS 软件延迟:tCSS 通常够(GPIO 操作 μs 级)
4. 硬件 CS 配置错:CSHT(CS 建立保持)配小了
7.4 末字节错(CS 时序)
现象:burst 读,末字节错,前面都对
排查:
1. 逻辑分析仪看末 SCK 到 CS↑(tCST)够不够
2. tCST 太短:末 SCK 后 delay 再抬 CS
3. DMA 模式:TX DMA 完成立即抬 CS,但 SPI 还在移位,末字节丢
→ 等 SPI BSY=0 再抬 CS
7.5 偶发数据错(SI/速度)
现象:高速偶发错,低速稳定
排查:
1. 示波器看 SI:边沿/过冲/振铃
2. 降速稳定说明 SI 问题(走线/负载/终端)
3. 逻辑分析仪看时序裕量(tSU/tHD)
4. 加终端(22~33Ω 串联)/降速/改走线
7.6 QSPI 首字节错(dummy)
现象:QSPI 读 Flash,首字节错,后续对
排查:
1. 逻辑分析仪看 dummy 周期数
2. DCYC 配 0 或不够,Flash 没切换到 4 线输出
3. 查 Flash datasheet dummy 要求(W25Q 常需 6~8)
4. 配 DCYC=6/8
7.7 OVR 频发
现象:高速 SPI,SR.OVR 频繁置位
排查:
1. dmesg 看 overrun 日志
2. 中断响应慢:CPU 读 DR 不及时
3. 改 DMA(自动搬)/降速/增 FIFO 阈值
八、降速调试法
8.1 降速是 SPI 调试第一步
SPI 出问题,先降到 1MHz 甚至 100kHz:
- 低速 SI 不是瓶颈(边沿/反射影响小)
- 低速时序裕量大(采样窗口宽)
- 低速 CPU 响应跟得上(不 OVR)
8.2 降速流程
1. 降到 1MHz,能通 → 问题在 SI/速度
↑ 示波器看高速 SI,加终端/改走线
2. 1MHz 不通,降到 100kHz
↑ 100kHz 不通 → 不是速度问题,是协议/接线/配置
3. 100kHz 通,1MHz 不通 → SI 问题
4. 100kHz 不通 → 查 CS/模式/接线/上电
8.3 降速排查表
| 速度 | 通? | 判断 |
|---|---|---|
| 100kHz | 否 | 协议/接线/配置错(非速度) |
| 1MHz | 通 | 基础通,提速看 SI |
| 10MHz | 通 | SI 可以 |
| 50MHz | 否 | SI 瓶颈(走线/终端) |
8.4 逐步提速
100kHz → 1MHz → 10MHz → 25MHz → 50MHz → 100MHz
每步测稳定性,找到不稳定点,针对改善 SI
九、关键问题 Q&A
Q1:SPI 数据全错,无错误标志,怎么定位?
A :SPI 没 ACK,数据错硬件不报。逻辑分析仪解码:
- 看 CS/SCK/MOSI/MISO 波形
- 配 CPOL/CPHA 解码,看命令对不对
- 改 CPOL/CPHA 试 4 种模式
- 最常见:CPOL/CPHA 错配,改对就好
Q2:逻辑分析仪采样率怎么选?
A :10× 信号频率。50MHz SPI 用 500MHz 采样。低了抓不到边沿,时序测量不准。sigrok/Saleae 多数支持 100MHz~1GHz。
Q3:spidev 调试和内核驱动结果不一致?
A:
- spidev:用户态,每次 ioctl 配模式,有开销
- 内核驱动:核心层缓存配置,可能默认模式不同
- 检查:spidev 配的 mode/speed/bits 和内核驱动设备树配置一致
- spidev 能通,内核驱动不通:查设备树(spi-cpol/cpha/max-frequency)
Q4:QSPI 读首字节错,常见原因?
A:
- dummy 不够(最常见):DCYC 配 0 或太小,Flash 没切换 4 线输出。查 datasheet 配 6~8
- QE 位没置:DQ2/DQ3 不是数据线。先发 0x06+0x01 置 QE
- 采样延迟:高速 QSPI 配 RX_SAMPLE_DLY 调采样窗口
- CS 时序:tCSS 不够
Q5:SPI 高速偶发错,低速稳定,什么原因?
A :SI 问题(走线/终端/负载)。高速时:
- 边沿反射(末端高阻全反射)→ 加 22~33Ω 源端串联
- 负载电容大(多从共总线)→ 减从数或分总线
- 走线不等长(Skew)→ 改等长
- 示波器看波形,定位具体 SI 问题
Q6:ftrace 抓 SPI 调用,看不到我的驱动函数?
A:
- 确认函数名:filter 用
spi_*或具体驱动前缀(如dw_spi_*) - 函数未导出:加
EXPORT_SYMBOL或用set_ftrace_notrace - 内核未开 ftrace:CONFIG_FUNCTION_TRACER
十、实战案例
案例 1:W25Q 读 ID 返回 0xFFFFFF
现象:W25Q 读 ID 返回 0xFFFFFF。
排查:
- 万用表:CS/SCK/MOSI/MISO 电平正常,Flash 上电
- spidev 发 0x9F + 3 dummy,MISO 全 FF
- 逻辑分析仪:CS 拉低了,SCK 有,MOSI 发了 0x9F,MISO 全高
- 看 Mode:配成 Mode 1,W25Q 要 Mode 0/3
解决:改 Mode 0,读到 0xEF 40 18。
案例 2:Flash burst 读首字节错
现象:Flash 读 256 字节,首字节错,后续对。
排查:
- 逻辑分析仪:CS↓ 到首 SCK 只有 20ns(tCSS 不够,W25Q 要 5ns+,但控制器 CSHT 配 0)
- 实际是 GPIO CS 软件太快,SCK 紧跟 CS↓
解决:CS 拉低后 delay 几 ns(或加 1 个 dummy SCK)再发命令。
案例 3:50MHz SPI 偶发数据错
现象:50MHz SPI 读 Flash 偶发字节错,25MHz 稳定。
排查:
- 示波器看 SCK:边沿有过冲 + 振铃
- 走线长 15cm,无终端,反射
解决:SCK 加 22Ω 源端串联,过冲振铃消失,50MHz 稳定。
案例 4:QSPI 读首字节错
现象:W25Q QSPI 0x6B 读,首字节错。
排查:
- 逻辑分析仪:dummy 周期 0
- DCYC 配 0,Flash 没切 4 线输出
解决:DCYC 配 6(W25Q datasheet),首字节正确。
案例 5:DMA 末字节丢
现象:DMA 读 Flash,末字节偶发错。
排查:
- TX DMA 完成就抬 CS,但 SPI 还在移位最后字节
- RX DMA 已关,末字节丢
解决:等 SPI BSY=0 + RX DMA 完成才算完成,再抬 CS。
案例 6:多设备切换首字节错
现象:Flash(Mode 0)→ OLED(Mode 3)切换后,OLED 首字节错。
排查:
- 逻辑分析仪:切换后第一个 SCK 空闲电平是低(Mode 0),但 OLED 要 Mode 3(空闲高)
- 切换没重配 CPOL
解决:每次切换设备前重配控制器 CPOL/CPHA/速度。
案例 7:cache 一致性,DMA 数据偶发错
现象:RISC-V N300 SPI DMA 收数据,偶发首块错。
排查:
- DMA 完成后 CPU 读到旧 cache,不是 DMA 写的新数据
- 控制器驱动没 invalidate cache
解决 :DMA 收后 dma_sync_single_for_cpu invalidate,或用 dma_alloc_coherent。
案例 8:SPI 传输超时,从机掉电
现象:SPI 读传感器,传感器掉电后 CPU 卡死。
排查:
- 无超时,
while(!RXNE)死等 - 从机不响应,CPU 永远等
解决:加超时计数,超时报错 + 清 FIFO + 复位控制器 + 重试。
十一、本篇小结与速查
核心要点
- 调试分层:协议(逻辑分析仪)/信号(示波器)/电气(万用表)/软件(spidev)/内核(dmesg/ftrace)
- 逻辑分析仪是 SPI 调试核心:10× 采样率,解码 CPOL/CPHA/命令/数据
- 示波器看 SI:边沿/过冲/振铃/占空比,×10 档 + 短接地
- spidev 用户态验证:不用写驱动,ioctl 收发
- dmesg 看错误码:-EIO(OVR/MODF)/-ETIMEDOUT(超时)
- 典型故障:全0xFF(模式/CS/上电)/首字节错(tCSS/dummy)/末字节错(tCST/DMA)/偶发错(SI/速度)
- 降速调试第一步:100kHz→1MHz→10MHz→50MHz,找不稳定点
- CPOL/CPHA 错配最常见:逻辑分析仪解码一眼看出,试 4 种模式
- QSPI 首字节错:dummy/QE/采样延迟
工具速查
| 工具 | 用途 |
|---|---|
| 逻辑分析仪(sigrok/Saleae) | 协议解码,10× 采样 |
| 示波器(×10) | SI/边沿/电平 |
| 万用表 | 静态电平/通断 |
| spidev_test | 用户态收发 |
| dmesg | 内核日志/错误码 |
| ftrace | 函数调用栈 |
| regmap debugfs | 寄存器值 |
故障速查
| 现象 | 排查 | 常见原因 |
|---|---|---|
| 全 0xFF | 万用表+逻辑分析仪 | 模式错/CS/上电 |
| 全错 | 逻辑分析仪解码 | CPOL/CPHA 错配 |
| 首字节错 | 逻辑分析仪 tCSS | CS 时序/dummy 不够 |
| 末字节错 | 逻辑分析仪 tCST | CS 时序/DMA 提前关 |
| 偶发错 | 示波器 SI | 反射/串扰/速度 |
| OVR 频发 | dmesg | 中断慢/改 DMA |
| 超时 | dmesg | 从机死/加超时 |
降速排查表
| 速度 | 通 | 判断 |
|---|---|---|
| 100kHz | 否 | 协议/接线/配置 |
| 1MHz | 通 | 基础通 |
| 50MHz | 否 | SI 瓶颈 |
延伸阅读
- \[02-SPI信号完整性与时钟分布] ------ SI 故障定位
- \[03-SPI速度与电气约束] ------ 降速原理
- \[04-SPI协议与时序详解-CPOL-CPHA] ------ 模式错配
- \[10-SPI错误处理与恢复] ------ 错误码含义
- \[11-SPI Linux驱动框架] ------ spidev/debugfs
- \[14-SPI排查手册与速查表] ------ 故障决策树
- \[13-I2C调试与排查] ------ 对比 I2C 调试
参考资料
- sigrok/PulseView 文档
- Saleae Logic 文档
- Linux Documentation/spi/spidev
- Linux kernel debugging(ftrace/dynamic_debug)
- 示波器探头应用指南
SPI 技术系列 00· 总目录 · 上一篇:\[12-SPI设备驱动实战] · 下一篇:\[14-SPI排查手册与速查表]
✨ 感谢你的阅读 ✨
技术之路漫漫,分享是为了更好地交流。
如果本文的内容对你有启发,希望能得到你的支持:
👍 点赞 | ⭐ 收藏 | 👀 关注
如果你在调试过程中遇到了其他问题,
欢迎在 评论区 💬 留言,我们一起探讨。
关注我,一起交流底层开发的那些事儿!🚀