ARM SWD协议简介
SWD全称Serial Wire Debug,是ARM为嵌入式设备推出的一种简单的调试接口,这种接口通过一条双向数据线和一条时钟线实现对于ARM核心的调试。在SWD协议中,总线上主要有以下三个阶段:
- Packet Request,这个阶段表示外部调试器向Debug Port(DP)发送请求。
- Acknowledge Response,这个阶段是设备向调试器返回应答信号。
- Data Transfer Phase, 数据传输阶段,调试器向设备写数据或者设备向调试器返回数据
在上述三个阶段之间一般会有一个TRN间隔,长度一般是一个时钟,这个间隔用于总线方向切换,当调试器发送请求后,设备必须立即返回自己的状态作为应答,数据传输阶段,只有写数据才有TRN间隔。
当数据传输完成之后,调试器需要立即开始下一个请求,或者持续发送至少8个周期的时钟,这个期间数据线应该保持低电平。
SWD中Packet Request和Data Transfer阶段都有一个奇偶校验位,数据传输数据是LSB first。
Packet和Acknowledge数据定义
名称 | 定义 |
---|---|
Start | 1'b1 起始位 |
APnDP | 表示请求DP(Debug Port)-1'b0, 还是请求AP(Access Port)-1'b1 |
RnW | 0 表示写操作,1表示读操作 |
A[2:3] | 指定DP或者AP的地址 |
Parity | 奇偶校验位 |
Stop | 1'b0 停止位 |
Park | 1'1 主机必须驱动此位为1,然后进行方向切换 |
Trn | 方向切换 |
ACK[0:2] | 设备向调试器返回当前状态 |
WDATA[0:31] | 调试器向设备写数据 |
RDATA[0:31] | 设备向调试器返回数据 |
SWD写操作
SWD写操作包含上述完整的三个阶段:
写操作之后没有Trn阶段,可以直接发起下一次数据请求。
SWD读操作
SWD读操作同样包含完整的三个阶段
读操作ACK之后没有Trn,设备必须直接返回数据,数据传输完成之后需要Trn才能发起下一次请求。
如果调试器发起的是读DP的请求,那么设备可以直接返回DP数据结果,而如果是读AP,那么设备需要在下一次读的时候(DP或者AP)才能返回结果,对于连续的读AP操作,调试器只需要插入一个RDBUFF就可以了:
- 第一次AP读操作,返回数据结果直接丢弃
- 后续每次AP读操作都返回之前的AP读取结果
- 最后再发送一个AP用于读取上一个AP结果
- 读取DP RDBUFF读取最后的AP访问结果
SWD等待
如果设备不能正常处理调试器的请求,那么设备可以返回WAIT响应,WAIT响应ACK[0:2]=3'b010, 但是当读取DPIDR,CTRL/STAT/ABORT寄存器的时候设备不应返回WAIT响应。一般情况下调试器在收到WAIT响应之后,只需要重新发送请求即可,如果多次请求依然失败,那么可以通过写ABORT.DAPABOUT
来终止这个操作。
连接和总线复位
当调试器接入或者总线上发生各种错误的时候,调试器可以通过发送复位信号来复位设备的调试接口,复位信号通过发送至少50个时钟,并保持数据线为1,然后在发送至少2个时钟的低电平完成,也就是发送至少50个1和至少2个0完成。
最后更新于 2020-03-12 06:22:47 并被添加「调试 SWD DAP」标签,已有 15959 位童鞋阅读过。
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。