ARM SWD协议简介

SWD全称Serial Wire Debug,是ARM为嵌入式设备推出的一种简单的调试接口,这种接口通过一条双向数据线和一条时钟线实现对于ARM核心的调试。在SWD协议中,总线上主要有以下三个阶段:

  1. Packet Request,这个阶段表示外部调试器向Debug Port(DP)发送请求。
  2. Acknowledge Response,这个阶段是设备向调试器返回应答信号。
  3. Data Transfer Phase, 数据传输阶段,调试器向设备写数据或者设备向调试器返回数据

在上述三个阶段之间一般会有一个TRN间隔,长度一般是一个时钟,这个间隔用于总线方向切换,当调试器发送请求后,设备必须立即返回自己的状态作为应答,数据传输阶段,只有写数据才有TRN间隔。

当数据传输完成之后,调试器需要立即开始下一个请求,或者持续发送至少8个周期的时钟,这个期间数据线应该保持低电平。

SWD中Packet Request和Data Transfer阶段都有一个奇偶校验位,数据传输数据是LSB first。

Packet和Acknowledge数据定义

名称定义
Start1'b1 起始位
APnDP表示请求DP(Debug Port)-1'b0, 还是请求AP(Access Port)-1'b1
RnW0 表示写操作,1表示读操作
A[2:3]指定DP或者AP的地址
Parity奇偶校验位
Stop1'b0 停止位
Park1'1 主机必须驱动此位为1,然后进行方向切换
Trn方向切换
ACK[0:2]设备向调试器返回当前状态
WDATA[0:31]调试器向设备写数据
RDATA[0:31]设备向调试器返回数据

SWD写操作

SWD写操作包含上述完整的三个阶段:

SWD写操作

写操作之后没有Trn阶段,可以直接发起下一次数据请求。

SWD读操作

SWD读操作同样包含完整的三个阶段

SWD读操作

读操作ACK之后没有Trn,设备必须直接返回数据,数据传输完成之后需要Trn才能发起下一次请求。

如果调试器发起的是读DP的请求,那么设备可以直接返回DP数据结果,而如果是读AP,那么设备需要在下一次读的时候(DP或者AP)才能返回结果,对于连续的读AP操作,调试器只需要插入一个RDBUFF就可以了:

  1. 第一次AP读操作,返回数据结果直接丢弃
  2. 后续每次AP读操作都返回之前的AP读取结果
  3. 最后再发送一个AP用于读取上一个AP结果
  4. 读取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完成。


本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

相关文章

发表新评论