数据的接收
dwt_setrxtimeout(0);
//接收器允许接收的超时时间
dwt_rxenable(0);
//立即打开接收器
while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))
{ };//检测数据是否接收到数据
dwt_read32bitreg();//读取32位寄存器的值
数据的发送
dwt_writetxdata(sizeof(tx_final_msg), tx_final_msg, 0);
//将数据写入DW1000写入TX缓冲区
dwt_writetxfctrl(sizeof(tx_final_msg), 0);
//用于配置TX帧控制寄存器
dwt_starttx(DWT_START_TX_DELAYED | DWT_RESPONSE_EXPECTED );
//用来启动数据帧的传输,
/*parameter*/
//DWT_START_TX_DELAYED 延时发送数据 此函数用来设置延迟时间dwt_setdelayedtrxtime()
//DWT_START_TX_IMMEDIATE 立即发送数据
//DWT_RESPONSE_EXPECTED 发送成功,进入接收响应消息的时间 dwt_setrxaftertxdelay()
while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))
{ };
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR);
//对DW1000寄存器,进行数据的写入,清除相应的标志位。
时间获取和计算
DW1000配置(stm32)
1.相关引脚和spi初始化。
2.DW1000_RSTn引脚,进行低电平到模拟输入。
3.spi速率降低,不能超过3Mh。
4.DW1000初始化.
5.恢复spi速率.
6.DW1000相关寄存器配置.
//设置天线延时
7.dwt_setrxantennadelay(RX_ANT_DLY);
dwt_settxantennadelay(TX_ANT_DLY);
计算时间(TWR算法)
TAG | T1 | | T4 | | T5 |
NODE | T2 | | T3 | | T6 |
1.标签发送数据 T1
2.基站接收到数据 T2(并计算T2的时间) 延时一段时间发送 T3消息
3.标签接收到数据 读取T1发送的时间和此时接收到的时间T4,并把这两个数据,还有发送时间T5传入到final包中,发送final包
4.基站接收final包。
poll_rx_ts = get_rx_timestamp_u64(); // T2
resp_tx_ts = get_tx_timestamp_u64();//T3
final_rx_ts = get_rx_timestamp_u64();//T6
/* Get timestamps embedded in the final message. */
final_msg_get_ts(&rx_buffer[FINAL_MSG_POLL_TX_TS_IDX], &poll_tx_ts);//T1
final_msg_get_ts(&rx_buffer[FINAL_MSG_RESP_RX_TS_IDX], &resp_rx_ts);//T4
final_msg_get_ts(&rx_buffer[FINAL_MSG_FINAL_TX_TS_IDX], &final_tx_ts);//T5
/* Compute time of flight. 32-bit subtractions give correct answers even if clock has wrapped. See NOTE 10 below. */
poll_rx_ts_32 = (uint32)poll_rx_ts;
resp_tx_ts_32 = (uint32)resp_tx_ts;
final_rx_ts_32 = (uint32)final_rx_ts;
Ra = (double)(resp_rx_ts - poll_tx_ts);
Rb = (double)(final_rx_ts_32 - resp_tx_ts_32);
Da = (double)(final_tx_ts - resp_rx_ts);
Db = (double)(resp_tx_ts_32 - poll_rx_ts_32);
tof_dtu = (int64)((Ra * Rb - Da * Db) / (Ra + Rb + Da + Db));
tof = tof_dtu * DWT_TIME_UNITS;
distance = tof * SPEED_OF_LIGHT;
distance = distance - dwt_getrangebias(config.chan,(float)distance, config.prf);//距离减去矫正系数