zhyinch
2021-10-22 2eeb6bd4fbcb8fc684f022f411b49bffb45671f1
Src/application/dw_app.c
@@ -50,7 +50,7 @@
#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
@@ -69,7 +69,7 @@
#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
@@ -81,7 +81,7 @@
    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. */
@@ -633,7 +633,8 @@
    {
        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;
@@ -680,32 +681,41 @@
u8 pd_i;
u32 temptime,delaytime;
u16 delaycount;
int16_t poll_offsettime=-6900;
extern u16 slotpos_intoatl, slotpos;
void NextPollDelay(u32 anchor_time)
{
    for(pd_i=0;pd_i<=tag_frequency;pd_i++)
      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-10000)
        if(anchor_time<temptime-5000)
        { 
            delaytime = temptime-anchor_time;
            delaytime = temptime-anchor_time+poll_offsettime;
            return ;
        }
    }
    temptime = (tagslotpos*SLOTTIME_MS+100+10000)*100;
    delaytime = temptime-anchor_time;
    delaytime = temptime-anchor_time+poll_offsettime;
   return ;
}
u16 lpcount;
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;
    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)
{
@@ -715,6 +725,7 @@
   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);      
@@ -749,8 +760,17 @@
   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;
@@ -848,16 +868,17 @@
                                 {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;
//                           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{
                           
@@ -893,6 +914,7 @@
                  }         
               //   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();
@@ -917,6 +939,8 @@
         {
            tag_state = STARTPOLL;
         }         
         if(mainbase_lost_count!=0)
         {SetLPTimer(last_anchor_time);}
         if(para_update)
         {
@@ -1045,10 +1069,11 @@
   //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();