From 03c3a1878df2cb6a72fdffa393c9e453f6e1b6ac Mon Sep 17 00:00:00 2001 From: WXK <287788329@qq.com> Date: 星期五, 03 十一月 2023 16:40:00 +0800 Subject: [PATCH] 版本v2.11,修改防撞基站剔除机制。 --- Src/application/dw_app.c | 292 ++++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 194 insertions(+), 98 deletions(-) diff --git a/Src/application/dw_app.c b/Src/application/dw_app.c index 400631f..68fb1ba 100644 --- a/Src/application/dw_app.c +++ b/Src/application/dw_app.c @@ -80,7 +80,7 @@ NEARPOLL, SINGLEPOLL, }tag_state=STARTPOLL; -static dwt_config_t config = { + dwt_config_t config = { 2, /* Channel number. */ DWT_PRF_64M, /* Pulse repetition frequency. */ DWT_PLEN_128, /* Preamble length. */ @@ -89,7 +89,7 @@ 9, /* RX preamble code. Used in RX only. */ 1, /* Use non-standard SFD (Boolean) */ DWT_BR_6M8, /* Data rate. */ - DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRMODE_EXT, /* PHY header mode. */ (129 + 8 - 8) /* SFD timeout (preamble length + 1 + SFD length - PAC size). Used in RX only. */ }; static uint8_t tx_poll_msg[20] = {0}; @@ -107,7 +107,6 @@ static uint64_t poll_rx_ts; static uint64_t resp_tx_ts; static uint64_t final_rx_ts; -static double tof; int32_t anchor_dist_last_frm[TAG_NUM_IN_SYS],his_dist[TAG_NUM_IN_SYS]; ; uint32_t tag_id = 0; uint32_t tag_id_recv = 0; @@ -119,7 +118,7 @@ LPFilter_Frac* p_Dis_Filter; //测距用的低通滤波器 - +void GetNearMsg(void); static uint64_t get_tx_timestamp_u64(void) { uint8_t ts_tab[5]; @@ -611,8 +610,9 @@ if(minddist!=0x1ffff&&minddist!=0) { trygetnearmsg_times = 0; - tag_state = GETNEARMSG; + tag_state = GETNEARMSG; mainbase_id = mindist_ancid; + GetNearMsg(); } if(getsync_flag==0) @@ -714,14 +714,14 @@ u32 start_poll,frame_len; u8 nearmsg_i=0; NextSlotDelayMs(0); - for(nearmsg_i=0;nearmsg_i<20;nearmsg_i++) + for(nearmsg_i=0;nearmsg_i<MAX_NEARBASE_NUM;nearmsg_i++) { nearbase_distlist[nearmsg_i] = 0x1ffff; } -//mainbase_id = 0x9818; +//mainbase_id = 0x1; memcpy(&tx_near_msg[ANCHOR_ID_IDX],&mainbase_id,2); memcpy(&tx_near_msg[TAG_ID_IDX],&dev_id,2); - tx_near_msg[MESSAGE_TYPE_IDX] = NEAR_MSG; + tx_near_msg[MESSAGE_TYPE_IDX] = POS_MSG; dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS); //设置发送后开启接收,并设定延迟时间 @@ -752,7 +752,7 @@ dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS);//清楚寄存器标志位 frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK; //获得接收到的数据长度 dwt_readrxdata(rx_buffer, frame_len, 0); //读取接收数据 - if (rx_buffer[MESSAGE_TYPE_IDX] == NEAR_MSG&&!memcmp(&rx_buffer[TAG_ID_IDX],&dev_id,2)) //判断接收到的数据是否是response数据 + if (rx_buffer[MESSAGE_TYPE_IDX] == POS_MSG&&!memcmp(&rx_buffer[TAG_ID_IDX],&dev_id,2)) //判断接收到的数据是否是response数据 { nearbase_num=rx_buffer[NEARBASENUM_INDEX]; memcpy(&rec_tagpos_binary,&rx_buffer[NEARMSG_EMPTYSLOTPOS_INDEX],4); @@ -795,8 +795,63 @@ USART_puts(usart_send,27+8*nearbase_num); //HexToAsciiSendUDP(usart_send,27+8*nearbase_num); } +#define FREQ_OFFSET_MULTIPLIER (998.4e6/2.0/1024.0/131072.0) +#define FREQ_OFFSET_MULTIPLIER_110KB (998.4e6/2.0/8192.0/131072.0) + +// Multiplication factors to convert frequency offset in Hertz to PPM crystal offset +// NB: also changes sign so a positive value means the local RX clock is running slower than the remote TX device. + +#define HERTZ_TO_PPM_MULTIPLIER_CHAN_1 (-1.0e6/3494.4e6) +#define HERTZ_TO_PPM_MULTIPLIER_CHAN_2 (-1.0e6/3993.6e6) +#define HERTZ_TO_PPM_MULTIPLIER_CHAN_3 (-1.0e6/4492.8e6) +#define HERTZ_TO_PPM_MULTIPLIER_CHAN_5 (-1.0e6/6489.6e6) +int32_t test2; uint8_t pack_length = 0,pack_index = 0,pack_msgtype = 0; uint8_t motor_flag; +uint32_t testtimer[10],testtimer2,anc_pollrx[11],anc_resptx[11],tag_resprx[11]; +int32_t anc_clockoffset[11]; +int16_t anc_distoffset[11]; +extern uint8_t Pah_HRD_flag_fangchai; +uint8_t get_newdist,notenoughdist_count; +void SetANCTimestap(uint8_t i,uint8_t* pollrx,uint8_t* resptx,uint32_t resprx,uint8_t* distoffset) +{ + memcpy(&anc_pollrx[i],pollrx,4); + memcpy(&anc_resptx[i],resptx,4); + memcpy(&tag_resprx[i],&resprx,4); + memcpy(&anc_distoffset[i],distoffset,2); + anc_clockoffset[i] = test2; +} +float clockOffsetRatio; +double rtd_init, rtd_resp; +double tof,distance; +extern int32_t dwt_readcarrierintegrator(void) ; +void CalculateDists(void) +{ + for(int i=0;i<11;i++) + { + rec_anc_signalpower[i] = exsistbase_list[i]; + if(exsistbase_list[i]>0) + { + + exsistbase_list[i]--; + clockOffsetRatio = anc_clockoffset[i] * (FREQ_OFFSET_MULTIPLIER * HERTZ_TO_PPM_MULTIPLIER_CHAN_2 / 1.0e6) ; + rtd_init = tag_resprx[i] - poll_tx_ts&0xffffffff; + rtd_resp = anc_resptx[i] - anc_pollrx[i]; + tof = ((rtd_init - rtd_resp * (1 - clockOffsetRatio)) / 2.0) * DWT_TIME_UNITS; + distance = tof * SPEED_OF_LIGHT; + if(distance>-1000&&distance<100000) + nearbase_distlist[i] = distance*100+anc_distoffset[i]; + }else{ + nearbase_distlist[i] = 0x1ffff; + } + + } +} +extern uint16_t tagid_list[TAG_NUM_IN_SYS]; +extern uint16_t taglist_num; +extern int32_t tagdist_list[TAG_NUM_IN_SYS]; +uint16_t nearbase_taglist_num; +extern uint8_t uwb_tx[300]; void NearPoll(void) { @@ -831,25 +886,36 @@ tx_near_msg[BATTARY_IDX] = bat_percent; tx_near_msg[BUTTON_IDX] = userkey_state|stationary_flag<<1|gotosleep_flag<<2|motor_flag<<5; tx_near_msg[SEQUENCE_IDX] = frame_seq_nb; - tx_near_msg[SEQUENCEH_IDX] = (frame_seq_nb++)>>8; - tx_near_msg[NEARBASENUM_INDEX] = nearbase_num; + tx_near_msg[SEQUENCEH_IDX] = (frame_seq_nb++)>>8; + if(taglist_num>10) + {taglist_num=10;} + nearbase_taglist_num=nearbase_num+taglist_num; + tx_near_msg[NEARBASENUM_INDEX] = nearbase_taglist_num; memcpy(&tx_near_msg[NEARBASEID_INDEX],&nearbaseid_list,nearbase_num*2); - memcpy(&tx_near_msg[NEARBASEID_INDEX+nearbase_num*2],&nearbase_distlist,nearbase_num*4+4); - memcpy(&tx_near_msg[NEARBASEID_INDEX+nearbase_num*6+4],&rec_anc_signalpower,nearbase_num*2+2); + memcpy(&tx_near_msg[NEARBASEID_INDEX+nearbase_num*2],&tagid_list,taglist_num*2); + + memcpy(&tx_near_msg[NEARBASEID_INDEX+nearbase_num*2+taglist_num*2],&nearbase_distlist,nearbase_num*4+4); + memcpy(&tx_near_msg[NEARBASEID_INDEX+nearbase_num*2+taglist_num*2+nearbase_num*4+4],&tagdist_list,taglist_num*4); + + memcpy(&tx_near_msg[NEARBASEID_INDEX+nearbase_taglist_num*12+4],&rec_anc_signalpower,nearbase_taglist_num*2+2); if(intheight!=0) intheight+=g_com_map[HEIGHTOFFEST_INDEX]; - memcpy(&tx_near_msg[NEARBASEID_INDEX+nearbase_num*8+6],&intheight,2); - tx_near_msg[MESSAGE_TYPE_IDX] = NEAR_POLL; +// memcpy(&tx_near_msg[NEARBASEID_INDEX+nearbase_num*8+6],&intheight,2); + tx_near_msg[MESSAGE_TYPE_IDX] = POS_POLL; tx_near_msg[NEARP_TAGFREQ_INDEX] = tag_frequency; tx_near_msg[NEARP_TAGSLOTPOS_INDEX] = tagslotpos; memcpy(&tx_near_msg[ANCHOR_ID_IDX],&mainbase_id,2); - dwt_writetxdata(29+8*nearbase_num, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 - dwt_writetxfctrl(29+8*nearbase_num, 0);//设置超宽带发送数据长度 + dwt_writetxdata(29+8*nearbase_taglist_num, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 + dwt_writetxfctrl(29+8*nearbase_taglist_num, 0);//设置超宽带发送数据长度 + +// dwt_writetxdata(280, uwb_tx, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 +// dwt_writetxfctrl(282, 0);//设置超宽带发送数据长度 + current_count=HAL_LPTIM_ReadCounter(&hlptim1); while(current_count<poll_startcount||current_count>poll_startcount+16384) @@ -874,7 +940,7 @@ flag_getresponse=0; start_count=HAL_LPTIM_ReadCounter(&hlptim1); recbase_num=0; - timeout=ceil((float)nearbase_num*SLOT_SCALE)+3; + timeout=ceil((float)nearbase_taglist_num*SLOT_SCALE)+3; end_count=start_count+(timeout<<5); if(end_count>=32768) {end_count-=32768;} @@ -899,10 +965,11 @@ dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS);//清楚寄存器标志位 frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK; //获得接收到的数据长度 dwt_readrxdata(rx_buffer, frame_len, 0); //读取接收数据 + test2 = dwt_readcarrierintegrator(); dwt_setrxtimeout(0);//设定接收超时时间,0位没有超时时间 dwt_rxenable(0);//打开接收 //HAL_GPIO_WritePin(LED1_G_GPIO_Port, LED1_G_Pin, GPIO_PIN_SET); - if (rx_buffer[MESSAGE_TYPE_IDX] == NEAR_RESPONSE&&!memcmp(&rx_buffer[TAG_ID_IDX],&dev_id,2)) //判断接收到的数据是否是response数据 + if (rx_buffer[MESSAGE_TYPE_IDX] == POS_RESPONSE&&!memcmp(&rx_buffer[TAG_ID_IDX],&dev_id,2)) //判断接收到的数据是否是response数据 { u16 rec_nearbaseid,rec_nearbasepos; poll_tx_ts = get_tx_timestamp_u64(); //获得POLL发送时间T1 resp_rx_ts = get_rx_timestamp_u64(); //获得RESPONSE接收时间T4 @@ -910,32 +977,36 @@ memcpy(&rec_nearbaseid,&rx_buffer[ANCHOR_ID_IDX],2); if(rec_nearbaseid==mainbase_id) { + exsistbase_list[0]=KEEP_TIMES; + SetANCTimestap(0,&rx_buffer[RESP_MSG_POLL_RX_TS_IDX],&rx_buffer[RESP_MSG_RESP_TX_TS_IDX],resp_rx_ts,&rx_buffer[RESP_MSG_ANC_DISTOFFSET]); + //////////////////////////////////时间同步 memcpy(&sync_timer,&rx_buffer[ANCTIMEMS],2); memcpy(&tmp_time,&rx_buffer[ANCTIMEUS],2); current_count=HAL_LPTIM_ReadCounter(&hlptim1); dwt_forcetrxoff(); - final_tx_time = (resp_rx_ts + ((RESP_RX_TO_FINAL_TX_DLY_UUS) * UUS_TO_DWT_TIME)) >> 8; - final_tx_ts = (((uint64_t)(final_tx_time & 0xFFFFFFFE)) << 8) + TX_ANT_DLY;//final包实际发送时间是计算时间加上发送天线delay - final_msg_set_ts(&tx_near_msg[FINAL_MSG_POLL_TX_TS_IDX], poll_tx_ts);//将T1,T4,T5写入发送数据 - final_msg_set_ts(&tx_near_msg[FINAL_MSG_RESP_RX_NEARBASE_IDX+nearbase_num*4], resp_rx_ts); - final_msg_set_ts(&tx_near_msg[FINAL_MSG_FINAL_TX_TS_IDX], final_tx_ts); - tx_near_msg[MESSAGE_TYPE_IDX]=NEAR_FINAL; +// final_tx_time = (resp_rx_ts + ((RESP_RX_TO_FINAL_TX_DLY_UUS) * UUS_TO_DWT_TIME)) >> 8; +// final_tx_ts = (((uint64_t)(final_tx_time & 0xFFFFFFFE)) << 8) + TX_ANT_DLY;//final包实际发送时间是计算时间加上发送天线delay +// final_msg_set_ts(&tx_near_msg[FINAL_MSG_POLL_TX_TS_IDX], poll_tx_ts);//将T1,T4,T5写入发送数据 +// final_msg_set_ts(&tx_near_msg[FINAL_MSG_RESP_RX_NEARBASE_IDX+nearbase_num*4], resp_rx_ts); +// final_msg_set_ts(&tx_near_msg[FINAL_MSG_FINAL_TX_TS_IDX], final_tx_ts); +// tx_near_msg[MESSAGE_TYPE_IDX]=POS_FINAL; rec_remotepara_state=rx_buffer[MOTORSTATE_INDEX]>>4; - if(rec_remotepara_state&&!memcmp(&rx_buffer[TAG_ID_IDX],&dev_id,2)) - { - para_update = 1; - tx_near_msg[TAGCONFIGSUCCESS_INDEX] = 1; - para_len = frame_len-22; - memcpy(rec_remotepara,&rx_buffer[REMOTEPARA_INDEX],para_len); - } - dwt_writetxdata(28+nearbase_num*4, tx_near_msg, 0);//将发送数据写入DW1000 - dwt_writetxfctrl(28+nearbase_num*4, 0);//设定发送数据长度 - dwt_setdelayedtrxtime(final_tx_time);//设置final包发送时间T5 - result=dwt_starttx(DWT_START_TX_DELAYED);//设定为延迟发送 + if(rec_remotepara_state&&!memcmp(&rx_buffer[TAG_ID_IDX],&dev_id,2)) + { + para_update = 1; + tx_near_msg[TAGCONFIGSUCCESS_INDEX] = 1; + para_len = frame_len-22; + memcpy(rec_remotepara,&rx_buffer[REMOTEPARA_INDEX],para_len); + } +// dwt_writetxdata(28+nearbase_num*4, tx_near_msg, 0);//将发送数据写入DW1000 +// dwt_writetxfctrl(28+nearbase_num*4, 0);//设定发送数据长度 +// dwt_setdelayedtrxtime(final_tx_time);//设置final包发送时间T5 +// result=dwt_starttx(DWT_START_TX_DELAYED);//设定为延迟发送 userkey_state = !GET_USERKEY; - memcpy(&temp_dist,&rx_buffer[DIST_IDX],4); + //memcpy(&temp_dist,&rx_buffer[DIST_IDX],4); + temp_dist = nearbase_distlist[0]; if(temp_dist!=nearbase_distlist[0]) { get_newdist++; @@ -945,7 +1016,7 @@ base_mindist = temp_dist; if((rx_buffer[MOTORSTATE_INDEX]&0xf)!=3) motor_state=rx_buffer[MOTORSTATE_INDEX]&0xf; - if(frame_len==28) + if(frame_len==38) { memcpy(&rec_maxrangelen,&rx_buffer[MAXRANGE_DISTANCE],2); memcpy(&rec_anc_signalpower[0],&rx_buffer[ANC_SIGNALPOWER],2); @@ -953,7 +1024,7 @@ { if(outrange_times++>OUTRANGE_RESTARTTIMES) { - // tag_state = STARTPOLL; + tag_state = STARTPOLL; } }else{ outrange_times = 0; @@ -964,7 +1035,7 @@ mainbase_lost_count=0; flag_finalsend=1; - memcpy(&mainbase_dist,&rx_buffer[DIST_IDX],4); +// memcpy(&mainbase_dist,&rx_buffer[DIST_IDX],4); flag_getresponse=1; @@ -979,17 +1050,20 @@ } ancsync_time=((sync_timer)*1000+tmp_time); SetLPTimer(ancsync_time); - if(result==0) - {while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))//不断查询芯片状态直到发送完成 - { };} +// if(result==0) +// {while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))//不断查询芯片状态直到发送完成 +// { };} //HAL_GPIO_WritePin(LED1_G_GPIO_Port, LED1_G_Pin, GPIO_PIN_RESET); break; }else{ - rec_nearbasepos=FindNearBasePos(rec_nearbaseid); - exsistbase_list[rec_nearbasepos]=KEEP_TIMES; - memcpy(&temp_dist,&rx_buffer[DIST_IDX],4); - if(frame_len==28) + rec_nearbasepos=FindNearBasePos(rec_nearbaseid); + SetANCTimestap(rec_nearbasepos+1,&rx_buffer[RESP_MSG_POLL_RX_TS_IDX],&rx_buffer[RESP_MSG_RESP_TX_TS_IDX],resp_rx_ts,&rx_buffer[RESP_MSG_ANC_DISTOFFSET]); + + exsistbase_list[rec_nearbasepos+1]=KEEP_TIMES; + //memcpy(&temp_dist,&rx_buffer[DIST_IDX],4); + temp_dist = nearbase_distlist[rec_nearbasepos+1]; + if(frame_len==38) memcpy(&rec_anc_signalpower[rec_nearbasepos+1],&rx_buffer[ANC_SIGNALPOWER],2); memcpy(&nearbase_switchdistlist[rec_nearbasepos],&rx_buffer[NR_NEARSWITCH_DISTANCE],2); if(temp_dist!=nearbase_distlist[rec_nearbasepos+1]) @@ -998,18 +1072,18 @@ } nearbase_distlist[rec_nearbasepos+1]=temp_dist; // nearbase_distlist[1]对应 rec_nearbaseid[0]的距离 final_msg_set_ts(&tx_near_msg[FINAL_MSG_RESP_RX_NEARBASE_IDX+(rec_nearbasepos)*4], resp_rx_ts); - if(temp_dist<salvebase_mindist&&nearbase_switchdistlist[rec_nearbasepos]==1) + if(temp_dist<salvebase_mindist&&nearbase_switchdistlist[rec_nearbasepos]!=0&&(nearbase_switchdistlist[rec_nearbasepos]==1||temp_dist<nearbase_switchdistlist[rec_nearbasepos])) { salvebase_mindist = temp_dist; mindist_slavebaseid = rec_nearbaseid; } #ifdef SWITCHBASE_ZHUANDIAN - if(temp_dist<nearbase_switchdistlist[rec_nearbasepos]&&nearbase_switchdistlist[rec_nearbasepos]>1&&temp_dist>0) - { - mainbase_id = rec_nearbaseid; - tag_state = GETNEARMSG; - trygetnearmsg_times = 0; - } +// if(temp_dist<nearbase_switchdistlist[rec_nearbasepos]&&nearbase_switchdistlist[rec_nearbasepos]>1&&temp_dist>0) +// { +// mainbase_id = rec_nearbaseid; +// tag_state = GETNEARMSG; +// trygetnearmsg_times = 0; +// } #endif } @@ -1037,29 +1111,33 @@ if(salvebase_mindist<mainbase_dist- THRESHOLD_CHANGE_MAINBASE_DIST ) { changemainbase_count++; - if(changemainbase_count>tag_frequency*2) + if(changemainbase_count>2) { - mainbase_id = mindist_slavebaseid; - tag_state = GETNEARMSG; - trygetnearmsg_times = 0; + changemainbase_count = 0; + mainbase_id = mindist_slavebaseid; + tag_state = GETNEARMSG; + trygetnearmsg_times = 0; + GetNearMsg(); } }else{ changemainbase_count = 0; } #endif - }else if(mainbase_lost_count>5*tag_frequency) + }else if(mainbase_lost_count>10) { - // tag_state = DISCPOLL; + mainbase_lost_count = 0; + tag_state = DISCPOLL; + DiscPoll(); } if(mainbase_lost_count!=0) { - if(mainbase_lost_count<=tag_frequency*1) + if(mainbase_lost_count<=5) {NextSlotDelayMs(0); }else{ NextSlotDelayMs(0); } } - +CalculateDists(); if(para_update) { @@ -1070,9 +1148,19 @@ { if( pack_index == MOTOR_ONTIME_INDEX) { - // if(motor_keeptime==0) + if(motor_keeptime==0) motor_keeptime = rec_remotepara[3]; - }else{ + }else if( pack_index == 2*COM_INTERVAL) + { + if(memcmp(&g_com_map[COM_INTERVAL],&rec_remotepara[3],2)!=0) + { + memcpy((uint8_t*)&g_com_map + pack_index, &rec_remotepara[3], pack_length); + save_com_map_to_flash(); + tag_frequency = 1000/g_com_map[COM_INTERVAL]; + bigslot_num = TOTAL_SLOTNUM/tag_frequency; + } + } + else{ if(pack_index<200) { memcpy((uint8_t*)&g_com_map + pack_index, &rec_remotepara[3], pack_length); @@ -1085,21 +1173,22 @@ } } } - if(get_newdist>2) - { - notenoughdist_count = 0; - }else{ - if(notenoughdist_count++>3) - { - notenoughdist_count = 0; - // tag_state = DISCPOLL; - } - } +// if(get_newdist>=2) +// { +// notenoughdist_count = 0; +// }else{ +// if(notenoughdist_count++>10) +// { +// notenoughdist_count = 0; +// tag_state = DISCPOLL; +// } +// } for(i=0;i<nearbase_num;i++) { if(nearbaseid_list[i]!=nearbaseid_list2[i]) { tag_state = GETNEARMSG; + GetNearMsg(); trygetnearmsg_times = 0; nearbaseid_list0[i]=1; } @@ -1135,7 +1224,8 @@ memcpy(&tx_near_msg[REGP_VERSION_INDEX],&g_com_map[VERSION],2); memcpy(&tx_near_msg[REGP_IMUTHRES_INDEX],&g_com_map[IMU_THRES],2); memcpy(&tx_near_msg[REGP_NOMOVESLEEPTIME_INDEX],&g_com_map[NOMOVESLEEP_TIME],2); - memcpy(&tx_near_msg[REGP_HEIGHTOFFSET_INDEX],&g_com_map[HEIGHTOFFEST_INDEX],2); + send_buffer[REGP_BATTARY_INDEX] = bat_percent; +// memcpy(&tx_near_msg[REGP_HEIGHTOFFSET_INDEX],&g_com_map[HEIGHTOFFEST_INDEX],2); dwt_writetxdata(23, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 dwt_writetxfctrl(23, 0);//设置超宽带发送数据长度 dwt_starttx(DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED);//开启发送,发送完成后等待一段时间开启接收,等待时间在dwt_setrxaftertxdelay中设置 @@ -1156,10 +1246,10 @@ if (rx_buffer[MESSAGE_TYPE_IDX] == REG_RESPONSE&&!memcmp(&rx_buffer[TAG_ID_IDX],&dev_id,2)) //判断接收到的数据是否是response数据 { u16 rec_nearbaseid,rec_nearbasepos; - memcpy(&rec_nearbaseid,&rx_buffer[ANCHOR_ID_IDX],2); - tag_frequency = rx_buffer[REGR_TAGFREQ_INDEX]; - bigslot_num = TOTAL_SLOTNUM/tag_frequency; - tagslotpos = rx_buffer[REGR_TAGSLOTPOS_INDEX]; + memcpy(&rec_nearbaseid,&rx_buffer[ANCHOR_ID_IDX],2); + tag_frequency = rx_buffer[REGR_TAGFREQ_INDEX]; + bigslot_num = TOTAL_SLOTNUM/tag_frequency; + tagslotpos = rx_buffer[REGR_TAGSLOTPOS_INDEX]; //////////////////////////////////时间同步 memcpy(&sync_timer,&rx_buffer[ANCTIMEMS],2); memcpy(&tmp_time,&rx_buffer[ANCTIMEUS],2); @@ -1190,32 +1280,33 @@ memcpy(nearbaseid_list,&rx_buffer[NEARBASEID_INDEX],nearbase_num*2); memcpy(nearbaseid_list2,&rx_buffer[NEARBASEID_INDEX],nearbase_num*2); if(tagslotpos!=255) - tag_state = DISCPOLL; + tag_state = DISCPOLL; } } } u32 id,error_times=0; - extern float Height; void Tag_App(void)//发送模式(TAG标签) { - //LED0_ON; - SPIx_CS_GPIO->BRR = SPIx_CS; - delay_us(700); - SPIx_CS_GPIO->BSRR = SPIx_CS; - id = dwt_readdevid() ; - while (DWT_DEVICE_ID != id) - { - // Dw1000_Init(); - id = dwt_readdevid() ; - IdleTask(); - if(error_times++>20) - { - printf("DW ID ERROR.\r\n"); - SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //软复位回到bootloader - } - } +// //LED0_ON; +// SPIx_CS_GPIO->BRR = SPIx_CS; +// delay_us(700); +// SPIx_CS_GPIO->BSRR = SPIx_CS; +// id = dwt_readdevid() ; +// while (DWT_DEVICE_ID != id) +// { +// // Dw1000_Init(); +// id = dwt_readdevid() ; +// IdleTask(); +// if(error_times++>20) +// { +// printf("DW ID ERROR.\r\n"); +// SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //软复位回到bootloader +// } +// } + dwt_forcetrxoff(); +// Dw1000_Init(); error_times = 0; switch(tag_state) { @@ -1249,5 +1340,10 @@ break; } userkey_state = !GET_USERKEY; - dwt_entersleep(); + dwt_forcetrxoff(); +// Dw1000_Init(); + dwt_setinterrupt( DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO | DWT_INT_RXPTO), 1); + dwt_setrxtimeout(0);//设定接收超时时间,0位没有超时时间 + dwt_rxenable(0); + //dwt_entersleep(); } -- Gitblit v1.9.3