From 387d1ffc16ce9e050403baee0ed07f3d9accf632 Mon Sep 17 00:00:00 2001 From: chen <15335560115@163.com> Date: 星期五, 04 七月 2025 14:55:15 +0800 Subject: [PATCH] 初步移植完成0.6.8SDK,但发送有len太长未找到原因 --- keil/uwb_tag_.c | 440 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 420 insertions(+), 20 deletions(-) diff --git a/keil/uwb_tag_.c b/keil/uwb_tag_.c index 1631483..6f31235 100644 --- a/keil/uwb_tag_.c +++ b/keil/uwb_tag_.c @@ -2,13 +2,16 @@ #include "mk_uwb.h" #include "mk_phy.h" #include "mk_misc.h" +#include "mk_wdt.h" #include "mk_power.h" #include "mk_sleep_timer.h" #include "lib_ranging.h" #include "dw_app.h" #include "board.h" #include "mk_calib.h" - +#include "stdlib.h" +#include "mk_flash.h" +#include "global_param.h" #if defined(MK_SS_TWR_DW_INIT) extern int TagRange(void); @@ -48,11 +51,12 @@ }; uint32_t dev_id; uint8_t group_id; + #ifdef DW1000 /* Default communication configuration. */ -static struct mk_uwb_configure config = {//yuan + struct mk_uwb_configure config = {//yuan .phy_work_mode = (uint8_t)(PHY_TX | PHY_RX), - .phy_cfg.ch_num = 5, /* Channel number. */ + .phy_cfg.ch_num = UWB_CH_NUM, /* Channel number. */ .phy_cfg.code_index = 9, /* TRX preamble code */ .phy_cfg.mean_prf = MEAN_PRF_64M, /* Mean prf 64/128/256M */ .phy_cfg.data_bit_rate = DATA_BR_6M8, /* Data rate 6.8M */ @@ -63,7 +67,9 @@ .phy_cfg.sts_pkt_cfg = STS_PKT_CFG_0, /* SP0 Frame */ .phy_cfg.sts_segnum = STS_SEGNUM_BPRF_1, /* Number of STS segments in the frame */ .phy_cfg.sts_seglen = STS_SEGLEN_BPRF_64, /* Number of symbols in an STS segment */ - .phy_cfg.rx_ant_id = UWB_RX_ANT_3, /* UWB RX antenna port */ + .phy_cfg.rx_main_ant = UWB_RX_ANT_3, /* UWB RX main antenna port */ + .phy_cfg.rx_ant_mode = RX_ANT_PORTS_COMBINATION, /* UWB RX antenna mode */ + .phy_cfg.pulse_shape = 0x2, /* 0x0: CCC pulse, 0x2: FiRa pulse */ }; #elif defined STS_MODE static struct mk_uwb_configure config = { @@ -79,7 +85,38 @@ .phy_cfg.sts_pkt_cfg = STS_PKT_CFG_1, /* SP1 Frame */ .phy_cfg.sts_segnum = STS_SEGNUM_BPRF_1, /* Number of STS segments in the frame */ .phy_cfg.sts_seglen = STS_SEGLEN_BPRF_64, /* Number of symbols in an STS segment */ - .phy_cfg.rx_ant_id = UWB_RX_ANT_3, /* UWB RX antenna port */ + .phy_cfg.rx_main_ant = UWB_RX_ANT_3, /* UWB RX main antenna port */ + .phy_cfg.rx_ant_mode = RX_ANT_PORTS_COMBINATION, /* UWB RX antenna mode */ + .phy_cfg.pulse_shape = 0x2, /* 0x0: CCC pulse, 0x2: FiRa pulse */ +}; +/* Use the default key and IV specified in the IEEE 802.15.4z attachment */ +static struct UWB_STS_KEY_CONFIG_T sts_iv_key = { + .sts_vcounter = 0x1F9A3DE4, + .sts_vupper0 = 0xD37EC3CA, + .sts_vupper1 = 0xC44FA8FB, + .sts_vupper2 = 0x362EEB34, + .sts_key0 = 0x14EB220F, + .sts_key1 = 0xF86050A8, + .sts_key2 = 0xD1D336AA, + .sts_key3 = 0x14148674, +}; +#elif defined STS_MODE_SQUARE + struct mk_uwb_configure config = { + .phy_work_mode = (uint8_t)(PHY_TX | PHY_RX), + .phy_cfg.ch_num = 9, /* Channel number. */ + .phy_cfg.code_index = 9, /* TRX preamble code */ + .phy_cfg.mean_prf = MEAN_PRF_64M, /* Mean prf 64/128/256M */ + .phy_cfg.data_bit_rate = DATA_BR_6M8, /* Data rate 6.8M */ + .phy_cfg.sync_sym = PREAM_LEN_128, /* Preamble duration, length of preamble 128 */ + .phy_cfg.sfd_sym = BPRF_NSFD2_8, /* Identifier for SFD sequence */ + .phy_cfg.ranging_bit = 1, /* ranging bit set 1 */ + .phy_cfg.trx_mode = TRX_MODE_15_4Z_BPRF, /* IEEE802.15.4z - BPRF mode */ + .phy_cfg.sts_pkt_cfg = STS_PKT_CFG_1, /* SP1 Frame */ + .phy_cfg.sts_segnum = STS_SEGNUM_BPRF_1, /* Number of STS segments in the frame */ + .phy_cfg.sts_seglen = STS_SEGLEN_BPRF_64, /* Number of symbols in an STS segment */ + .phy_cfg.rx_main_ant = UWB_RX_ANT_3, /* UWB RX main antenna port */ + .phy_cfg.rx_ant_mode = RX_ANT_PORTS_COMBINATION, /* UWB RX antenna mode */ + .phy_cfg.pulse_shape = 0x2, /* 0x0: CCC pulse, 0x2: FiRa pulse */ }; /* Use the default key and IV specified in the IEEE 802.15.4z attachment */ static struct UWB_STS_KEY_CONFIG_T sts_iv_key = { @@ -107,7 +144,9 @@ .phy_cfg.sts_pkt_cfg = STS_PKT_CFG_0, /* SP0 Frame */ .phy_cfg.sts_segnum = STS_SEGNUM_BPRF_1, /* Number of STS segments in the frame */ .phy_cfg.sts_seglen = STS_SEGLEN_BPRF_64, /* Number of symbols in an STS segment */ - .phy_cfg.rx_ant_id = UWB_RX_ANT_3, /* UWB RX antenna port */ + .phy_cfg.rx_main_ant = UWB_RX_ANT_3, /* UWB RX main antenna port */ + .phy_cfg.rx_ant_mode = RX_ANT_PORTS_COMBINATION, /* UWB RX antenna mode */ + .phy_cfg.pulse_shape = 0x2, /* 0x0: CCC pulse, 0x2: FiRa pulse */ }; #endif ///* Default communication configuration. */ @@ -124,7 +163,9 @@ // .phy_cfg.sts_pkt_cfg = STS_PKT_CFG_0, /* SP0 Frame */ // .phy_cfg.sts_segnum = STS_SEGNUM_BPRF_1, /* Number of STS segments in the frame */ // .phy_cfg.sts_seglen = STS_SEGLEN_BPRF_64, /* Number of symbols in an STS segment */ -// .phy_cfg.rx_ant_id = UWB_RX_ANT_3, /* UWB RX antenna port */ +// .phy_cfg.rx_main_ant = UWB_RX_ANT_3, /* UWB RX main antenna port */ +// .phy_cfg.rx_ant_mode = RX_ANT_PORTS_COMBINATION, /* UWB RX antenna mode */ +// .phy_cfg.pulse_shape = 0x2, /* 0x0: CCC pulse, 0x2: FiRa pulse */ //}; /* Buffer to store received frame */ static uint8_t rx_buf[150]; @@ -188,7 +229,9 @@ int32_t freq_offset,freq_offset_filter; int temp_flag,poll_tx_num,resp_rx_num; extern double distance; +extern uint8_t bat_percent; uint32_t count1,count2; +extern uint32_t reboot_num; enum SIMPLE_FSM_T { SIMPLE_IDLE = 0, @@ -208,15 +251,17 @@ { tag_num_tosend = SEND_GROUP_MAX_NUM; } + memcpy(&uwb_sendbuffer[7],&g_com_map[VERSION],2); uwb_sendbuffer[GROUP_ID_IDX] = group_id; memcpy(&uwb_sendbuffer[TAG_ID_IDX],&dev_id,2); - //uwb_sendbuffer[BATTARY_IDX] = bat_percent; + uwb_sendbuffer[BATTARY_IDX] = bat_percent; uwb_sendbuffer[SEQUENCE_IDX] = frame_seq_nb++; uwb_sendbuffer[NEARBASENUM_INDEX] = tag_num_tosend; memcpy(&uwb_sendbuffer[NEARBASEID_INDEX],&taglist_id[taglist_current_index],tag_num_tosend*2);//基站id memcpy(&uwb_sendbuffer[NEARBASEID_INDEX+tag_num_tosend*2],&taglist_dist[taglist_current_index],tag_num_tosend*2); uwb_sendbuffer[MESSAGE_TYPE_IDX] = MBX_POLL; memcpy(&uwb_sendbuffer[ANCHOR_ID_IDX],&mainbase_id,2); + } static enum SIMPLE_FSM_T state = SIMPLE_IDLE; @@ -232,7 +277,7 @@ int64_t tx_timestamp = ranging_tx_time(timestamp); // correct antenna delay (TX using the same antenna as RX) - tx_timestamp += ranging_ant_delays_get(config.phy_cfg.rx_ant_id) / 2; + tx_timestamp += ranging_ant_delays_get(config.phy_cfg.rx_main_ant) / 2; return tx_timestamp; } @@ -248,7 +293,7 @@ int64_t rx_timestamp = ranging_rx_time(ind); // correct antenna delay - rx_timestamp -= ranging_ant_delays_get(config.phy_cfg.rx_ant_id) / 2; + rx_timestamp -= ranging_ant_delays_get(config.phy_cfg.rx_main_ant) / 2; return rx_timestamp; } @@ -482,13 +527,146 @@ #if (defined STS_MODE) || (defined MK_MODE) ranging_lib_init(); #endif - ranging_frame_type_set(config.phy_cfg.sts_pkt_cfg); + //ranging_frame_type_set(config.phy_cfg.sts_pkt_cfg); +ranging_lib_init(config.phy_cfg.sts_pkt_cfg, CE_AUX_CH_PWR_NLOS_FOM); +} +void Anchor_uwb_aoa_square_init(void) +{ + // Set calibration parameters + uwb_calibration_params_set(config.phy_cfg.ch_num); + + // set advanced parameters + struct PHY_ADV_CONFIG_T adv_config = + { + .thres_fap_detect = 40, + .nth_scale_factor = 1, + .ranging_performance_mode = 0, +#if RX_ANT_PORTS_NUM == 4 + .skip_weakest_port_en = 1, +#else + .skip_weakest_port_en = 0, +#endif + }; + phy_adv_params_configure(&adv_config); + + // uwb configure + uwb_configure(config.phy_work_mode, board_param.tx_power_fcc[CALIB_CH(config.phy_cfg.ch_num)], &config.phy_cfg); + + ranging_lib_init(config.phy_cfg.sts_pkt_cfg, CE_AUX_CH_PWR_NLOS_FOM); + + // Register rx interrupt callback function + mac_register_process_handler(tx_int_callback, rx_int_callback); + + // Reduce inter frame spacing (IFS) for non encrypted packets + mac_ifs_set(0, 0); + + sts_param_config(config.phy_cfg.sts_pkt_cfg, STS_AUX_ANT_IQ_RSSI, STS_BUF_NUM, STS_BUF_SIZE); + + // Set STS key and IV + phy_sts_key_configure(&sts_iv_key); + + phy_rx_sts_switch_mode_set(config.phy_cfg.sts_pkt_cfg, STS_NEVER_SWITCH, 0, 0); } int sleep_time_step=SLEEP_COUNT; +int rand_temp; +static uint16_t source_id; +uint8_t rec_index,rec_secdelay; +uint16_t rec_value; +uint8_t readgcom_flag; +uint16_t wg_report_id; +uint16_t rec_wenjian_daxiao; +uint16_t wangguan_up_id; +uint8_t shengji_flag,time=5; +uint8_t LoraUp_flag; +extern uint16_t final_bag_num; +uint16_t checksum1; +void Uwb_Update(void) +{ + + checksum1=Checksum_u16(rx_buf,rx_length-2); + if(!memcmp(&checksum1,&rx_buf[rx_length-2],2)) + if(!memcmp(&dev_id,&rx_buf[DEST_ID_IDX],2)) + { + memcpy(&source_id,&rx_buf[SOURCE_ID_IDX],2); +// if(wg_state==WG_Lost) +// { +// wg_state = WG_Connected; + wg_report_id = source_id; +// } +// if(!memcmp(&wg_report_id,&rx_buf[SOURCE_ID_IDX],2)) +// { +// wg_lost_count = 0; +// loraled=GREEN; + switch(rx_buf[PWTAG_RW_FLAG_IDX]) + { + case WGRSP_RWTAG_READ: + readgcom_flag = 1; +// LoraSendComMap(WGRSP_RWTAG_READ); + break; + case WGRSP_RWTAG_WRITE: + rec_index = rx_buf[PWTAG_WRITE_IDX_IDX]; + if(rec_index<=DEV_ID) + {break;} + memcpy(&rec_value,&rx_buf[PWTAG_WRITE_VALUE_IDX],2); + if(g_com_map[rec_index/2]==rec_value) + {break;} + g_com_map[rec_index/2] = rec_value; + save_com_map_to_flash(); + delay_us(60000); + NVIC_SystemReset(); + break; + case WGRSP_RWTAG_UPDATE: + rec_index = rx_buf[PWTAG_WRITE_IDX_IDX]; + switch(rec_index) + { + case 0xaa: //升级下发 + memcpy(&rec_wenjian_daxiao,&rx_buf[11],2);//文件大小 + if(rec_wenjian_daxiao>APP_SIZE||rec_wenjian_daxiao==0) + {}//文件过大,超出范围 + else + { + final_bag_num=(rec_wenjian_daxiao/ONE_BAG_DAXIAO)+1; + memcpy(&wangguan_up_id,&rx_buf[SOURCE_ID_IDX],2);//网关ID 占用2个字节 + shengji_flag=1; + LoraUp_flag=1; + LOG_INFO(TRACE_MODULE_APP, "进入升级模式,接收文件大小%d\r\n",rec_wenjian_daxiao); + } + break; + } + break; + } +// } + } +} int TagRange(void) { - phy_timer_open(1, IRQ_PRIORITY_HIGH); + if(readgcom_flag) + { + readgcom_flag=0; + phy_timer_open(1, IRQ_PRIORITY_HIGH); + mac_register_process_handler(tx_int_callback, rx_int_callback); + uint8_t data_length = 0x50; + uint16_t checksum = 0; + uwb_sendbuffer[MSG_TYPE_IDX] = LORA_MSGTYPE_READPARARESP; + uwb_sendbuffer[MSG_LENGTH] = data_length+11; + memcpy(&uwb_sendbuffer[SOURCE_ID_IDX],&g_com_map[DEV_ID],2); + memcpy(&uwb_sendbuffer[DEST_ID_IDX],&wg_report_id,2); + uwb_sendbuffer[RP_CMD_IDX] = WGRSP_RWTAG_READ; + uwb_sendbuffer[RP_INDEX_IDX] = 2; + uwb_sendbuffer[RP_LEN_IDX] = data_length; + memcpy(&uwb_sendbuffer[9], &g_com_map[1], data_length); + checksum = Checksum_u16(uwb_sendbuffer,11+data_length); + memcpy(&uwb_sendbuffer[11+data_length],&checksum,2); +// Radio.Send(uwb_sendbuffer,data_length+13); + // Delay_Ms(100); + poll_tx_en_start_u32 = phy_timer_count_get()+US_TO_PHY_TIMER_COUNT(POLL_DELAY);//发送必须要延时发送才可以用于测距否则立即发送会获取时间戳不对,需要计算程序运行时间,避免设置过去时间 + tempflag=uwb_tx(uwb_sendbuffer,data_length+13,1,poll_tx_en_start_u32);//立即发送 + poll_tx_ts_i64 = ranging_tx_time_correct(poll_tx_en_start_u32 + phy_shr_duration());//修正时间戳 + temp_count1=phy_timer_count_get(); + while(mac_is_busy());//等待发送完成 + }else{ + phy_timer_open(1, IRQ_PRIORITY_HIGH); // Register rx interrupt callback function mac_register_process_handler(tx_int_callback, rx_int_callback); //taglist_total_num=50;//测试 @@ -496,7 +674,8 @@ uwb_poll_buffer_construct(); temp_tag_num=0;//临时数量为0 poll_tx_en_start_u32 = phy_timer_count_get()+US_TO_PHY_TIMER_COUNT(POLL_DELAY);//发送必须要延时发送才可以用于测距否则立即发送会获取时间戳不对,需要计算程序运行时间,避免设置过去时间 - tempflag=uwb_tx(uwb_sendbuffer,13+4*tag_num_tosend,1,poll_tx_en_start_u32);//立即发送 + //tempflag=uwb_tx(uwb_sendbuffer,13+4*tag_num_tosend,1,poll_tx_en_start_u32);//立即发送 + tempflag=uwb_tx(uwb_sendbuffer,sizeof(uwb_sendbuffer),1,poll_tx_en_start_u32);//立即发送 #ifdef BOXING gpio_pin_set(IO_PIN_5);//测试 #endif @@ -544,10 +723,16 @@ if(receive_flag==1)//成功接收数据 { receive_flag=0; - //tempflag=uwb_rx(0, 0, RESP_RX_TIMEOUT_US);//立即开启接受并设置0超时 + phy_update_sts_iv_counter(0x01, 0x00);//新增sts + tempflag=uwb_rx(0, 0, RESP_RX_TIMEOUT_US);//立即开启接受并设置0超时 //接收成功则判断是否为同一组 - if (rx_buf[MESSAGE_TYPE_IDX] == MBX_RESPONSE&&!memcmp(&rx_buf[TAG_ID_IDX],&dev_id,2)&&rx_buf[GROUP_ID_IDX]==group_id) //判断接收到的数据是否是response数据 + if(rx_buf[MESSAGE_TYPE_IDX] == MBX_POLL)//收到是其他的基站的POLL包 + { + rand_temp=rand()%10; + sleep_timer_start(__MS_TO_32K_CNT(SLEEP_COUNT-rand_temp));//测试 + }else if (rx_buf[MESSAGE_TYPE_IDX] == MBX_RESPONSE&&!memcmp(&rx_buf[TAG_ID_IDX],&dev_id,2)&&rx_buf[GROUP_ID_IDX]==group_id) //判断接收到的数据是否是response数据 { + reboot_num=0;//清0复位监测数值 memcpy(&rec_nearbaseid,&rx_buf[ANCHOR_ID_IDX],2); rec_tag_index = CmpTagInList(rec_nearbaseid);//当前新来的这包数据插入当前表中的位置索引 //rec_nearbasepos=FindNearBasePos(rec_nearbaseid); @@ -564,11 +749,13 @@ memset(rx_buf, 0, sizeof(rx_buf));//清空接收到的用完的数组 rx_length=0;//清0长度 - uwb_rx(0, 0, RESP_RX_TIMEOUT_US);//立即开启接受并设置0超时 + //uwb_rx(0, 0, RESP_RX_TIMEOUT_US);//立即开启接受并设置0超时 // while(mac_is_busy()); //break;//成功接收就退出 - } - + }else if(rx_buf[MSG_TYPE_IDX]==LORA_MSGTYPE_WGRESPTAG){ + Uwb_Update(); + } + // #ifdef BOXING // gpio_pin_clr(IO_PIN_5);//测试 // #endif @@ -586,6 +773,7 @@ gpio_pin_clr(IO_PIN_5);//测试 gpio_pin_set(IO_PIN_5);//测试 #endif + phy_update_sts_iv_counter(0x00, sts_iv_key.sts_vcounter);//sts } // } #ifdef BOXING @@ -595,12 +783,224 @@ uwb_rx_force_off(1); //dwt_forecetrxoff(); CalculateDists(poll_tx_ts_i64); //计算距离并更新距离表 - LOG_INFO(TRACE_MODULE_APP,"现存测距数 %d id1:%04x id2:%04x .\r\n",taglist_total_num,taglist_id[0],taglist_id[1]); + + //Calculate_battery_percent(); + + //LOG_INFO(TRACE_MODULE_APP,"现存测距数 %d id1:%04x dist:%d .\r\n",taglist_total_num,taglist_id[0],(int16_t)taglist_dist[0]); //AnchorListUpdate();//更新存活基站列表 TagListUpdate(); taglist_current_index+=tag_num_tosend; if(taglist_current_index>=taglist_total_num||taglist_total_num<=SEND_GROUP_MAX_NUM) //如果标签当前index大于总index,或者总基站数量小于等于25,则从0开始index。一个是已经发完一轮了,一个是不够最大发送数 taglist_current_index = 0; //Rank_ANchor_list_by_dis();//冒泡排序重新按距离重新排列基站列表最小距离存货基站放到最前面 + } } -#endif \ No newline at end of file +#endif +uint16_t UpdateCRC16(uint16_t crcIn, uint8_t byte) +{ + uint32_t crc = crcIn; + uint32_t in = byte|0x100; + + do + { + crc <<= 1; + in <<= 1; + + if(in&0x100) + { + ++crc; + } + + if(crc&0x10000) + { + crc ^= 0x1021; + } + } while(!(in&0x10000)); + + return (crc&0xffffu); +} + +/** + * @brief Cal CRC16 for YModem Packet + * @param data + * @param length + * @retval CRC value + */ +uint16_t Cal_CRC16(const uint8_t* data, uint32_t size) +{ + uint32_t crc = 0; + const uint8_t* dataEnd = data+size; + + while(data<dataEnd) + { + crc = UpdateCRC16(crc,*data++); + } + crc = UpdateCRC16(crc,0); + crc = UpdateCRC16(crc,0); + + return (crc&0xffffu); +} +//void delay_ms(uint32_t nTimer) +//{ +// uint32_t i=1000*nTimer; +// delay_us(i); +//} +uint8_t send_lora_data[250]; +uint16_t muqiandeshengjibao; +static uint16_t current_count1,target_count1,end_count1,start_count1; +uint8_t huifushengjibaoerror_num; +uint16_t final_bag_num; +uint16_t testflag; +uint32_t Zhongjian_data[60]; +uint8_t shengji_flag; +uint16_t wangguan_up_id; +uint8_t huifushengjibao_flag; +uint8_t LoraUp_flag; +uint16_t rec_wenjian_daxiao; +uint8_t lora_up_rec_flag; +uint16_t flash_shuju; +static uint32_t status_reg; +static uint32_t frame_len; +void LoraUp_Poll(void) +{ uint16_t result ; + uint16_t crc16; + uint8_t jindu; + if(shengji_flag) + { + uwb_rx_force_off(1); + Tag_uwb_init(); + phy_timer_open(1, IRQ_PRIORITY_HIGH); + mac_register_process_handler(tx_int_callback, rx_int_callback); + + send_lora_data[MSG_TYPE_IDX]=LORA_MSGTYPE_UPDATE_CONFIRM; + memcpy(&send_lora_data[SOURCE_ID_IDX],&dev_id,2);//网关ID 占用2个字节 + memcpy(&send_lora_data[DEST_ID_IDX],&wangguan_up_id,2);//标签或者基站的设备ID 2个字节 +// send_lora_data[MUQIAN_BAG]=0xFF; + crc16=Checksum_u16(send_lora_data,6); + memcpy(&send_lora_data[6],&crc16,2); + huifushengjibao_flag=0; + LoraUp_flag=1; + + poll_tx_en_start_u32 = phy_timer_count_get()+US_TO_PHY_TIMER_COUNT(POLL_DELAY);//发送必须要延时发送才可以用于测距否则立即发送会获取时间戳不对,需要计算程序运行时间,避免设置过去时间 + tempflag=uwb_tx(send_lora_data,8+2,1,poll_tx_en_start_u32);//立即发送 + poll_tx_ts_i64 = ranging_tx_time_correct(poll_tx_en_start_u32 + phy_shr_duration());//修正时间戳 + temp_count1=phy_timer_count_get(); + while(mac_is_busy());//等待发送完成 + + __disable_irq(); + result=flash_open(FLASH_ID0,NULL); + flash_read(FLASH_ID0, APP2_ADRESS, (uint8_t*)&flash_shuju, 2); + if(flash_shuju!=0xffff/*&&flash_shuju!=0x0000*/) + { + while(1) + { + flash_erase(FLASH_ID0,APP2_ADRESS,APP_SIZE); + delay_ms(500); + flash_read(FLASH_ID0, APP2_ADRESS, (uint8_t*)&flash_shuju, 2); + if(flash_shuju==0xffff/*&&flash_shuju!=0x0000*/) + {break;} + } + } + __enable_irq(); + while(1) + { + uwb_rx_force_off(1); + send_lora_data[MSG_TYPE_IDX]=LORA_MSGTYPE_UPDATEFILE_REQUEST; + memcpy(&send_lora_data[SOURCE_ID_IDX],&dev_id,2);//网关ID 占用2个字节 + memcpy(&send_lora_data[DEST_ID_IDX],&wangguan_up_id,2);//标签或者基站的设备ID 2个字节 +// send_lora_data[MUQIAN_BAG]=muqiandeshengjibao; + memcpy(&send_lora_data[MUQIAN_BAG],&muqiandeshengjibao,2); + crc16=Checksum_u16(send_lora_data,8); + memcpy(&send_lora_data[8],&crc16,2); + lora_up_rec_flag=0; +// LOG_INFO(TRACE_MODULE_APP, "正在请求第%d包\r\n",muqiandeshengjibao); + jindu=(muqiandeshengjibao*100)/final_bag_num; + LOG_INFO(TRACE_MODULE_APP, "升级进度%d\r\n",jindu); + wdt_ping(WDT_ID0);//喂狗 + poll_tx_en_start_u32 = phy_timer_count_get()+US_TO_PHY_TIMER_COUNT(POLL_DELAY);//发送必须要延时发送才可以用于测距否则立即发送会获取时间戳不对,需要计算程序运行时间,避免设置过去时间 + tempflag=uwb_tx(send_lora_data,10+2,1,poll_tx_en_start_u32);//立即发送 + poll_tx_ts_i64 = ranging_tx_time_correct(poll_tx_en_start_u32 + phy_shr_duration());//修正时间戳 + temp_count1=phy_timer_count_get(); + while(mac_is_busy());//等待发送完成 + temp_count2=phy_timer_count_get(); + resp_rx_en_start_u32 = poll_tx_en_start_u32+ US_TO_PHY_TIMER_COUNT(POLL_TX_TO_RESP_RX_DLY_US);//设置发送多少s后接收按target独立时间起点算+ US_TO_PHY_TIMER_COUNT(POLL_TX_TO_RESP_RX_DLY_US为发送后要多久开启接收时间 + temp_resp=resp_rx_en_start_u32; + tempflag=uwb_rx(0,0, 50000); + + while(mac_is_busy()) + {} + if(receive_flag==1)//成功接收数据 + { uint16_t result12; + + __disable_irq(); + crc16=Cal_CRC16(rx_buf,DATA_IDX+ONE_BAG_DAXIAO); + + if(!memcmp(&muqiandeshengjibao,&rx_buf[MUQIAN_BAG],2)&&!memcmp(&crc16,&rx_buf[DATA_IDX+ONE_BAG_DAXIAO],2)&&!memcmp(&dev_id,&rx_buf[DEST_ID_IDX],2)&& !memcmp(&wangguan_up_id,&rx_buf[SOURCE_ID_IDX],2)) + { + result=flash_open(FLASH_ID0,NULL); + memcpy(Zhongjian_data,&rx_buf[DATA_IDX],ONE_BAG_DAXIAO); + result12=flash_write_nbytes(FLASH_ID0, APP2_ADRESS+ONE_BAG_DAXIAO*muqiandeshengjibao, (uint8_t*)Zhongjian_data, ONE_BAG_DAXIAO); + while(!result12==0) + { + result12=flash_write_nbytes(FLASH_ID0, APP2_ADRESS+ONE_BAG_DAXIAO*muqiandeshengjibao, (uint8_t*)Zhongjian_data, ONE_BAG_DAXIAO); + delay_ms(10); + } + if(result12==0) + { +// if(muqiandeshengjibao==650) +// { +// delay_ms(10); +// } + muqiandeshengjibao++; + huifushengjibaoerror_num=0; + delay_ms(10); + } + } + __enable_irq(); + } + else + { + delay_ms(500); + huifushengjibaoerror_num++; + if(huifushengjibaoerror_num>=20) + { + huifushengjibaoerror_num=0; + muqiandeshengjibao=0; + delay_ms(500); + NVIC_SystemReset(); + break; + } + uwb_rx_force_off(1); + } + if(muqiandeshengjibao==final_bag_num) + { + send_lora_data[MSG_TYPE_IDX]=0x99; + memcpy(&send_lora_data[SOURCE_ID_IDX],&dev_id,2);//网关ID 占用2个字节 + memcpy(&send_lora_data[DEST_ID_IDX],&wangguan_up_id,2);//标签或者基站的设备ID 2个字节 + crc16=Checksum_u16(send_lora_data,6); + memcpy(&send_lora_data[6],&crc16,2); + huifushengjibao_flag=0; + LoraUp_flag=1; + LOG_INFO(TRACE_MODULE_APP, "正在发送最后一包\r\n"); + poll_tx_en_start_u32 = phy_timer_count_get()+US_TO_PHY_TIMER_COUNT(POLL_DELAY);//发送必须要延时发送才可以用于测距否则立即发送会获取时间戳不对,需要计算程序运行时间,避免设置过去时间 + tempflag=uwb_tx(send_lora_data,8+2,1,poll_tx_en_start_u32);//立即发送 + poll_tx_ts_i64 = ranging_tx_time_correct(poll_tx_en_start_u32 + phy_shr_duration());//修正时间戳 + temp_count1=phy_timer_count_get(); + while(mac_is_busy());//等待发送完成 + + uint16_t tmp11 ,result11; + tmp11=0XDDDD; + result=flash_open(FLASH_ID0,NULL); + result11=flash_erase(FLASH_ID0,APP_1OR2_ADRESS,0x1000); + if(result11==0) + flash_write_nbytes(FLASH_ID0, APP_1OR2_ADRESS, (uint8_t*)&tmp11, 2); + __disable_irq(); + delay_ms(500); + NVIC_SystemReset(); + } + } + uwb_rx_force_off(1); + } +} + + -- Gitblit v1.9.3