如之前文章描述,进行UWB测距时,手机(Initiator)与车端各锚点(Responders)需交互Pre-Poll、Poll、Response0-N、Final、Final-Data等信息。
其中Pre-Poll和Final-Data是SP0数据帧,是带参数的。
Poll、Response0-N、Final是SP3数据帧,是不带参数的。
本文重点讲解下Final-Data携带的11个参数,具体如下表。
UWB MAC Message |
UWB MAC Message ID |
Patameters |
Final_Data |
2 |
UWB_Session_ID, Ranging_Block, Hop_Flag, Round_Index, Final_STS_Index, Ranging_Timestamp_FINAL_TX, Number_Ranging_Responders, Responder_Index, Ranging_Timestamp_Responder_l, Ranging_Timestamp_Uncertainty_Responder_l, Ranging_Status_Responder_l, … |
假设UWB测距芯片为NCJ29D5,为进行UWB测距,需结合一个主控MCU芯片,完成对UWB测距流程的控制。MCU与NCJ29D5之间采用SPI通信,如下图。双方采用UCI接口(可详见NCJ29D5 UCI说明文档)进行通信。
备注:前面4个参数,在Pre-Poll中也有包含。
参数名称 |
长度(bytes) |
取值范围 |
描述 |
UWB_Session_ID |
4 |
0 –0xFFFFFFFF |
ID of the UWB ranging session. |
该参数在Pre-Poll命令也有包含。我的理解是启动测距时,由主控MCU控制随机产生,通过UCI命令SESSION_INIT_CMD创建一个UWB测距session。后面关于该测距session的控制基本都得通过该session id来控制。
NCJ29D5可以同时建立多个测距session,此session id可用来区分不同的测距session,每一个session id对应的各自的UWB配置参数。
即同一组UWB测距数据流,Pre-Poll和Final-Data的参数相同。
参数名称 |
长度(bytes) |
取值范围 |
描述 |
Ranging_Block |
2 |
0 –0xFFFF |
Index of current ranging Block |
当前测距session的block索引。该参数在Pre-Poll命令也有包含。
启动UWB测距时,要配置一个对应的Ranging session。
如下图,每个Ranging session里可能会有多个Ranging Block,每个Ranging Block里可能会有多个Round。每一个Round对应的就是之前说一个UWB测距交互流程(Pre-Poll->Poll->Response0-N->Final->Final Data)。每个Round里会有多个Slot,用来“放置”Pre-Poll、Poll、Response0-N、Final、Final Data等UWB帧。
参数名称 |
长度(bytes) |
取值范围 |
描述 |
Round_Index |
2 |
0 –0xFFFF |
The ranging round in which the ranging cycle will be executed in the next ranging block. |
该参数在Pre-Poll命令也有包含。
在Pre-Poll中原文中描述如下:
The ranging round index for the current ranging block as set from the ranging exchange in the previous ranging block.
在Final-Data中原文中描述如下:
The ranging round in which the ranging cycle will be executed in the next ranging block.
这两个参数是匹配使用的。
在Pre-Poll中表示:当前UWB测距采用哪个round_index进行UWB测距。
在Final-Data中表示:下次UWB测距block采用哪个round_index进行UWB测距。
如上描述,每个Ranging block里可能有多个Round,该参数用于配置当前UWB测距的Round index信息。每次UWB测距的Round可能是静态不变的,也可能是动态变化的,具体详见下个参数Hop_Flag。
参数名称 |
长度(bytes) |
取值范围 |
描述 |
Hop_Flag |
1 |
0:No Hopping 1:Hopping |
Hop Flag for next ranging Block For no hopping configuration this field is always 0 For continuous hopping configuration this field is always 1 |
该参数在Pre-Poll命令也有包含。
在Pre-Poll中原文中描述如下:
Hop flag for current ranging block as set from the ranging exchange in the previous ranging block.
在Final-Data中原文中描述如下:
Hop Flag for next ranging Block.
这两个参数是匹配使用的。
在Pre-Poll中表示:当前UWB测距采用是否要hopping。
在Final-Data中表示:下次UWB测距是否要hopping。
若Hop_Flag设置为0,则表示设置为“no hopping”,这表示initiator每次都会使用相同的ranging round来进行UWB测距。
若Hop_Flag设置为1,则表示设置为“hopping”,这表示initiator每次测距使用的的ranging round可能会变化。
Hopping方式又分为两种:
第一种,是continuous hopping,即每次测距使用不同的ranging round。
第二种,是adaptive hopping,如果Initiator认为该round是干净无干扰的,则不进行hopping;如果Initiator认为该round存在干扰,则进行hopping.
具体可详见CCC规范20.4章节,有专门描述了Hopping Flag的相关要求。
参数名称 |
长度(bytes) |
取值范围 |
描述 |
Final_STS_Index |
4 |
0 –0xFFFFFFFF |
STS index of the preceding Final message. |
该在Pre-Poll命令也有类似的参数,名字叫Poll_STS_Index,而Final-Data中的参数叫Final_STS_Index。
之前说过一个UWB测距交互流程是:Pre-Poll->Poll->Response0-N->Final->Final Data
所以这两个参数的用途分别是:
1、在Pre-Poll数据帧中通过Poll_STS_Index参数,指示随后的Poll帧的STS_Index。
2、在Final-Data数据帧通过参数Final_STS_Index,指示之前的Final帧的STS_Index。
UWB数据帧有SP0帧和SP3帧,其中SP3帧中就有包含STS_Index字段,如下图:
STS_Index参数对于安全测距操作起着重要作用。
每个slot包含有一个SP3帧,无论该slot是否被使用,都需要对测距块中的每个slot进行变更。CCC中描述的基本规则是采用每个slot递增的方式,如下图:
具体可详见CCC规范20.6章节,有专门描述了STS index的相关要求。
参数名称 |
长度(bytes) |
取值范围 |
描述 |
Ranging_Timestamp_FINAL_TX |
4 |
Range = 0 to 0XFFFFFFFF Timestamp = N × 1/128 × 1/499.2e6 sec Time Range = 0 to 67.21 ms |
Time difference between POLL and Final messages transmit times at the initiator. |
我的理解是initiator端开始发送POLL到开始发送Final帧的时间间隔。
参数名称 |
长度(bytes) |
取值范围 |
描述 |
Number_Ranging_Responders |
1 |
0–255 |
Number of timestamps to follow in this message. |
我的理解是用于指示接下来的参数中,有多少组Responder的参数。
接下来的参数,每4个 为一组锚点的时间戳参数。
即参数8(Responder_Index)、参数9(Ranging_Timestamp_Responder_l)、参数10(Ranging_Timestamp_Uncertainty_Responder_-l)、参数11(Ranging_Status_Responder_l)为一组锚点的时间戳参数.
参数名称 |
长度(bytes) |
取值范围 |
描述 |
Responder_Index |
1 |
0–255 |
Index of Responder_l whose timestamp data is referred to in the Ranging_Timestamp_Responder_l, Ranging_Timestamp_Uncertainty_Responder_l, and Ranging_Status_Responder_l fields |
我的理解是用于指示接下来这组时间戳参数,是第几个锚点。
参数名称 |
长度(bytes) |
取值范围 |
描述 |
Ranging_Timestamp_Responder_l |
4 |
Range = 0 to 0XFFFFFFFF Timestamp=N × 1/128 × 1/499.2e6 sec Time Range = 0 to 67.21 ms |
Time difference between POLL and RESPONSE of Responder l, as received by the initiator. |
我的理解是initiator端开始发送Poll到接收到锚点l(Responder_l)响应的时间间隔。
参数名称 |
长度(bytes) |
取值范围 |
描述 |
Ranging_Timestamp_Uncertainty _-Responder_l |
1 |
See Section 6.9.1.7 in [IEEE 802.15-4z-2020] |
Range of values from 1.5 cm–3.6 m at various confidences |
该参数应该是用来补偿的一个参数。具体我翻阅了IEEE 802.15-4z-2020,但目前还不太理解。
参数名称 |
长度(bytes) |
取值范围 |
描述 |
Ranging_Status_Responder_l |
1 |
See Table 20-7 |
The status for the response frame from the responder. See the corresponding description for the ranging status in Table 20-7 |
该参数用来反馈当前锚点的测距状态,具体状态详见下表。
Ranging Status |
Value |
Description |
Success |
0x0 |
Successful receipt and transmission of a packet |
Transaction overflow |
0x1 |
RESPONSE SP3 frame from this responder cannot be processed by the device |
Transaction expired |
0x2 |
No RESPONSE SP3 frame was received from this responder |
Incorrect frame |
0x03 |
The RESPONSE SP3 frame received from this responder was not correct |
Reserved |
0x04-0xFF |
Table 20-7: Ranging Status of a Responder
随后的参数12(Responder_Index)、参数13(Ranging_Timestamp_Responder_l)、参数14(Ranging_Timestamp_Uncertainty_Responder_-l)、参数15(Ranging_Status_Responder_l)为一组锚点的时间戳参数。
最终有几组参数,取决于共有几个锚点,即参数7(Number_Ranging_Responders)。
Final-Data数据帧最多带127字节的参数。正常时,最多可允许一个测距ranging round中有10个锚点。
但当NkChap_per_Slot= 24时,即每个slot为8ms,则一个测距ranging round中最多只能有7个锚点,否则加上前后POLL和Final数据帧,共超过9个数据帧,则其间隔将超过8个slot,即8*8ms=64ms。而参数6和参数7的时间戳最大值为67.21 ms。