| | |
| | | #define RESP_RX_TO_FINAL_TX_DLY_UUS 510 |
| | | |
| | | /* Receive response timeout. See NOTE 5 below. */ |
| | | #define RESP_RX_TIMEOUT_UUS 1000 |
| | | #define RESP_RX_TIMEOUT_UUS 2500 |
| | | |
| | | #define DELAY_BETWEEN_TWO_FRAME_UUS 240 |
| | | |
| | |
| | | #define FINAL_MSG_FINAL_TX_TS_IDX 18 |
| | | #define FINAL_MSG_TS_LEN 4 |
| | | |
| | | #define STARTPOLL REGPOLL//#define SWITCHBASE_DIST |
| | | #define STARTPOLL GETNEARMSG//#define SWITCHBASE_DIST |
| | | #define SWITCHBASE_ZHUANDIAN |
| | | #define SWITCHBASE_DIST |
| | | enum enumtagstate |
| | |
| | | DISCPOLL, |
| | | GETNEARMSG, |
| | | NEARPOLL, |
| | | SINGLEPOLL, |
| | | SINGLEPOLL, |
| | | }tag_state=STARTPOLL; |
| | | static dwt_config_t config = { |
| | | 2, /* Channel number. */ |
| | | 5, /* Channel number. */ |
| | | DWT_PRF_64M, /* Pulse repetition frequency. */ |
| | | DWT_PLEN_64, /* Preamble length. */ |
| | | DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ |
| | |
| | | { |
| | | nearbase_distlist[nearmsg_i] = 0x1ffff; |
| | | } |
| | | //mainbase_id = 0x9724; |
| | | mainbase_lost_count = 0; |
| | | mainbase_id = 0x8158; |
| | | 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; |
| | |
| | | // tyncpoll_time = (tagslotpos--%max_slotpos)*slottime; |
| | | } |
| | | } |
| | | |
| | | extern u32 synctimer; |
| | | u32 target_time=100; |
| | | u8 pd_i; |
| | | u32 temptime,delaytime; |
| | | u16 delaycount; |
| | | int16_t poll_offsettime=-6900; |
| | | extern u16 slotpos_intoatl, slotpos; |
| | | void NextPollDelay(u32 anchor_time) |
| | | { |
| | | tagslotpos = 0 ; |
| | | for(pd_i=0;pd_i<tag_frequency;pd_i++) |
| | | { |
| | | slotpos_intoatl = pd_i*bigslot_num+tagslotpos; |
| | | temptime = (slotpos_intoatl*SLOTTIME_MS+100)*100; |
| | | if(anchor_time<temptime-5000) |
| | | { |
| | | delaytime = temptime-anchor_time+poll_offsettime; |
| | | return ; |
| | | } |
| | | } |
| | | temptime = (tagslotpos*SLOTTIME_MS+100+10000)*100; |
| | | delaytime = temptime-anchor_time+poll_offsettime; |
| | | return ; |
| | | } |
| | | u16 lpcount,poll_startcount; |
| | | u16 waketopolltimeus = 4000; |
| | | #define BASENUM_COMTIME 244 |
| | | u32 last_anchor_time; |
| | | void SetLPTimer(u32 anchor_time) |
| | | { |
| | | NextPollDelay(anchor_time); |
| | | current_count=HAL_LPTIM_ReadCounter(&hlptim1); |
| | | lpcount = current_count+delaytime/LPTIMER_LSB+(10-nearbase_num)*8; |
| | | poll_startcount = lpcount+(waketopolltimeus)/LPTIMER_LSB; |
| | | if(poll_startcount>=32768) |
| | | { |
| | | poll_startcount -=32768; |
| | | } |
| | | __HAL_LPTIM_COMPARE_SET(&hlptim1, lpcount); |
| | | last_anchor_time = anchor_time; |
| | | } |
| | | void NearPoll(void) |
| | | { |
| | | |
| | |
| | | uint32_t final_tx_time; |
| | | u32 start_poll; |
| | | u8 i,j,getsync_flag=0,timeout; |
| | | |
| | | // USART_putc(current_slotnum); |
| | | dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS); //设置发送后开启接收,并设定延迟时间 |
| | | dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS); |
| | |
| | | memcpy(&tx_near_msg[ANCHOR_ID_IDX],&mainbase_id,2); |
| | | dwt_writetxdata(28+6*nearbase_num, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 |
| | | dwt_writetxfctrl(28+6*nearbase_num, 0);//设置超宽带发送数据长度 |
| | | current_count=HAL_LPTIM_ReadCounter(&hlptim1); |
| | | while(current_count<poll_startcount||current_count>poll_startcount+16384) |
| | | { |
| | | current_count=HAL_LPTIM_ReadCounter(&hlptim1); |
| | | if(current_count<poll_startcount-300) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | dwt_starttx(DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED);//开启发送,发送完成后等待一段时间开启接收,等待时间在dwt_setrxaftertxdelay中设置 |
| | | |
| | | HAL_GPIO_WritePin(LED1_G_GPIO_Port, LED1_G_Pin, GPIO_PIN_SET); |
| | | // for(i=0;i<nearbase_num+1;i++) |
| | | // { |
| | | // nearbase_distlist[i] = 0x1ffff; |
| | |
| | | {sync_timer=0;} |
| | | } |
| | | ancsync_time=((sync_timer)*1000+tmp_time); |
| | | last_slotnum=current_slotnum; |
| | | current_slotnum=((float)(sync_timer*10 - tagslotpos*SLOTTIME_MS)/(SLOTTIME_MS*bigslot_num))+1; |
| | | if(current_slotnum==last_slotnum-1) |
| | | {flag_getresponse=1;} |
| | | lastsync_timer=sync_timer; |
| | | offsettimeus=ancsync_time-current_count*LPTIMER_LSB+offset; |
| | | SetNextPollTime(tagslotpos); |
| | | // last_slotnum=current_slotnum; |
| | | // current_slotnum=((float)(sync_timer*10 - tagslotpos*SLOTTIME_MS)/(SLOTTIME_MS*bigslot_num))+1; |
| | | // if(current_slotnum==last_slotnum-1) |
| | | // {flag_getresponse=1;} |
| | | // lastsync_timer=sync_timer; |
| | | // offsettimeus=ancsync_time-current_count*LPTIMER_LSB+offset; |
| | | SetLPTimer(ancsync_time); |
| | | if(result==0) |
| | | {while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))//不断查询芯片状态直到发送完成 |
| | | { };} |
| | | { };} |
| | | |
| | | break; |
| | | }else{ |
| | | |
| | |
| | | } |
| | | // dwt_write32bitreg(SYS_STATUS_ID,SYS_STATUS_RXFCG| SYS_STATUS_ALL_RX_ERR); |
| | | } |
| | | //HAL_GPIO_WritePin(LED1_G_GPIO_Port, LED1_G_Pin, GPIO_PIN_RESET); |
| | | if(flag_finalsend!=1) |
| | | {flag_finalsend = 2;} |
| | | dwt_forcetrxoff(); |
| | |
| | | }else if(mainbase_lost_count>5*tag_frequency) |
| | | { |
| | | tag_state = STARTPOLL; |
| | | } |
| | | } |
| | | if(mainbase_lost_count!=0) |
| | | {SetLPTimer(last_anchor_time);} |
| | | |
| | | if(para_update) |
| | | { |
| | |
| | | //LED0_ON; |
| | | SPIx_CS_GPIO->BRR = SPIx_CS; |
| | | delay_us(700); |
| | | GetPressAndHeight(); |
| | | intheight = Height*100; |
| | | // GetPressAndHeight(); |
| | | // intheight = Height*100; |
| | | SPIx_CS_GPIO->BSRR = SPIx_CS; |
| | | id = dwt_readdevid() ; |
| | | HAL_GPIO_WritePin(LED1_G_GPIO_Port, LED1_G_Pin, GPIO_PIN_RESET); |
| | | while (DWT_DEVICE_ID != id) |
| | | { |
| | | // Dw1000_Init(); |