本文翻译自DWM1001 Firmware API Guide(有书签).pdf3.2节

DWM1001 SPI 概览

DWM1001 SPI 接口使用 TLV 格式数据。用户可以使用SPI主机模式下的外部主机器件(如MCU)连接到以从模式工作的DWM1001模块SPI接口。最大SPI时钟频率为8 MHz(这是nRF52 MCU支持的最大频率)

在 DWM1001 SPI 方案中,主机器件通过 TLV 请求与 DWM1001 通信。 完整的 TLV 请求通信流程包括以下步骤:

  1. 主机发送TLV(Type-Length-Value)请求
  2. DWM1001准备响应
  3. 主机读取SIZE(一次传输中的可用字节数)和NUM(可用的传输次数)
  4. 主机读取响应数据

由于SPI使用全双工通信,当主机设备(作为SPI主设备)写入x个字节时,它实际上将x个字节发送到DWM1001模块(作为从站),并同时接收x字节虚拟数据。与读取类似,主机设备发送 x 字节的虚拟数据,并将 x 字节的数据接收回作为响应。在 DWM1001 SPI 方案中,虚拟数据是0xFF。

image.png
如图2所示,DWM1001 SPI线程在四种状态之间进行串行传输。每个状态将在某些事件上转移到其下一个相应的状态。

Idle(空闲)

初始化后和每次成功数据传输/响应后的状态。
在此状态下,任何接收的数据都假定为 TLV 请求。因此,在接收到任何数据时,固件中的SPI线程将接收到的数据传递给通用API。通用 API 解析 TLV 请求并准备返回数据。

  • 等待事件:接收TLV请求
  • 收到的TLV中,Type == 0xFF时的动作:
    • 不动作,保持在Idle状态
  • 收到的TLV中,Type ≠ 0xFF时的动作:

    • 发送接收到的TLV请求给通用API线程
    • 状态迁移到Wait for call_back

      Wait for call_back(等待回调)

      DWM1001 SPI 正在等待通用 API 解析 TLV 请求并准备响应。
      来自主机端的任何数据都将被忽略,并在此状态下返回0x00。
  • 等待事件:通用API调用callb_back()函数

  • 事件发生时的动作:

    • 将数据就绪(Ready)引脚置为高电平
    • 状态迁移到Wait for Read SIZE/NUM

      Wait for Read SIZE/NUM(等待读SIZE/NUM)

      DWM1001 SPI 已准备好使用 SIZE 个字节作为响应,总共将有 NUM 次传输。SIZE 和 NUM 加起来是 2 字节的非零数据,即 SIZE/NUM。一起表示要响应的数据或错误消息的总数(即 SIZE*NUM 字节)。DWM1001 SPI 作为从设备正在等待主机设备读取 SIZE/NUM 字节。

      注意:除了API函数dwm_backhaul_xfer以外,NUM始终为1

  • 等待事件:主设备读取2个字节

  • 事件发生时的动作:

    • 响应SIZE/NUM字节
    • 状态迁移到Wait for Read DATA/ERR

      Wait for Read DATA/ERR(等待读数据/错误)

      DWM1001 SPI 已为每个 NUM 传输准备了 SIZE 个字节的数据或错误消息,作为对 TLV 请求的响应,并正在等待主机设备读取它。
  • 等待事件:主设备执行 NUM 次传输。每次传输都应为 SIZE 字节,否则可能会丢失数据。

  • 事件发生时的动作:
    • 响应DATA/ERR数据
    • 将数据就绪(Ready)引脚置为低电平

在 DWM1001 中,从”Idle”开始,遍历上面列出的所有四种状态并返回到”SPI:空闲”,表示一个完整的TLV 请求通信流程。用户应在通信流结束时收到响应数据或错误消息。

SPI错误恢复机制

SPI数据不允许部分数据传输

从 DWM1001 模块读取数据时,如果主机设备未在一次传输中读取所有字节的数据,则读取操作仍将被视为已完成。其余的响应将被放弃。例如,在”SPI:等待读取数据/ERR”状态下,DWM1001 模块已准备响应数据的 SIZE 字节,并期望主机设备读取响应的所有 SIZE 字节。但是,如果主机设备仅读取部分数据,则 DWM1001 模块将删除其余数据,并传输到下一个状态:”SPI:空闲”。

SPI状态恢复:type_nop消息

DWM1001 SPI 0xFF具有特殊的类型值,称为type_nop。具有type_nop的TLV数据消息表示无操作。在”SPI:空闲”状态下,当 DWM1001 SPI 收到消息并发现类型字节0xFF时,它不会执行任何操作,包括将 TLV 数据消息发送到通用 API 线程。
type_nop专为错误恢复而设计。如果主机器件不确定 DWM1001 SPI 处于何种状态,则可以利用 SPI 响应和非部分传输机制,通过发送三个 0xFF 虚拟字节(每个虚拟字节在一次单独的传输中)将 DWM1001 SPI 重置为”SPI:IDLE”状态。三次传输后,来自 DWM1001 SPI 的响应数据将变为0xFF值的所有虚拟字节,表明 DWM1001 SPI 处于”SPI:空闲”状态。