From ffbabafff544caa6cf992434fdbb5e7d5bd6c0a7 Mon Sep 17 00:00:00 2001 From: zhyinch <zhyinch@gmail.com> Date: 星期一, 08 十一月 2021 18:25:33 +0800 Subject: [PATCH] 增加GGA分割 --- 源码/核心板/Src/application/dw_app.c | 143 +++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 137 insertions(+), 6 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 e1f7cd1..6c4193c 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" @@ -51,7 +51,7 @@ * frame length of approximately 2.66 ms with above configuration. */ #define RESP_RX_TO_FINAL_TX_DLY_UUS 400 /* Receive response timeout. See NOTE 5 below. */ -#define RESP_RX_TIMEOUT_UUS 600 +#define RESP_RX_TIMEOUT_UUS 9600 #define POLL_RX_TO_RESP_TX_DLY_UUS 420 /* This is the delay from the end of the frame transmission to the enable of the receiver, as programmed for the DW1000's wait for response feature. */ @@ -85,12 +85,18 @@ #define ANCTIMEUS 16 #define ANCSEND_INTERVAL 18 #define SIGNALPOWER 20 +//DATA POLL +#define CURENTPACKNUM_IDX 7 +#define TOTALPACKNUM_IDX 8 +#define DATA_IDX 10 + #define POLL 0x01 #define RESPONSE 0x02 #define FINAL 0x03 #define SYNC 0x04 - +#define DATA_POLL 0x21 +#define DATA_RESPONSE 0x22 /*------------------------------------ Variables ------------------------------------------*/ /* Default communication configuration. We use here EVK1000's default mode (mode 3). */ static dwt_config_t config = { @@ -108,7 +114,7 @@ /* Frames used in the ranging process. See NOTE 2 below. */ static uint8_t tx_poll_msg[20] = {0}; -static uint8_t tx_sync_msg[14] = {0}; +static uint8_t tx_sync_msg[140] = {0}; //static uint8_t rx_resp_msg[] = {0x41, 0x88, 0, 0xCA, 0xDE, 'V', 'E', 'W', 'A', 0x10, 0x02, 0, 0, 0, 0}; static uint8_t tx_final_msg[24] = {0}; @@ -124,7 +130,7 @@ /* Buffer to store received response message. * Its size is adjusted to longest frame that this example code is supposed to handle. */ -#define RX_BUF_LEN 24 +#define RX_BUF_LEN 224 static uint8_t rx_buffer[RX_BUF_LEN]; /* Time-stamps of frames transmission/reception, expressed in device time units. @@ -291,6 +297,7 @@ memcpy(&tx_final_msg[TAG_ID_IDX], &dev_id, 4); memcpy(&tx_resp_msg[ANCHOR_ID_IDX], &dev_id, 4); memcpy(&tx_sync_msg[ANCHOR_ID_IDX], &dev_id, 4); + memcpy(&tx_sync_msg[TAG_ID_IDX], &dev_id, 4); memcpy(&tx_resp_msg[ANCSEND_INTERVAL], &g_com_map[COM_INTERVAL], 2); } @@ -378,14 +385,15 @@ u16 checksum; int8_t tag_delaytime; extern uint16_t sync_timer; -u16 tmp_time; +u16 tmp_time; +u32 start_poll; extern float dw_vbat; extern u16 slottime,max_slotnum,current_slotpos,tyncpoll_time; void Tag_App(void)//发送模式(TAG标签) { uint32_t frame_len; uint32_t final_tx_time; - u32 start_poll; + u8 i,getsync_flag=0; u8 bat_percent; //LED0_ON; @@ -800,4 +808,127 @@ dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR); } } +u8 frame_len; +u8 rec_gpsdata[1000]; +extern u8 RTCMdata[2000]; +u16 recgpsdata_i,recdata_len; +void UWBSendOnePackData(u8* data_addr,u8 len) +{ + g_Resttimer = 0; + LED0_BLINK; + g_start_sync_flag=1; + dwt_forcetrxoff(); + dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS); //设置发送后开启接收,并设定延迟时间 + dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS); + tx_sync_msg[MESSAGE_TYPE_IDX]=DATA_POLL; + memcpy(&tx_sync_msg[DATA_IDX],data_addr,len); + dwt_writetxdata(len+14, tx_sync_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 + dwt_writetxfctrl(len+14, 0);//设置超宽带发送数据长度 + dwt_starttx(DWT_START_TX_IMMEDIATE| DWT_RESPONSE_EXPECTED); + start_poll = time32_incr; + recgpsdata_i = 0; + while(time32_incr - start_poll<100) + { + while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))//不断查询芯片状态直到成功接收或者发生错误 + { + }; + if(status_reg==0xffffffff) + { + NVIC_SystemReset(); + } + if (status_reg & SYS_STATUS_RXFCG)//如果成功接收 + { + /* Clear good RX frame event and TX frame sent in the DW1000 status register. */ + dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS);//清楚寄存器标志位 + + /* A frame has been received, read it into the local buffer. */ + frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK; //获得接收到的数据长度 + + dwt_readrxdata(rx_buffer, frame_len, 0); //读取接收数据 + + dwt_rxenable(0); + /* Check that the frame is the expected response from the companion "DS TWR responder" example. + * As the sequence number field of the frame is not relevant, it is cleared to simplify the validation of the frame. */ + + if (rx_buffer[MESSAGE_TYPE_IDX] == DATA_RESPONSE ) //判断接收到的数据是否是response数据 + { + recdata_len = frame_len-14; + memcpy(&rec_gpsdata[recgpsdata_i],&rx_buffer[DATA_IDX],recdata_len); + recgpsdata_i+=recdata_len; + if(rx_buffer[CURENTPACKNUM_IDX]==1) + { + USART_puts(rec_gpsdata,recgpsdata_i); + break; + } + } + } +} +} +extern u8 gpsdataready_flag; +extern u16 gps_packlen; +u8 totalpack_num,currentpack_num; +void RecOnePackData(void) +{ + dwt_setrxtimeout(0);//设定接收超时时间,0位没有超时时间 + + /* Activate reception immediately. */ + dwt_rxenable(0);//打开接收 + + /* Poll for reception of a frame or error/timeout. See NOTE 7 below. */ + while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))&&!g_start_send_flag&&!g_start_sync_flag)//不断查询芯片状态直到接收成功或者出现错误 + { + IdleTask(); + }; + + if (status_reg & SYS_STATUS_RXFCG)//成功接收 + { + u16 tag_recv_interval,send_i=0,remain_i=0; + /* Clear good RX frame event in the DW1000 status register. */ + dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG);//清除标志位 + + /* A frame has been received, read it into the local buffer. */ + frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;//获得接收数据长度 + g_Resttimer = 0; + dwt_readrxdata(rx_buffer, frame_len, 0);//读取接收数据 + if (rx_buffer[MESSAGE_TYPE_IDX] == DATA_POLL ) //判断接收到的数据是否是response数据 + { + recdata_len = frame_len-14; + memcpy(rec_gpsdata,&rx_buffer[DATA_IDX],recdata_len); + if(gpsdataready_flag) + { + gpsdataready_flag = 0; + tx_sync_msg[MESSAGE_TYPE_IDX]=DATA_RESPONSE; + remain_i = gps_packlen; + currentpack_num = 0; + totalpack_num = gps_packlen/110; + while(remain_i>0) + { + if(remain_i>=110) + { + tx_sync_msg[CURENTPACKNUM_IDX] = 0; + memcpy(&tx_sync_msg[DATA_IDX],&RTCMdata[send_i],110); + send_i+=110; + remain_i-=110; + dwt_writetxdata(110+14, tx_sync_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 + dwt_writetxfctrl(110+14, 0);//设置超宽带发送数据长度 + dwt_starttx(DWT_START_TX_IMMEDIATE); + }else{ + tx_sync_msg[CURENTPACKNUM_IDX] = 1; + memcpy(&tx_sync_msg[DATA_IDX],&RTCMdata[send_i],remain_i); + dwt_writetxdata(remain_i+14, tx_sync_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 + dwt_writetxfctrl(remain_i+14, 0);//设置超宽带发送数据长度 + dwt_starttx(DWT_START_TX_IMMEDIATE); + remain_i = 0; + } + delay_us(1000); + } + } + LED0_BLINK; + USART_puts(rec_gpsdata,recdata_len); + } + }else{ + dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR); + } + +} \ No newline at end of file -- Gitblit v1.9.3