本文翻译自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 请求通信流程包括以下步骤:
- 主机发送TLV(Type-Length-Value)请求
- DWM1001准备响应
- 主机读取SIZE(一次传输中的可用字节数)和NUM(可用的传输次数)
- 主机读取响应数据
由于SPI使用全双工通信,当主机设备(作为SPI主设备)写入x个字节时,它实际上将x个字节发送到DWM1001模块(作为从站),并同时接收x字节虚拟数据。与读取类似,主机设备发送 x 字节的虚拟数据,并将 x 字节的数据接收回作为响应。在 DWM1001 SPI 方案中,虚拟数据是0xFF。
如图2所示,DWM1001 SPI线程在四种状态之间进行串行传输。每个状态将在某些事件上转移到其下一个相应的状态。
Idle(空闲)
初始化后和每次成功数据传输/响应后的状态。
在此状态下,任何接收的数据都假定为 TLV 请求。因此,在接收到任何数据时,固件中的SPI线程将接收到的数据传递给通用API。通用 API 解析 TLV 请求并准备返回数据。
- 等待事件:接收TLV请求
- 收到的TLV中,Type == 0xFF时的动作:
- 不动作,保持在Idle状态
收到的TLV中,Type ≠ 0xFF时的动作:
等待事件:通用API调用
callb_back()
函数事件发生时的动作:
等待事件:主设备读取2个字节
事件发生时的动作:
等待事件:主设备执行 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:空闲”状态。