From 66596268c0f602ecc7ccbb34ea2b649108179eea Mon Sep 17 00:00:00 2001 From: zhyinch <zhyinch@gmail.com> Date: 星期一, 08 六月 2020 08:50:29 +0800 Subject: [PATCH] V1.15 --- 源码/核心板/Src/application/dw_app.c | 262 ++++++++++++++++++++++++++++++--------------------- 1 files changed, 154 insertions(+), 108 deletions(-) diff --git "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c" "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c" index e5cbeb5..c3f95e8 100644 --- "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c" +++ "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c" @@ -5,7 +5,7 @@ DISCPOLL, GETNEARMSG, NEARPOLL, -}tag_state; +}tag_state=GETNEARMSG; static dwt_config_t config = { 2, /* Channel number. */ DWT_PRF_64M, /* Pulse repetition frequency. */ @@ -25,6 +25,8 @@ static uint8_t tx_nearpoll_msg[80] = {0}; static uint8_t tx_nearresp_msg[80] = {0}; static uint8_t tx_nearfinal_msg[80] = {0}; + +static uint8_t tx_near_msg[80] = {0}; static uint32_t frame_seq_nb = 0; static uint32_t status_reg = 0; @@ -219,40 +221,61 @@ } u8 recbase_num=0; #define CHANGE_BASE_THRESHOLD 5 -void NearAncSelect(void) -{static u16 last_mainbase_id,change_base_count; - int32_t nearbase_mindist=99999, nearbase_minpos; +//void NearAncSelect(void) +//{static u16 last_mainbase_id,change_base_count; +// int32_t nearbase_mindist=99999, nearbase_minpos; +// u8 i; +// for(i=0;i<recbase_num-1;i++) +// { +// if(nearbase_mindist>nearbase_distlist[i]) +// { +// nearbase_mindist=nearbase_distlist[i]; +// nearbase_minpos=i; +// } +// } +// if(nearbase_mindist<mainbase_dist-THRESHOLD_CHANGE_MAINBASE_DIST) +// { +// if(last_mainbase_id==nearbaseid_list[nearbase_minpos]) +// { +// change_base_count++; +// if(change_base_count>CHANGE_BASE_THRESHOLD) +// { +// mainbase_id=last_mainbase_id; +// tag_state=GETNEARMSG; +// } +// }else{ +// change_base_count=0; +// } +// last_mainbase_id=nearbaseid_list[nearbase_minpos]; +// }else{ +// change_base_count=0; +// } +//} +u8 GetRandomSlotPos(uint32_t emptyslot) +{ u8 i; - for(i=0;i<recbase_num-1;i++) + for(i=dev_id%32;i<max_slotpos;i++) { - if(nearbase_mindist>nearbase_distlist[i]) + if(((emptyslot>>i)&0x1)==0) { - nearbase_mindist=nearbase_distlist[i]; - nearbase_minpos=i; + return i; } } - if(nearbase_mindist<mainbase_dist-THRESHOLD_CHANGE_MAINBASE_DIST) + + for(i=1;i<max_slotpos;i++) { - if(last_mainbase_id==nearbaseid_list[nearbase_minpos]) + if(((emptyslot>>i)&0x1)==0) { - change_base_count++; - if(change_base_count>CHANGE_BASE_THRESHOLD) - { - mainbase_id=last_mainbase_id; - tag_state=GETNEARMSG; - } - }else{ - change_base_count=0; + return i; } - last_mainbase_id=nearbaseid_list[nearbase_minpos]; - }else{ - change_base_count=0; } +return max_slotpos-1; } u8 test=0; u8 anclost_times=0; u8 exsistbase_list[MAX_NEARBASE_NUM],report_num,get_newbase=0;; u16 temp_sync_timer1,temp_sync_timer2; +u32 rec_tagpos_binary; void NearPoll(void) { static u8 mainbase_lost_count=0,flag_finalsend,flag_rxon; @@ -381,6 +404,9 @@ tx_nearfinal_msg[MESSAGE_TYPE_IDX]=NEAR_FINAL; dwt_writetxdata(28+nearbase_num*4, tx_nearfinal_msg, 0);//将发送数据写入DW1000 dwt_writetxfctrl(28+nearbase_num*4, 0);//设定发送数据长度 + memcpy(&rec_tagpos_binary,&rx_buffer[NEARMSG_EMPTYSLOTPOS_INDEX],4); + tagslotpos=GetRandomSlotPos(rec_tagpos_binary); + if(temp_dist!=0x1ffff) { #ifndef USART_INTEGRATE_OUTPUT @@ -458,22 +484,21 @@ j=0; if(exsistbase_list[0]==0) { - u8 temp_adc,random_value; - random_value=0; - for(i=0;i<8;i++) - { - temp_adc=Get_ADC_Value(); - random_value=random_value|((temp_adc&0x01)<<i); - } - tyncpoll_time=(random_value%max_slotpos)*slottime; +// u8 temp_adc,random_value; +// random_value=0; +// for(i=0;i<8;i++) +// { +// temp_adc=Get_ADC_Value(); +// random_value=random_value|((temp_adc&0x01)<<i); +// } + tyncpoll_time = (tagslotpos%max_slotpos)*slottime; } // tyncpoll_time=0; next_nearbase_num=0; for(i=0;i<last_nearbase_num+get_newbase;i++) { if(exsistbase_list[i]>0) - { - + { next_nearbase_num++; true_exsistbase_list[j]=exsistbase_list[i]; true_nearbase_idlist[j]=nearbaseid_list[i]; @@ -551,51 +576,69 @@ } - -//void GetNearMsg(void) -//{ -// u32 start_poll,frame_len; -// 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; -// -// dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS); //设置发送后开启接收,并设定延迟时间 -// dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS); -// dwt_writetxdata(12, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 -// dwt_writetxfctrl(12, 0);//设置超宽带发送数据长度 -// dwt_starttx(DWT_START_TX_IMMEDIATE| DWT_RESPONSE_EXPECTED); -// start_poll = time32_incr; -// /* We assume that the transmission is achieved correctly, poll for reception of a frame or error/timeout. See NOTE 8 below. */ -// while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))//不断查询芯片状态直到成功接收或者发生错误 -// { if(time32_incr - start_poll>20) -// NVIC_SystemReset(); -// }; -// if(status_reg==0xffffffff) -// { -// NVIC_SystemReset(); -// } -// if (status_reg & SYS_STATUS_RXFCG)//如果成功接收 -// { -// 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数据 -// { -// nearbase_num=rx_buffer[NEARBASENUM_INDEX]; -// tagslotpos=rx_buffer[TAGSLOTPOS]; -// memcpy(nearbaseid_list,&rx_buffer[NEARBASEID_INDEX],nearbase_num*2); -// slottime=ceil((nearbase_num+2)*0.3)+1; -// tyncpoll_time=tagslotpos*slottime; -// tag_state=NEARPOLL; -// } -// } -//} +u8 nearmsg_mainbase=0,rec_tagpos_emptylist[32]; +void GetNearMsg(void) +{ + u32 start_poll,frame_len; + if(nearmsg_mainbase) + {nearmsg_mainbase=0; + }else{ + nearmsg_mainbase=1; + } + memcpy(&tx_near_msg[ANCHOR_ID_IDX],&nearmsg_mainbase,2); + memcpy(&tx_near_msg[TAG_ID_IDX],&dev_id,2); + tx_near_msg[MESSAGE_TYPE_IDX] = NEAR_MSG; + + dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS); //设置发送后开启接收,并设定延迟时间 + dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS); + dwt_writetxdata(12, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 + dwt_writetxfctrl(12, 0);//设置超宽带发送数据长度 + dwt_starttx(DWT_START_TX_IMMEDIATE| DWT_RESPONSE_EXPECTED); + start_poll = time32_incr; + /* We assume that the transmission is achieved correctly, poll for reception of a frame or error/timeout. See NOTE 8 below. */ + while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))//不断查询芯片状态直到成功接收或者发生错误 + { if(time32_incr - start_poll>20) + NVIC_SystemReset(); + }; + if(status_reg==0xffffffff) + { + NVIC_SystemReset(); + } + if (status_reg & SYS_STATUS_RXFCG)//如果成功接收 + { + 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数据 + { + next_nearbase_num=rx_buffer[NEARBASENUM_INDEX]; + memcpy(&rec_tagpos_binary,&rx_buffer[NEARMSG_EMPTYSLOTPOS_INDEX],4); + tagslotpos=GetRandomSlotPos(rec_tagpos_binary); + //tagslotpos=rx_buffer[TAGSLOTPOS]; + memcpy(nearbaseid_list,&rx_buffer[NEARBASEID_INDEX],next_nearbase_num*2); + tyncpoll_time=tagslotpos*slottime; + tag_state=NEARPOLL; + } + } +} void Tag_App(void)//发送模式(TAG标签) { //LED0_ON; g_Resttimer=0; - NearPoll(); + switch(tag_state) + { + case DISCPOLL: + + break; + case GETNEARMSG: + GetNearMsg(); + break; + case NEARPOLL: + NearPoll(); + break; + } + } int8_t correction_time,new_tagid=0; @@ -702,7 +745,7 @@ dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR); } } -u8 misdist_num,seize_anchor; +u8 misdist_num[TAG_NUM_IN_SYS],seize_anchor; u8 Anchor_RecNearPoll(u8 ancrec_nearbasepos) //0 mainbase 1 first near_base { tmp_time=TIM3->CNT; @@ -785,9 +828,9 @@ g_flag_Taggetdist[taglist_pos]=0; if(hex_dist>-1000&&hex_dist<100000) { - if(abs(hex_dist-his_dist[taglist_pos])<1500||misdist_num>3) + if(abs(hex_dist-his_dist[taglist_pos])<1500||misdist_num[taglist_pos]>3) { - misdist_num=0; + misdist_num[taglist_pos]=0; tagdist_list[taglist_pos] = hex_dist; his_dist[taglist_pos]=hex_dist; #ifndef USART_INTEGRATE_OUTPUT @@ -809,19 +852,20 @@ #endif }else{ // printf("%d",hex_dist); - misdist_num++; + misdist_num[taglist_pos]++; } } } - }else{ //printf("%x/n",status_reg); dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR); } - } uint32_t current_syncid=0xffffffff,synclost_timer; extern u8 flag_syncbase; +extern uint32_t tagpos_binary; +u8 tagpos_rec[50],tagpos_send[50],ancidlist_num; +u16 ancidlist_rec[20],ancidlist_send[20]; void Anchor_App(void) { @@ -841,20 +885,20 @@ if (status_reg & SYS_STATUS_RXFCG)//成功接收 { u16 tag_recv_interval; - + float temp_tagpos; dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG);//清除标志位 frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;//获得接收数据长度 dwt_readrxdata(rx_buffer, frame_len, 0);//读取接收数据 + memcpy(&anc_id_recv,&rx_buffer[ANCHOR_ID_IDX],2); //将收到的tag_id分别写入各次通讯的包中,为多标签通讯服务,防止一次通讯中接收到不同ID标签的数据 - //tag_id_recv = rx_buffer[TAG_ID_IDX]; + tag_id_recv = rx_buffer[TAG_ID_IDX]; switch(rx_buffer[MESSAGE_TYPE_IDX]) { // case POLL: // if (anchor_type == rx_buffer[ANC_TYPE_IDX]) // Anchor_RecPoll(); // break; - case SYNC: - + case SYNC: memcpy(&rec_syncid,&rx_buffer[ANCHOR_ID_IDX],4); if(rec_syncid<current_syncid) { @@ -879,25 +923,24 @@ } break; -// case NEAR_MSG: -// if(anc_id_recv==dev_id) -// { -// rx_buffer[TAGSLOTPOS]=taglist_pos; -// tx_near_msg[MESSAGE_TYPE_IDX] = NEAR_MSG; -// memcpy(&tx_near_msg[TAG_ID_IDX],&tag_id_recv,2); -// tx_near_msg[NEARBASENUM_INDEX]=g_com_map[NEARBASE_NUM]; -// memcpy(&tx_near_msg[NEARBASEID_INDEX],&g_com_map[NEARBASE_ID1],g_com_map[NEARBASE_NUM]*2); -// send_len=11+g_com_map[NEARBASE_NUM]*2+2; -// dwt_writetxdata(send_len, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 -// dwt_writetxfctrl(send_len, 0);//设置超宽带发送数据长度 -// dwt_starttx(DWT_START_TX_IMMEDIATE); -// } -// break; -// - case NEAR_POLL: - + case NEAR_MSG: + if(anc_id_recv==flag_syncbase) + { + rx_buffer[TAGSLOTPOS]=taglist_pos; + tx_near_msg[MESSAGE_TYPE_IDX] = NEAR_MSG; + memcpy(&tx_near_msg[TAG_ID_IDX],&tag_id_recv,2); + memcpy(&tx_near_msg[NEARMSG_EMPTYSLOTPOS_INDEX],&tagpos_binary,4); + tx_near_msg[NEARBASENUM_INDEX]=ancidlist_num; + memcpy(&tx_near_msg[NEARBASEID_INDEX],&ancidlist_send,ancidlist_num*2); + send_len=11+ancidlist_num*2+2; + dwt_writetxdata(send_len, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 + dwt_writetxfctrl(send_len, 0);//设置超宽带发送数据长度 + dwt_starttx(DWT_START_TX_IMMEDIATE); + } + break; + + case NEAR_POLL: memcpy(&tag_id_recv,&rx_buffer[TAG_ID_IDX],2); - memcpy(&anc_id_recv,&rx_buffer[ANCHOR_ID_IDX],2); taglist_pos=CmpTagInList(tag_id_recv); if(taglist_pos==taglist_num) { @@ -909,10 +952,16 @@ new_tagid=0; } tagofflinetime[taglist_pos]=0; - - + temp_tagpos=round((float)(sync_timer%g_com_map[COM_INTERVAL])/slottime); + tagpos_rec[(u8)temp_tagpos]=1; rec_nearbase_num=rx_buffer[NEARBASENUM_INDEX]; + if(rec_nearbase_num>ancidlist_num) + { + ancidlist_num=rec_nearbase_num; + memcpy(ancidlist_rec,&rx_buffer[NEARBASEID_INDEX],rec_nearbase_num*2); + } + for(i=0;i<rec_nearbase_num;i++) { memcpy(&tempid,&rx_buffer[NEARBASEID_INDEX+i*2],2); @@ -928,14 +977,11 @@ seize_anchor=1; //抢占anchor Anchor_RecNearPoll(i); } + - break; - - } - - } - else - { + break; + } + }else{ dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR); } } -- Gitblit v1.9.3