From 5cb269400905175cf618729ab44dfa4ccd3d0331 Mon Sep 17 00:00:00 2001 From: zhangbo <zhangbo@qq.com> Date: 星期一, 21 七月 2025 17:51:51 +0800 Subject: [PATCH] 串口扫描功能调通,升级有问题 --- keil/uwb_tag.c | 268 +++++++++++++++++++++++++++-------------------------- 1 files changed, 136 insertions(+), 132 deletions(-) diff --git a/keil/uwb_tag.c b/keil/uwb_tag.c index 9688cfe..f2d286d 100644 --- a/keil/uwb_tag.c +++ b/keil/uwb_tag.c @@ -17,8 +17,8 @@ #define RANGING_PERIOD_MS (1000) /* This is the delay from the end of the poll frame transmission to the enable of the receiver */ -#define POLL_TX_TO_RESP_RX_DLY_US 750U //yuan700 - +#define POLL_TX_TO_RESP_RX_DLY_US 600U //yuan700 +//#define POLL_TX_TO_RESP_RX_DLY_US 550U //yuan700 #define RESP_RX_TO_FINAL_TX_DLY_US 550U /* Poll delay: 1s */ @@ -33,7 +33,10 @@ #define FINAL_MSG_RESP_RX_TS_IDX 14 #define FINAL_MSG_FINAL_TX_TS_IDX 18 #define DELAY_DEFAULT 1000 -#define DELAY_BETWEEN_TWO_FRAME_UUS 600 //yuan1400 + +#define DELAY_BETWEEN_TWO_FRAME_UUS 400 //yuan1400 +//#define DELAY_BETWEEN_TWO_FRAME_UUS 400 //yuan1400 + #define HALF_SECOND_TIME 62400000 static uint16_t CmpTagInList(uint16_t tagid); @@ -47,22 +50,23 @@ }; extern uint16_t dev_id; extern uint8_t group_id; +extern struct mk_uwb_configure config; /* Default communication configuration. */ -static struct mk_uwb_configure config = {//yuan - .phy_work_mode = (uint8_t)(PHY_TX | PHY_RX), - .phy_cfg.ch_num = 5, /* Channel number. */ - .phy_cfg.code_index = 9, /* TRX preamble code */ - .phy_cfg.mean_prf = MEAN_PRF_64M, /* Mean prf 64/128/256M */ - .phy_cfg.data_bit_rate = DATA_BR_6M8, /* Data rate 6.8M */ - .phy_cfg.sync_sym = PREAM_LEN_128, /* Preamble duration, length of preamble 128 */ - .phy_cfg.sfd_sym = NON_STD_NSFD5_8, /* Identifier for SFD sequence */ - .phy_cfg.ranging_bit = 1, /* ranging bit set 1 */ - .phy_cfg.trx_mode = TRX_MODE_15_4A, /* IEEE802.15.4z - BPRF mode */ - .phy_cfg.sts_pkt_cfg = STS_PKT_CFG_0, /* SP0 Frame */ - .phy_cfg.sts_segnum = STS_SEGNUM_BPRF_1, /* Number of STS segments in the frame */ - .phy_cfg.sts_seglen = STS_SEGLEN_BPRF_64, /* Number of symbols in an STS segment */ - .phy_cfg.rx_ant_id = UWB_RX_ANT_3, /* UWB RX antenna port */ -}; +//static struct mk_uwb_configure config = {//yuan +// .phy_work_mode = (uint8_t)(PHY_TX | PHY_RX), +// .phy_cfg.ch_num = 5, /* Channel number. */ +// .phy_cfg.code_index = 9, /* TRX preamble code */ +// .phy_cfg.mean_prf = MEAN_PRF_64M, /* Mean prf 64/128/256M */ +// .phy_cfg.data_bit_rate = DATA_BR_6M8, /* Data rate 6.8M */ +// .phy_cfg.sync_sym = PREAM_LEN_64, /* Preamble duration, length of preamble 128 新基站128,老基站64*/ +// .phy_cfg.sfd_sym = NON_STD_NSFD5_8, /* Identifier for SFD sequence */ +// .phy_cfg.ranging_bit = 1, /* ranging bit set 1 */ +// .phy_cfg.trx_mode = TRX_MODE_15_4A, /* IEEE802.15.4z - BPRF mode */ +// .phy_cfg.sts_pkt_cfg = STS_PKT_CFG_0, /* SP0 Frame */ +// .phy_cfg.sts_segnum = STS_SEGNUM_BPRF_1, /* Number of STS segments in the frame */ +// .phy_cfg.sts_seglen = STS_SEGLEN_BPRF_64, /* Number of symbols in an STS segment */ +// .phy_cfg.rx_ant_id = UWB_RX_ANT_3, /* UWB RX antenna port */ +//}; ///* Default communication configuration. */ //static struct mk_uwb_configure config = { // .phy_work_mode = (uint8_t)(PHY_TX | PHY_RX), @@ -138,7 +142,7 @@ uint32_t temp_tag_count3=0; uint32_t temp_count4=0; uint32_t tempflag=0; -int32_t freq_offset,freq_offset_filter; +int32_t freq_offset,freq_offset_filter; int temp_flag,poll_tx_num,resp_rx_num; extern double distance; uint32_t count1,count2; @@ -152,19 +156,19 @@ }; void uwb_poll_buffer_construct(void) { - for(uint8_t i=0;i<nearbase_num;i++) //标签距离32位转成16位 -{ - u16_nearbase_distlist[i] = nearbase_distlist[i]; -} - uwb_sendbuffer[GROUP_ID_IDX] = group_id; - memcpy(&uwb_sendbuffer[TAG_ID_IDX],&dev_id,2); - //uwb_sendbuffer[BATTARY_IDX] = bat_percent; + for(uint8_t i=0; i<nearbase_num; i++) //标签距离32位转成16位 + { + u16_nearbase_distlist[i] = nearbase_distlist[i]; + } + uwb_sendbuffer[GROUP_ID_IDX] = group_id; + memcpy(&uwb_sendbuffer[TAG_ID_IDX],&dev_id,2); + //uwb_sendbuffer[BATTARY_IDX] = bat_percent; uwb_sendbuffer[SEQUENCE_IDX] = frame_seq_nb++; - uwb_sendbuffer[NEARBASENUM_INDEX] = nearbase_num; - memcpy(&uwb_sendbuffer[NEARBASEID_INDEX],&nearbaseid_list,nearbase_num*2);//基站id + uwb_sendbuffer[NEARBASENUM_INDEX] = nearbase_num; + memcpy(&uwb_sendbuffer[NEARBASEID_INDEX],&nearbaseid_list,nearbase_num*2);//基站id memcpy(&uwb_sendbuffer[NEARBASEID_INDEX+nearbase_num*2],&u16_nearbase_distlist,nearbase_num*2); - uwb_sendbuffer[MESSAGE_TYPE_IDX] = MBX_POLL; - memcpy(&uwb_sendbuffer[ANCHOR_ID_IDX],&mainbase_id,2); + uwb_sendbuffer[MESSAGE_TYPE_IDX] = MBX_POLL; + memcpy(&uwb_sendbuffer[ANCHOR_ID_IDX],&mainbase_id,2); } static enum SIMPLE_FSM_T state = SIMPLE_IDLE; @@ -224,9 +228,9 @@ // freq_offset_filter=average_filter(freq_offset);//获取频偏 //// int32_t ppm = freq_offset_filter / (int32_t)(ch_center_freq_map[UWB_CH_NUM] * 1e-6); //// calib_xtal38m4_load_cap_auto_tune(ppm);//利用电容调整晶振适配频偏应在完整的一包之后调整,需要关闭XTAL_AUTO_TUNE_EN 宏定义避免收包中途校准导致测距错误 -// //LOG_INFO(TRACE_MODULE_APP, "poll_tx_num is %d,resp_rx_num is %d,distance is %lf\r\n",poll_tx_num,resp_rx_num,distance); +// //LOG_INFO(TRACE_MODULE_APP, "poll_tx_num is %d,resp_rx_num is %d,distance is %lf\r\n",poll_tx_num,resp_rx_num,distance); //// receive_flag=1; -// +// // } // else // { @@ -236,13 +240,13 @@ // /* UWB_BD_ERR Preamble detection error */ // /* UWB_TO_ERR Receive timeout */ // /* UWB_STS_ERR STS error */ -// rx_state1=rx_report->err_code; +// rx_state1=rx_report->err_code; // rx_length = 0; // receive_flag=2; // temp_tag_count2=phy_timer_count_get(); -// +// // } -// +// //} ///* TX done process handler. */ @@ -270,102 +274,102 @@ //注意:因为新注册的标签并不知道基站已经收到了,所以要在下一包立刻将新的标签ID发出,否则标签会一直抢占基站的poll包。 //方法是将新注册的标签添加到下次发送的标签列表头部,其他标签依次向后挪动。 -uint16_t AddNewTagIntoList(uint16_t tagid) -{ - uint16_t newindex_cal = taglist_current_index+25;//当前索引+25,为下次索引要发出的值的最大值,如果总数小于这个值,即可放到最后面。 - if(newindex_cal>=taglist_total_num) //如果当前索引是最后一包,那么就加到总索引的后面,如果不是就加到下一次起始索引位置。 - { +uint16_t AddNewTagIntoList(uint16_t tagid) +{ + uint16_t newindex_cal = taglist_current_index+25;//当前索引+25,为下次索引要发出的值的最大值,如果总数小于这个值,即可放到最后面。 + if(newindex_cal>=taglist_total_num) //如果当前索引是最后一包,那么就加到总索引的后面,如果不是就加到下一次起始索引位置。 + { newindex_cal = taglist_total_num; - - }else{ - for(uint16_t i=taglist_total_num;i>newindex_cal;i--) //从后往前挪地方??就是插入 - { - taglist_id[i]=taglist_id[i-1]; - taglist_dist[i]=taglist_dist[i-1]; - taglist_keeptime[i]=taglist_keeptime[i-1]; - } - } - taglist_total_num++; - taglist_id[newindex_cal] = tagid; - taglist_dist[newindex_cal] = 0; - taglist_keeptime[newindex_cal] = TAG_KEEPTIMES; - return newindex_cal; + + } else { + for(uint16_t i=taglist_total_num; i>newindex_cal; i--) //从后往前挪地方??就是插入 + { + taglist_id[i]=taglist_id[i-1]; + taglist_dist[i]=taglist_dist[i-1]; + taglist_keeptime[i]=taglist_keeptime[i-1]; + } + } + taglist_total_num++; + taglist_id[newindex_cal] = tagid; + taglist_dist[newindex_cal] = 0; + taglist_keeptime[newindex_cal] = TAG_KEEPTIMES; + return newindex_cal; } uint8_t FindNearBasePos(uint16_t baseid)//寻找当前列表中的基站返回索引 { - uint8_t i; - for(i=0;i<nearbase_num;i++) - { - if(baseid==nearbaseid_list[i]) - return i; - } - if(i==nearbase_num) - return nearbase_num; + uint8_t i; + for(i=0; i<nearbase_num; i++) + { + if(baseid==nearbaseid_list[i]) + return i; + } + if(i==nearbase_num) + return nearbase_num; } void AnchorListUpdate(void) { - next_nearbase_num = 0; - int j=0; - for(int i=0;i<nearbase_num;i++) - { - if(exsistbase_list[i]>0) - { - exsistbase_list[i]--; - next_nearbase_num++; - true_exsistbase_list[j]=exsistbase_list[i]; - true_nearbase_idlist[j]=nearbaseid_list[i]; - true_nearbase_distlist[j++]=nearbase_distlist[i]; - - } - nearbase_num = next_nearbase_num;//更新现存基站数 - last_nearbase_num = next_nearbase_num;//更新当前基站数 - } + next_nearbase_num = 0; + int j=0; + for(int i=0; i<nearbase_num; i++) + { + if(exsistbase_list[i]>0) + { + exsistbase_list[i]--; + next_nearbase_num++; + true_exsistbase_list[j]=exsistbase_list[i]; + true_nearbase_idlist[j]=nearbaseid_list[i]; + true_nearbase_distlist[j++]=nearbase_distlist[i]; + + } + nearbase_num = next_nearbase_num;//更新现存基站数 + last_nearbase_num = next_nearbase_num;//更新当前基站数 + } } void Rank_ANchor_list_by_dis(void)//按照目前的基站距离进行冒泡排序用临时数组方式将最近的放到最前面,最远的放到最后面 { -for(int i=0;i<last_nearbase_num-1;i++) - { - for(int j=0;j<last_nearbase_num-1;j++) - { - if(true_nearbase_distlist[j]>true_nearbase_distlist[j+1]) - { - uint32_t temp_dist,temp_id,temp_exsis; - temp_dist=true_nearbase_distlist[j]; - temp_id = true_nearbase_idlist[j]; - temp_exsis=true_exsistbase_list[j]; - true_nearbase_distlist[j]=true_nearbase_distlist[j+1]; - true_nearbase_idlist[j]=true_nearbase_idlist[j+1]; - true_exsistbase_list[j]=true_exsistbase_list[j+1]; - - true_nearbase_distlist[j+1]=temp_dist; - true_nearbase_idlist[j+1]=temp_id; - true_exsistbase_list[j+1]=temp_exsis; - } - } - } - for (int i=0;i<last_nearbase_num;i++) - { - nearbaseid_list[i]=true_nearbase_idlist[i]; - nearbase_distlist[i]=true_nearbase_distlist[i]; - exsistbase_list[i] = true_exsistbase_list[i]; - } + for(int i=0; i<last_nearbase_num-1; i++) + { + for(int j=0; j<last_nearbase_num-1; j++) + { + if(true_nearbase_distlist[j]>true_nearbase_distlist[j+1]) + { + uint32_t temp_dist,temp_id,temp_exsis; + temp_dist=true_nearbase_distlist[j]; + temp_id = true_nearbase_idlist[j]; + temp_exsis=true_exsistbase_list[j]; + true_nearbase_distlist[j]=true_nearbase_distlist[j+1]; + true_nearbase_idlist[j]=true_nearbase_idlist[j+1]; + true_exsistbase_list[j]=true_exsistbase_list[j+1]; + + true_nearbase_distlist[j+1]=temp_dist; + true_nearbase_idlist[j+1]=temp_id; + true_exsistbase_list[j+1]=temp_exsis; + } + } + } + for (int i=0; i<last_nearbase_num; i++) + { + nearbaseid_list[i]=true_nearbase_idlist[i]; + nearbase_distlist[i]=true_nearbase_distlist[i]; + exsistbase_list[i] = true_exsistbase_list[i]; + } } static uint16_t CmpTagInList(uint16_t tagid)//找这个新一包的基站在不在现存的taglist中在的话对应位置更新存活时间,不在就增加(确保有效数量小于最大设置数) { uint16_t temp; - for(uint8_t i=0;i<taglist_total_num;i++) - { - if(memcmp(&tagid,&taglist_id[i],2)==0) + for(uint8_t i=0; i<taglist_total_num; i++) + { + if(memcmp(&tagid,&taglist_id[i],2)==0) { taglist_keeptime[i] = TAG_KEEPTIMES; - return i; + return i; } - } + } if(taglist_total_num<MAX_TAG_LIST_NUM) - temp = AddNewTagIntoList(tagid); - return temp; + temp = AddNewTagIntoList(tagid); + return temp; } int TagRange(void) @@ -404,9 +408,9 @@ // temp_tag_num=0;//临时数量为0 // poll_tx_en_start_u32 = phy_timer_count_get()+US_TO_PHY_TIMER_COUNT(POLL_DELAY);//发送必须要延时发送才可以用于测距否则立即发送会获取时间戳不对,需要计算程序运行时间,避免设置过去时间 // tempflag=uwb_tx(uwb_sendbuffer,13+4*nearbase_num,1,poll_tx_en_start_u32);//立即发送 -// +// // //gpio_pin_set(IO_PIN_5);//测试 -// //LOG_INFO(TRACE_MODULE_APP, "进入测距",poll_tx_num,resp_rx_num,distance); +// //LOG_INFO(TRACE_MODULE_APP, "进入测距",poll_tx_num,resp_rx_num,distance); // poll_tx_ts_i64 = ranging_tx_time_correct(poll_tx_en_start_u32 + phy_shr_duration());//修正时间戳 // temp_tag_count1=phy_timer_count_get(); // while(mac_is_busy());//等待发送完成 @@ -415,17 +419,17 @@ // temp_resp=resp_rx_en_start_u32; // //tempflag=uwb_rx(1, resp_rx_en_start_u32, RESP_RX_TIMEOUT_US);//开启接受并设置接收超时 // tempflag=uwb_rx(0,0, RESP_RX_TIMEOUT_US); -// +// //// receive_flag =0; // start_receive_count=phy_timer_count_get(); // poll_timeout=nearbase_num*US_TO_PHY_TIMER_COUNT(DELAY_BETWEEN_TWO_FRAME_UUS)+US_TO_PHY_TIMER_COUNT(RESP_RX_TIMEOUT_US);//多一个多0.4ms默认0.4ms计算为0.125*4*100000,默认开启1mss // end_receive_count=start_receive_count+poll_timeout; // if(end_receive_count>=UINT32_MAX) // {end_receive_count-=UINT32_MAX;} -// current_count=phy_timer_count_get(); +// current_count=phy_timer_count_get(); // while(current_count<end_receive_count||current_count>end_receive_count+HALF_SECOND_TIME)//循环接受包体,若为124.8K则是+62400000 // { -// +// // current_count=phy_timer_count_get();//不断刷新当前计数器值 // temp_tag_count2=phy_timer_count_get(); // while(mac_is_busy());//等待接收完成 @@ -433,10 +437,10 @@ //// if(receive_flag==1)//成功接收数据 // { //// receive_flag=0; -// +// // //接收成功则判断是否为同一组 // if (rx_buf[MESSAGE_TYPE_IDX] == MBX_RESPONSE&&!memcmp(&rx_buf[TAG_ID_IDX],&dev_id,2)&&rx_buf[GROUP_ID_IDX]==group_id) //判断接收到的数据是否是response数据 -// { +// { // memcpy(&rec_nearbaseid,&rx_buf[ANCHOR_ID_IDX],2); // if(last_nearbase_num==0) // { @@ -470,8 +474,8 @@ // } // tempflag=uwb_rx(0, 0, RESP_RX_TIMEOUT_US);//立即开启接受并设置0超时 // //gpio_pin_clr(IO_PIN_5);//测试 -// -// }else +// +// }else //// if(receive_flag==2) // {//接收出错 //// receive_flag=0; @@ -493,17 +497,17 @@ void UWB_Tag_Poll(void) { - switch(UWB_work_state) - { - case LINK_SUCCESS: - case SEARCH_DEV: - case UN_BIND: - { - uwb_led_on(); - TagRange(); - uwb_led_off(); - } - break; - } + switch(UWB_work_state) + { + case LINK_SUCCESS: + case SEARCH_DEV: + case UN_BIND: + { + uwb_led_on(); + TagRange(); + uwb_led_off(); + } + break; + } // update_led_power_state();//更新灯状态 } \ No newline at end of file -- Gitblit v1.9.3