最近调测UWB的收发,比较困扰的是DW1000是半双工通信方式,也就是要么在RX,要么在TX,那么标签和基站如何协同工作呢,比方B标签发包的时候,基站一定要在RX才能收到包,否则发包就会失败,这个协同如何来做呢?
其实官方给的例子有一个demo,是能说明这个协同的想法的,但是其中的延时,配置多少合适,这也是困扰我好久的问题!
1、延时发送
//final_tx_time = (resp_rx_ts + (RESP_RX_TO_FINAL_TX_DLY_UUS * UUS_TO_DWT_TIME)) >> 8;
final_tx_time = dwt_readsystimestamphi32() + ((RESP_RX_TO_FINAL_TX_DLY_UUS * UUS_TO_DWT_TIME) >> 8);//0x17cdc00 / 70; //10ms/7
//logD("[5] final_tx_time = %u", final_tx_time);
dwt_setdelayedtrxtime(final_tx_time);
2、延时接收
标签:
dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS);//#define POLL_TX_TO_RESP_RX_DLY_UUS 300
基站:
dwt_setrxaftertxdelay(RESP_TX_TO_FINAL_RX_DLY_UUS);//#define RESP_TX_TO_FINAL_RX_DLY_UUS 500
根据延时发送和延时接收的time推测,对时间窗口的对齐的理解还是有帮助的,但是具体值应该配置为多少,这里以官方的代码验证这个值应该如何配置!
POLL_TX_TO_RESP_RX_DLY_UUS | 0x68001f2 失败的包/总共发送的包 | 丢包率计算 |
0 | 149/750 | |
159/806 | 0.19 | |
300 | 126/752 | |
218/1175 | 0.18 | |
2600 | 32/270 | 0.11 |
61/490 | 0.12 | |
68/529 | ||
71/572 | ||
2300 | 28/328 | 0.08 |
32/356 | ||
33/361 | ||
2100 | 37/228 | |
2200 | 28/195 | 0.14 |
2400 | 11/93 | |
44/300 | 0.14 | |
2350 | 16/109 | |
2310 | 101/870 | 0.11 |
始终没有找到一个最优值,还需要继续研究!
3、RX超时
dwt_setrxtimeout(0);//配置为0表示不超时
/*
假设数据实际接收的时间为12ms左右,所以要设置为12000(UWB ms),一个UWB ms几乎可以按1us来算,为了保险起见,设置为15000
*/
dwt_setrxtimeout(15000);
如果设置rx timeout 为40ms超时
dwt_setrxtimeout(20000); //20ms超时
4、SFD超时次数控制;
config 中会配置SFD检测失败的最大次数:
static dwt_config_t config = { 2, /* Channel number. */ DWT_PRF_64M, /* Pulse repetition frequency. */ DWT_PLEN_1024, /* Preamble length. Used in TX only. */ DWT_PAC32, /* Preamble acquisition chunk size. Used in RX only. */ 9, /* TX preamble code. Used in TX only. */ 9, /* RX preamble code. Used in RX only. */ 1, /* 0 to use standard SFD, 1 to use non-standard SFD. */ DWT_BR_110K, /* Data rate. */ DWT_PHRMODE_STD, /* PHY header mode. */ (1025 + 64 - 32) /* SFD timeout (preamble length + 1 + SFD length - PAC size). Used in RX only. */ }; #define DWT_SFDTOC_DEF 0x1041 void dwt_configure(dwt_config_t *config) { if(config->sfdTO == 0) { config->sfdTO = DWT_SFDTOC_DEF; } }
5、前导码超时控制;
这个超时是失败重试的次数,简单说,就是前导码检测多少次失败后,会上报一个超时中断!
/* Preamble timeout, in multiple of PAC size. See NOTE 6 below. */
#define PRE_TIMEOUT 2048//64
dwt_setpreambledetecttimeout(PRE_TIMEOUT);
6、MAC层协议:IEEE 802.15.4 UWB physical layer
0x68001F2
参考:https://blog.csdn.net/Mculover666/article/details/115034596
-----2022.05.18更新---------------------------
之前有一个问题,一直被困扰着,就是收发不稳定,这个不稳定表现为标签发送完包后,始终等不到基站回应的包,要么等待SFD超时,要么PHY超时,错误码也是很多种,比方:0x20800FF3、0x20200F3、0x20017F3、0x28001F3、0x68001F3、0x48001F3
怎么解决的呢?每次标签定位之前,先重置下Radio,发现就稳定好多:
dwt_write8bitoffsetreg(SYS_CTRL_ID, SYS_CTRL_OFFSET, (uint8)SYS_CTRL_TRXOFF) ; // Disable the radio
本文为呱牛笔记原创文章,转载无需和我联系,但请注明来自呱牛笔记 ,it3q.com