4. SWD协议详解
SWD(Serial Wire Debug)是ARM Cortex-M系列芯片最常用的两线调试协议。它只用两根信号线——SWCLK与SWDIO——就完成了JTAG五线制的大部分调试功能。理解SWD的关键,不在于记住引脚定义,而在于理解它如何把"请求—应答—数据"三段式事务压缩到两根线上,以及DP与AP两级寄存器如何分工协作。
一、两根线的物理与电气角色
SWCLK由调试器(Host)单向驱动,是纯时钟信号,芯片端只采样不驱动。它的频率决定了整个链路的吞吐上限,常见范围为1MHz~50MHz,部分高端调试器可到100MHz以上。SWDIO是双向半双工数据线,方向由事务阶段决定:请求阶段由Host驱动,应答与数据阶段由Target驱动。因此SWDIO必须支持三态与方向切换,这也是SWD时序中最容易出问题的地方。
由于SWDIO是双向线,Host与Target之间必须严格避免同时驱动。协议通过"turnaround(周转)"周期来留出方向切换的缓冲时间,通常为1个时钟周期。若调试器与目标芯片对turnaround的理解不一致,就会出现读回全0或全1的经典故障。
二、包格式:8位请求 + 应答 + 数据
每一次SWD事务由三个阶段组成:
- 请求包(8 bit):由Host发出,包含起始位、APnDP、RnW、地址位A[2:3]、奇偶校验位、停止位和空闲位。
- 应答包(3 bit):由Target返回,OK响应为0b001,WAIT为0b010,FAULT为0b100。
- 数据阶段(33 bit):读操作时Target返回32位数据加1位奇偶校验;写操作时Host发送32位数据加1位奇偶校验。
请求包中的APnDP位决定本次访问的是DP还是AP;RnW位决定读或写;A[2:3]两位地址与APnDP组合,最多寻址4个DP寄存器或4个AP寄存器。奇偶校验覆盖APnDP、RnW与地址位,用于检测请求在传输中的位翻转。
三、DP与AP:两级寄存器模型
SWD的寄存器空间分为两级。DP(Debug Port)是调试链路的控制入口,负责链路状态、电源域控制和传输控制;AP(Access Port)是具体的内存与系统访问通道,最常见的是AHB-AP,用于读写芯片的存储空间和外设寄存器。
| 层级 | 寄存器 | 地址 | 作用 |
|---|---|---|---|
| DP | DPIDR | 0x0 | 读取DP标识,确认链路连通 |
| DP | CTRL/STAT | 0x4 | 控制电源域、读取状态标志 |
| DP | SELECT | 0x8 | 选择AP与AP bank |
| DP | RDBUFF | 0xC | 读取AP传输结果 |
| AP | CSW | 0x0 | 配置访问宽度与地址自增 |
| AP | TAR | 0x4 | 设置目标地址 |
| AP | DRW | 0xC | 读写目标地址数据 |
典型的一次内存读取流程是:先写DP的SELECT选择AHB-AP和bank,再写AP的CSW配置传输属性,写AP的TAR设置地址,最后读AP的DRW触发传输,并通过DP的RDBUFF取回结果。这个"SELECT→CSW→TAR→DRW→RDBUFF"的顺序是SWD调试中最核心的操作链。
四、传输时序与错误处理
SWD没有独立的握手线,错误处理完全依赖应答包。Target返回WAIT表示当前无法处理请求,Host应重试;返回FAULT表示请求被拒绝或目标出错,Host应读取DP的CTRL/STAT查看具体错误标志。若连续多次收到WAIT,通常说明目标芯片处于低功耗状态、时钟未使能或AP未上电。
典型SWD读取序列(伪代码):
1. 写 DP.SELECT = AP0 | bank0
2. 写 AP.CSW = 0x23000002 // 32位、地址自增
3. 写 AP.TAR = 0x20000000 // 目标地址
4. 读 AP.DRW // 触发传输,返回旧值
5. 读 DP.RDBUFF // 取回真实数据
奇偶校验错误是另一类常见问题。若Host发出的请求包奇偶校验位计算错误,Target会直接忽略该请求,表现为读回全0或全1。调试器固件中的校验算法必须与协议严格一致,否则会出现"链路能连上但读写全错"的现象。
五、场景与复盘
在实际调试中,一个典型场景是:调试器能读到DPIDR,但读AP寄存器时始终返回FAULT。排查顺序应为:先确认SELECT是否正确选择了AP和bank;再检查CTRL/STAT中的电源域控制位是否使能了AP;最后确认CSW配置是否与目标地址宽度匹配。多数情况下问题出在SELECT未正确切换,导致访问了错误的AP bank。
另一个高频问题是时序裕量不足。当SWCLK频率过高、线缆过长或目标芯片供电不稳时,SWDIO上的数据建立时间不够,表现为间歇性WAIT或校验错误。此时应降低SWCLK频率、缩短线缆或增加上拉电阻,而不是反复重试。
掌握SWD协议的本质,是把"两根线"还原成"请求—应答—数据"的事务模型,再理解DP与AP的分层寻址。只要抓住SELECT、CSW、TAR、DRW、RDBUFF这条访问链,以及WAIT/FAULT/奇偶校验三类错误信号,绝大多数SWD调试问题都能被快速定位。