From 39842cc2707c7ceb890bd963d1d226cc7542bc91 Mon Sep 17 00:00:00 2001 From: zhangbo <zhangbo@qq.com> Date: 星期五, 16 五月 2025 17:47:05 +0800 Subject: [PATCH] 对比PCA9555的修改 --- keil/uwb_app.c | 235 ++++++---------------------------------------------------- 1 files changed, 26 insertions(+), 209 deletions(-) diff --git a/keil/uwb_app.c b/keil/uwb_app.c index fc6b031..13b32ec 100644 --- a/keil/uwb_app.c +++ b/keil/uwb_app.c @@ -12,7 +12,7 @@ #include "PCA9555.h" #define TAG_KEEPTIMES 20 -#define REPORT_TAG_KEEPTIMES 1 +#define REPORT_TAG_KEEPTIMES 20 #define GROUP_NUM 3 uint16_t group_min_dist[GROUP_NUM+1]; @@ -98,6 +98,7 @@ #define RANGING_PERIOD_MS (1000) /* This is the delay from Frame RX POLL frame to send RESP Frame */ +//#define POLL_RX_TO_RESP_TX_DLY_US 550U //yuan750 7500Haoyong #define POLL_RX_TO_RESP_TX_DLY_US 550U //yuan750 7500Haoyong #define RESP_TX_TO_FINAL_RX_DLY_US 500U @@ -324,6 +325,8 @@ uint16_t REPLY_POLL_NUM; uint16_t ERR_RX_NUM; uint8_t send_qiangzhan_NUM; +uint8_t resp_tx_flag; +uint32_t temp_c[10]; static void rx_int_callback(struct MAC_HW_REPORT_T *rx_report) { uint8_t valid_sts=0; // Power off radio @@ -333,20 +336,25 @@ if (rx_report->err_code == UWB_RX_OK) { - + resp_tx_flag=0; /* Received data does not contain FCS */ rx_length = rx_report->pkt_len; memcpy(rx_buf, rx_report->pkt_data, rx_length); memcpy(&rx_rpt, rx_report, sizeof(struct MAC_HW_REPORT_T)); /* Calculate rx timestamp */ - temp_count= phy_timer_count_get(); + poll_rx_en_start_u32 = rx_rpt.timestamp - phy_shr_duration(); poll_rx_ts_i64 = ranging_rx_time_correct(&rx_rpt); poll_rx_num++; REV_RX_NUM++; rssi = rx_report->rssi; receive_flag=1; + temp_count= phy_timer_count_get(); Anchor_App(); + if(resp_tx_flag==0) + { + OpenUWB(); + } #ifdef STS_MODE valid_sts= sts_valid_check(); if (valid_sts) @@ -378,9 +386,9 @@ ERR_RX_NUM++; UWB_STATE=UWB_STATE_IDLE; - // OpenUWB();//再次开启UWB接收 + OpenUWB();//再次开启UWB接收 } - OpenUWB();//再次开启UWB接收 +// OpenUWB();//再次开启UWB接收 #ifdef USE_TX_UWBON if(UWB_STATE==UWB_STATE_IDLE) { @@ -407,7 +415,7 @@ temp_count= phy_timer_count_get(); temp_internal=temp_count; - + OpenUWB(); TX_CALL_POLL_NUM++; // if(send_qiangzhan_NUM) // { @@ -530,7 +538,7 @@ uint16_t response_num; uint8_t Anchor_RecNearPoll(uint8_t ancrec_nearbasepos)//根据自己是否为新基站定制消息去发送,根据是否抢占判断 { - temp_count2=poll_rx_en_start_u32; +// temp_count2=phy_timer_count_get(); memcpy(&send_buffer[GROUP_ID_IDX],&group_id,1);//组id memcpy(&send_buffer[ANCHOR_ID_IDX],&dev_id,2);//自身id memcpy(&send_buffer[TAG_ID_IDX],&tag_id_recv,2);//接受者id @@ -549,7 +557,7 @@ // //这里应该有问题问一下钟工 // }//此处设置绝对时间将poll u32改为phy_timer_count_get() position=ancrec_nearbasepos; - temp_count1=phy_timer_count_get(); + resp_tx_en_start_u32 = poll_rx_en_start_u32+US_TO_PHY_TIMER_COUNT(POLL_RX_TO_RESP_TX_DLY_US)+ancrec_nearbasepos*US_TO_PHY_TIMER_COUNT(DELAY_BETWEEN_TWO_FRAME_UUS);//加入帧间隔 // resp_tx_en_start_u32 = temp_count1+US_TO_PHY_TIMER_COUNT(POLL_RX_TO_RESP_TX_DLY_US)+ancrec_nearbasepos*US_TO_PHY_TIMER_COUNT(DELAY_BETWEEN_TWO_FRAME_UUS);//加入帧间隔 resp_tx_ts_i64 = ranging_tx_time_correct(resp_tx_en_start_u32 + phy_shr_duration());//修正时间戳 @@ -558,10 +566,10 @@ resp_msg_set_ts(&send_buffer[RESP_MSG_RESP_TX_TS_IDX], resp_tx_ts_i64);//此处时间戳int64直接转换为uint64不知道会不会有错误 memcpy(&send_buffer[RESP_MSG_ANC_DISTOFFSET],&disoffset,2);//差个修正offset,修正有符号但是这个com表为无符号的,传过去直接赋给Int16_t相当于还原了 temp_resp_i64=resp_tx_ts_i64; - temp_count3= phy_timer_count_get(); + UWB_STATE==UWB_TX_STATE_BUSY; flag_temp2=uwb_tx(send_buffer, 40,1 ,resp_tx_en_start_u32);//立即发送测试size大小 - + resp_tx_flag=1; tagofflinetime[taglist_pos] = 0;//更新标签通信 // temp_count1=phy_timer_count_get(); @@ -584,146 +592,7 @@ uint32_t UWB_fachu_count=0; uint32_t UWB_qiangzhanfachu_count=0; uint32_t UWB_1003_count,UWB_6666_count=0; -//int UwbRange(void) -//{ -// uint8_t i; -// uint16_t tempid; - -// mac_register_process_handler(tx_int_callback, rx_int_callback); -// receive_flag = 0; -// flag_recsuccess = 0; - -// uwb_rxflag=uwb_rx(0, 0, range_timeout_us);//开启接收 - -// uwb_rxflag_num1++; -// // while(mac_is_busy()); -// // temp_count2=phy_timer_count_get(); -// start_receive_count=phy_timer_count_get(); -// poll_timeout=US_TO_PHY_TIMER_COUNT(range_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(); -// while(mac_is_busy()) -// { -//// IdleTask(); -// current_count=phy_timer_count_get(); -// if(current_count>end_receive_count&¤t_count<end_receive_count+HALF_SECOND_TIME)//超时时间为4.992秒 -// { -// break; -// } -// } -// -// if(receive_flag==1)//成功接收 -// { -// time_count_sdsj=phy_timer_count_get(); -//// gpio_pin_set(IO_PIN_5); -// -//// gpio_pin_clr(IO_PIN_5); -// #ifdef DEBUG_BOXING -//// gpio_pin_set(IO_PIN_5);//测试 -//// gpio_pin_clr(IO_PIN_5);//测试 -// #endif -//// timeceshi1=phy_timer_count_get(); -//// temp_count7=poll_rx_en_start_u32; -// receive_flag=0; -// if(group_id==rx_buf[GROUP_ID_IDX]&&rx_buf[MESSAGE_TYPE_IDX] == MBX_POLL)/*&&!memcmp(&rx_buf[TAG_ID_IDX],&g_com_map[BIND_DEV_ID],2)*///判断是否是和自己是同一组通讯的且为poll包 -// { -//// UWB_shoudao_count++; -// flag_recsuccess = 1; -//// temp_count2=phy_timer_count_get(); -// frame_seq_nb2 = rx_buf[SEQUENCE_IDX];//获取包序 -// battary = rx_buf[BATTARY_IDX]; -// rec_nearbase_num=rx_buf[FZ_NEARBASENUM_INDEX]; //标签传过来的他与基站交互的基站id数目 -// -// //rec_nearbase_num=25; -// -// memcpy(&tag_id_recv,&rx_buf[TAG_ID_IDX],2); -// memcpy(rec_ancidlist,&rx_buf[FZ_NEARBASEID_INDEX],2*rec_nearbase_num); -// memcpy(rec_ancdistlist,&rx_buf[FZ_NEARBASEID_INDEX+2*rec_nearbase_num],2*rec_nearbase_num); -// // memcpy(&rec_antdelay,&rx_buf[FZ_NEARBASEID_INDEX+rec_nearbase_num*4],2); -//// timeceshi1=phy_timer_count_get(); -//// temp_count7=poll_rx_en_start_u32; -// taglist_pos=CmpTagInList(tag_id_recv); -// for(i=0; i<rec_nearbase_num; i++) -// { -// -// if(rec_ancidlist[i] == dev_id) -// { -// rec_ancdistlist[i]+=(int16_t)g_com_map[DIST_OFFSET]; -// PushAnchorDataArray(tag_id_recv,rec_ancdistlist[i],battary); -// UWB_fachu_count++; -//// #ifdef DEBUG_BOXING -////// gpio_pin_clr(IO_PIN_5);//测试 -//// gpio_pin_set(IO_PIN_5);//测试 -//// #endif -// } -// } -// for(i=0; i<rec_nearbase_num; i++) -// { -// memcpy(&tempid,&rx_buf[FZ_NEARBASEID_INDEX+i*2],2); -// if(tempid==dev_id) -// { -// Anchor_RecNearPoll(i); -// tagdist_list[taglist_pos]=rec_ancdistlist[i]; -// if(group_min_dist[group_id]>rec_ancdistlist[i]) -// { -// group_min_dist[group_id] = rec_ancdistlist[i]; -// } -// if(taglist_pos==taglist_num)// taglist_pos==taglist_num 说明这个基站不在当前列表中 -// { //tempid==dev_id 说明基站下发测距报文有这个标签的信息 -// taglist_num++; //满足上述两种情况才会添加基站ID进入列表中,否则会出现标签不在基站列表中,标签也不响应的情况 -// tagid_list[taglist_pos] = tag_id_recv; -// } -// break; -// } -// } - -// if(i==rec_nearbase_num) -// { -// -// seize_anchor=1; //抢占anchor -// Anchor_RecNearPoll(i); -// UWB_qiangzhanfachu_count++; - -// } -// recev_error_num=0; - -//// sleep_timer_start(__MS_TO_32K_CNT(UWB_DELAY_TIME_US));//测试 -//// LOG_INFO(TRACE_MODULE_APP,"标签ID:%X,距离: %d 信号强度:%d.\r\n",g_com_map[BIND_DEV_ID],distance,rssi); -// -// } -// // uwb_rxflag=uwb_rx(0, 0, range_timeout_us); -// } -// #ifdef DEBUG_BOXING -//// gpio_pin_clr(IO_PIN_5);//测试 -//// gpio_pin_set(IO_PIN_5);//测试 -// #endif -// -// delay_us(1); -// uwb_rx_force_off(1); -//// gpio_pin_clr(IO_PIN_5); -//// #ifdef DEBUG_BOXING -//// gpio_pin_clr(IO_PIN_5);//测试. -//// #endif -//// if(!flag_recsuccess) -//// { -//// sleep_timer_start(__MS_TO_32K_CNT(UWB_DELAY_TIME_US-3));//测试 -//// LOG_INFO(TRACE_MODULE_APP,"测距失败,计数:%d\r\n",recev_error_num); -//// if(recev_error_num++>5) -//// { -//// recev_error_num=0; -//// UWB_work_state=SEARCH_DEV; -//// uwb_searchcount = 0; -//// search_open_flag = 1; -//// } -//// } -//// #ifdef DEBUG_BOXING -//// gpio_pin_clr(IO_PIN_5);//测试 -////// gpio_pin_set(IO_PIN_5);//测试 -//// #endif -//} int Uwbinit(void) { uwb_open(); @@ -837,78 +706,21 @@ //uint32_t wltag_statetimer,wltag_uwbtimer; int uwb_app_poll(void) { - - -// switch(wltag_state) -// { -// case RANGE: -// if(HIDO_TimerGetTick()-wltag_uwbtimer>2&&uwb_rx_flag==0) -// { -// -// wltag_uwbtimer = HIDO_TimerGetTick(); -// if(UWB_STATE==UWB_STATE_IDLE) -// { -// UWB_STATE=UWB_RX_STATE_BUSY; -// OpenUWB(); -// } -// } -// else if(HIDO_TimerGetTick()-wltag_uwbtimer>1&&uwb_rx_flag==1) -// { -//// time_flag=HIDO_TimerGetTick()-wltag_uwbtimer; -// UWB_LED_OFF; -// wltag_uwbtimer = HIDO_TimerGetTick(); -// CloseUWB(); -// UWB_STATE=UWB_STATE_IDLE; -// } -// if(uwb_losttimer>g_com_map[UWB_RNAGE_TIME]) -// { -// wltag_statetimer = HIDO_TimerGetTick(); -// if(uwb_rx_flag==0)//若要切换到搜索模式时没有开启则开启UWB -// { -// if(UWB_STATE==UWB_STATE_IDLE) -// { -// UWB_STATE=UWB_RX_STATE_BUSY; -// OpenUWB(); -// } -// } -// wltag_state = SEARCH; -// } -// break; -// case SEARCH: -// if(HIDO_TimerGetTick()-wltag_statetimer>1) -// { -// wltag_statetimer = HIDO_TimerGetTick(); -// wltag_state = CLOSE; -// CloseUWB(); -// UWB_STATE=UWB_STATE_IDLE; -// } -// break; -// case CLOSE: -// if(HIDO_TimerGetTick()-wltag_statetimer>g_com_map[UWB_WAIT_TIME]) -// { -// wltag_statetimer = HIDO_TimerGetTick(); -// wltag_state = SEARCH; -// if(UWB_STATE==UWB_STATE_IDLE) -// { -// UWB_STATE=UWB_RX_STATE_BUSY; -// OpenUWB(); -// } -// } -// break; -// } - UWBIdleTask(); } //uint16_t REV_POLL_NUM; //uint16_t REPLY_POLL_NUM; +extern uint8_t uwbled,gpsled,loraled,powerled; int Anchor_App(void) { uint8_t i; uint16_t tempid; + temp_count1=phy_timer_count_get(); if(group_id==rx_buf[GROUP_ID_IDX]&&rx_buf[MESSAGE_TYPE_IDX] == MBX_POLL)//判断是否是和自己是同一组通讯的且为poll包 { flag_recsuccess = 1; // wltag_state=RANGE;//成功后从search切换为range + REV_POLL_NUM++; memcpy(&g_com_receive_id,&rx_buf[TAG_ID_IDX],2); //temp_count2=phy_timer_count_get(); @@ -917,10 +729,14 @@ battary = rx_buf[BATTARY_IDX]; rec_nearbase_num=rx_buf[FZ_NEARBASENUM_INDEX]; //标签传过来的他与基站交互的基站id数目 memcpy(&tag_id_recv,&rx_buf[TAG_ID_IDX],2); + temp_count2=phy_timer_count_get(); memcpy(rec_ancidlist,&rx_buf[FZ_NEARBASEID_INDEX],2*rec_nearbase_num); memcpy(rec_ancdistlist,&rx_buf[FZ_NEARBASEID_INDEX+2*rec_nearbase_num],2*rec_nearbase_num); memcpy(&rec_antdelay,&rx_buf[FZ_NEARBASEID_INDEX+rec_nearbase_num*4],2); taglist_pos=CmpTagInList(tag_id_recv); + // UWB_LED_ON; + uwbled=1; + temp_count3=phy_timer_count_get(); if(taglist_num>=ANC_MAX_NUM) return 0; for(i=0; i<rec_nearbase_num; i++) @@ -939,6 +755,7 @@ break; } } + if((i==rec_nearbase_num&&taglist_pos==taglist_num)||(rec_nearbase_num==0&&!ExistInTagList(tag_id_recv)))//当基站不在标签列表中,标签也不在基站列表中时,随机找个时间片回复基站。 { Anchor_RecNearPoll(rec_nearbase_num); -- Gitblit v1.9.3