From ae079c1fc5d990ba55714d4b3a51b19f96edaec4 Mon Sep 17 00:00:00 2001 From: WXK <287788329@qq.com> Date: 星期四, 24 四月 2025 16:01:43 +0800 Subject: [PATCH] 改为中断来低电平触发发送当前扫描数据,3s内扫描不到的会退出,串口来55 AA 75 70 64 61 74 65,进入升级模式 --- 01_SDK/modules/hal/panchip/panplat/pan1070/bsp/radio/src/pan_prf_glue.c | 281 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 232 insertions(+), 49 deletions(-) diff --git a/01_SDK/modules/hal/panchip/panplat/pan1070/bsp/radio/src/pan_prf_glue.c b/01_SDK/modules/hal/panchip/panplat/pan1070/bsp/radio/src/pan_prf_glue.c index 577070c..8d72e68 100644 --- a/01_SDK/modules/hal/panchip/panplat/pan1070/bsp/radio/src/pan_prf_glue.c +++ b/01_SDK/modules/hal/panchip/panplat/pan1070/bsp/radio/src/pan_prf_glue.c @@ -55,6 +55,12 @@ #define NRF_RX_TO_TX_TIME (110) #define NRF_TX_TO_RX_TIME (110) +#define PHY_MODED_DEFAULT (0) +#define PHY_MODED_AGC_0X0F (1) +#define PHY_MODED_FORCE_GAIN_0X0F (2) + +#define PHY_CFG_MODE PHY_MODED_DEFAULT + #define REG_WRITE_BITS(reg, mask, value) (reg) = (((reg) & ~(mask)) | (value)) #define __nop() __asm("nop") @@ -71,6 +77,7 @@ uint8_t prf_init_flag = 0; int8_t prf_rssi = 0; static uint8_t buck_vout_trim = 0xff; +static uint32_t raw_phy_config_data[7] = {0xffffffff, }; __ramfunc void panchip_prf_isr_proc(void) { @@ -86,20 +93,8 @@ normal_m1 = (uint8_t)((PRI_RF->R04_RX_CTL & R04_RX_CTL_NORMAL_M1_Msk) >> R04_RX_CTL_NORMAL_M1_Pos); noack = PRI_RF_IsTxNoAckEn(PRI_RF); - if (PRI_RF_IntFlag(PRI_RF, R01_INT_TX_IRQ_Msk)) { - if (((((enhc == 0) && (normal_m1 == 0)) || ((enhc == 1) && noack)) && !ptxprx) || ptxprx) { - while (!(PRI_RF->R01_INT & R01_INT_TX_DONE_IRQ_FLAG_Msk)) { - } /* wait rx done */ - PHY_strt_stp(LLHWC_PHY_STOP); - PRI_RF_SetTrxRamReady(PRI_RF, PRI_RF_MODE_SEL_TRX, 0); - } - - if (isr_cb.tx_cb != NULL) { - (*isr_cb.tx_cb)(); - } - } - - if (PRI_RF_IntFlag(PRI_RF, R01_INT_TX_TIMEOUT_IRQ_Msk)) { + if ((PRI_RF_IntFlag(PRI_RF, R01_INT_TX_TIMEOUT_IRQ_Msk)) && + ((PRI_RF->R01_INT & R01_INT_TX_TIMEOUT_IRQ_MASK_Msk)?(false):(true))) { while (!(PRI_RF->R01_INT & R01_INT_RX_DONE_IRQ_FLAG_Msk)) { } /* wait rx done */ PHY_strt_stp(LLHWC_PHY_STOP); @@ -110,7 +105,8 @@ } } - if (PRI_RF_IntFlag(PRI_RF, R01_INT_RX_IRQ_Msk)) { + if ((PRI_RF_IntFlag(PRI_RF, R01_INT_RX_IRQ_Msk)) && + ((PRI_RF->R01_INT & R01_INT_RX_IRQ_MASK_Msk)?(false):(true))) { if (((enhc == 0) && (normal_m1 == 0) && ptxprx) || !ptxprx) { while (!(PRI_RF->R01_INT & R01_INT_RX_DONE_IRQ_FLAG_Msk)) { } /* wait rx done */ @@ -124,7 +120,8 @@ } } - if (PRI_RF_IntFlag(PRI_RF, R01_INT_RX_CRC_ERR_Msk)) { + if ((PRI_RF_IntFlag(PRI_RF, R01_INT_RX_CRC_ERR_Msk)) && + ((PRI_RF->R01_INT & R01_INT_RX_CRC_ERR_MASK_Msk)?(false):(true))) { while (!(PRI_RF->R01_INT & R01_INT_RX_DONE_IRQ_FLAG_Msk)) { } /* wait rx done */ PHY_strt_stp(LLHWC_PHY_STOP); @@ -136,8 +133,8 @@ } } - if (PRI_RF_IntFlag(PRI_RF, R01_INT_RX_LENGTH_ERR_Msk)) - { + if ((PRI_RF_IntFlag(PRI_RF, R01_INT_RX_LENGTH_ERR_Msk)) && + ((PRI_RF->R01_INT & R01_INT_RX_LENGTH_ERR_MASK_Msk)?(false):(true))) { while (!(PRI_RF->R01_INT & R01_INT_RX_DONE_IRQ_FLAG_Msk)) { } /* wait rx done */ PHY_strt_stp(LLHWC_PHY_STOP); @@ -148,8 +145,8 @@ } } - if (PRI_RF_IntFlag(PRI_RF, R01_INT_RX_ACCADDR_ERR_Msk)) - { + if ((PRI_RF_IntFlag(PRI_RF, R01_INT_RX_ACCADDR_ERR_Msk)) && + ((PRI_RF->R01_INT & R01_INT_RX_ACCADDR_ERR_MASK_Msk)?(false):(true))) { while (!(PRI_RF->R01_INT & R01_INT_RX_DONE_IRQ_FLAG_Msk)) { } /* wait rx done */ PHY_strt_stp(LLHWC_PHY_STOP); @@ -160,7 +157,8 @@ } } - if (PRI_RF->R01_INT & R01_INT_RX_PID_ERR_IRQ_FLAG_Msk) { + if ((PRI_RF->R01_INT & R01_INT_RX_PID_ERR_IRQ_FLAG_Msk) && + ((PRI_RF->R01_INT & R01_INT_PID_ERR_MASK_Msk)?(false):(true))) { while (!(PRI_RF->R01_INT & R01_INT_RX_DONE_IRQ_FLAG_Msk)) { } /* wait rx done */ if (ptxprx == 0) { @@ -169,6 +167,20 @@ if (isr_cb.rx_pid_err_cb != NULL) { (*isr_cb.rx_pid_err_cb)(); + } + } + + if ((PRI_RF_IntFlag(PRI_RF, R01_INT_TX_IRQ_Msk)) && + ((PRI_RF->R01_INT & R01_INT_TX_IRQ_MASK_Msk)?(false):(true))) { + if (((((enhc == 0) && (normal_m1 == 0)) || ((enhc == 1) && noack)) && !ptxprx) || ptxprx) { + while (!(PRI_RF->R01_INT & R01_INT_TX_DONE_IRQ_FLAG_Msk)) { + } /* wait tx done */ + PHY_strt_stp(LLHWC_PHY_STOP); + PRI_RF_SetTrxRamReady(PRI_RF, PRI_RF_MODE_SEL_TRX, 0); + } + + if (isr_cb.tx_cb != NULL) { + (*isr_cb.tx_cb)(); } } @@ -188,22 +200,8 @@ normal_m1 = (uint8_t)((PRI_RF->R04_RX_CTL & R04_RX_CTL_NORMAL_M1_Msk) >> R04_RX_CTL_NORMAL_M1_Pos); noack = PRI_RF_IsTxNoAckEn(PRI_RF); - if (PRI_RF_IntFlag(PRI_RF, R01_INT_TX_IRQ_Msk)) { - if (((((enhc == 0) && (normal_m1 == 0)) || ((enhc == 1) && noack)) && !ptxprx) || ptxprx) { - while (!(PRI_RF->R01_INT & R01_INT_TX_DONE_IRQ_FLAG_Msk)); /* wait tx done */ - PHY_strt_stp(LLHWC_PHY_STOP); - PRI_RF_SetTrxRamReady(PRI_RF, PRI_RF_MODE_SEL_TRX, 0); - panchip_prf_ble_resume(); - } - - if (isr_cb.tx_cb != NULL) { - (*isr_cb.tx_cb)(); - } - PRI_RF_ClearAllIrqEn(PRI_RF, ENABLE); - return 1; - } - - if (PRI_RF_IntFlag(PRI_RF, R01_INT_TX_TIMEOUT_IRQ_Msk)) { + if ((PRI_RF_IntFlag(PRI_RF, R01_INT_TX_TIMEOUT_IRQ_Msk)) && + ((PRI_RF->R01_INT & R01_INT_TX_TIMEOUT_IRQ_MASK_Msk)?(false):(true))) { while (!(PRI_RF->R01_INT & R01_INT_RX_DONE_IRQ_FLAG_Msk)); /* wait rx timeout */ PHY_strt_stp(LLHWC_PHY_STOP); PRI_RF_SetTrxRamReady(PRI_RF, PRI_RF_MODE_SEL_TRX, 0); @@ -216,7 +214,8 @@ return 1; } - if (PRI_RF_IntFlag(PRI_RF, R01_INT_RX_IRQ_Msk)) { + if ((PRI_RF_IntFlag(PRI_RF, R01_INT_RX_IRQ_Msk)) && + ((PRI_RF->R01_INT & R01_INT_RX_IRQ_MASK_Msk)?(false):(true))) { if (((enhc == 0) && (normal_m1 == 0) && ptxprx) || !ptxprx) { while (!(PRI_RF->R01_INT & R01_INT_RX_DONE_IRQ_FLAG_Msk)); /* wait rx done */ PHY_strt_stp(LLHWC_PHY_STOP); @@ -232,7 +231,8 @@ return 1; } - if (PRI_RF_IntFlag(PRI_RF, R01_INT_RX_CRC_ERR_Msk)) { + if ((PRI_RF_IntFlag(PRI_RF, R01_INT_RX_CRC_ERR_Msk)) && + ((PRI_RF->R01_INT & R01_INT_RX_CRC_ERR_MASK_Msk)?(false):(true))) { while (!(PRI_RF->R01_INT & R01_INT_RX_DONE_IRQ_FLAG_Msk)); /* wait rx crc err */ PHY_strt_stp(LLHWC_PHY_STOP); PRI_RF_SetTrxRamReady(PRI_RF, PRI_RF_MODE_SEL_TRX, 0); @@ -246,8 +246,8 @@ return 1; } - if (PRI_RF_IntFlag(PRI_RF, R01_INT_RX_LENGTH_ERR_Msk)) - { + if ((PRI_RF_IntFlag(PRI_RF, R01_INT_RX_LENGTH_ERR_Msk)) && + ((PRI_RF->R01_INT & R01_INT_RX_LENGTH_ERR_MASK_Msk)?(false):(true))) { while (!(PRI_RF->R01_INT & R01_INT_RX_DONE_IRQ_FLAG_Msk)); //wait rx done PHY_strt_stp(LLHWC_PHY_STOP); PRI_RF_SetTrxRamReady(PRI_RF, PRI_RF_MODE_SEL_TRX, 0); @@ -260,8 +260,8 @@ return 1; } - if (PRI_RF_IntFlag(PRI_RF, R01_INT_RX_ACCADDR_ERR_Msk)) - { + if ((PRI_RF_IntFlag(PRI_RF, R01_INT_RX_ACCADDR_ERR_Msk)) && + ((PRI_RF->R01_INT & R01_INT_RX_ACCADDR_ERR_MASK_Msk)?(false):(true))) { while (!(PRI_RF->R01_INT & R01_INT_RX_DONE_IRQ_FLAG_Msk)); //wait rx done PHY_strt_stp(LLHWC_PHY_STOP); PRI_RF_SetTrxRamReady(PRI_RF, PRI_RF_MODE_SEL_TRX, 0); @@ -273,11 +273,27 @@ PRI_RF_ClearAllIrqEn(PRI_RF, ENABLE); return 1; } + + if ((PRI_RF_IntFlag(PRI_RF, R01_INT_TX_IRQ_Msk)) && + ((PRI_RF->R01_INT & R01_INT_TX_IRQ_MASK_Msk)?(false):(true))) { + if (((((enhc == 0) && (normal_m1 == 0)) || ((enhc == 1) && noack)) && !ptxprx) || ptxprx) { + while (!(PRI_RF->R01_INT & R01_INT_TX_DONE_IRQ_FLAG_Msk)); /* wait tx done */ + PHY_strt_stp(LLHWC_PHY_STOP); + PRI_RF_SetTrxRamReady(PRI_RF, PRI_RF_MODE_SEL_TRX, 0); + panchip_prf_ble_resume(); + } + + if (isr_cb.tx_cb != NULL) { + (*isr_cb.tx_cb)(); + } + PRI_RF_ClearAllIrqEn(PRI_RF, ENABLE); + return 1; + } return 0; } -__ramfunc uint8_t panchip_prf_ble_handler(void) +__weak uint8_t panchip_prf_ble_handler(void) { if (panchip_prf_isr_resume_ble_cb() == 1) { return 1; @@ -757,7 +773,7 @@ return status; } -void panchip_prf_set_phy(prf_phy_t phy) +__weak void panchip_prf_set_phy(prf_phy_t phy) { rf_config.phy = phy; @@ -794,14 +810,18 @@ ANA->LP_BUCK_3V = (ANA->LP_BUCK_3V & ~(0xFu << 2)) | ((buck_vout_trim_val & 0x0f) << 2); - rf_config.tx_power = tx_pwr; - if(rf_config.chip_mode != PRF_CHIP_MODE_SEL_BLE) { // panchip_prf_reset(); __disable_irq(); } + if(tx_pwr <= 0) + { + tx_pwr = tx_pwr - 1; + } + + rf_config.tx_power = tx_pwr; PHY_set_tx_pwr(tx_pwr); if(rf_config.chip_mode != PRF_CHIP_MODE_SEL_BLE) @@ -846,7 +866,7 @@ if(trans_wait_time == 0) { - panchip_prf_reduce_trx_time(true); //trx 25us,rtx 26us + panchip_prf_reduce_trx_pre_post_delay_time(p_config, false); //trx 25us,rtx 26us } } } @@ -875,7 +895,7 @@ prf_delay_nop(30); } -__ramfunc void ana_prf_ldo_dis(void) +__ramfunc __weak void ana_prf_ldo_dis(void) { #ifndef CONFIG_PRF_REDUCE_TRX_TRANS_TIME REG_WRITE_BITS(ANA->ANA_ADC_LDO, 0x01, 0x00); @@ -885,3 +905,166 @@ prf_delay_nop(200); #endif } + +__ramfunc void panchip_prf_reduce_trx_pre_post_delay_time(pan_prf_config_t *p_config, bool restore) +{ + extern uint32_t* g_phy_post_tx_ptr_prf; + extern uint32_t* g_phy_pre_tx_1M_ptr_prf; + extern uint32_t* g_phy_pre_rx_1M_ptr_prf; + extern uint32_t* g_phy_pre_tx_2M_ptr_prf; + extern uint32_t* g_phy_pre_rx_2M_ptr_prf; + + if (0xffffffff == raw_phy_config_data[0]) { + raw_phy_config_data[0] = g_phy_post_tx_ptr_prf[2]; + raw_phy_config_data[1] = g_phy_pre_tx_1M_ptr_prf[3]; + raw_phy_config_data[2] = g_phy_pre_tx_1M_ptr_prf[6]; + raw_phy_config_data[3] = g_phy_pre_rx_1M_ptr_prf[6]; + raw_phy_config_data[4] = g_phy_pre_tx_2M_ptr_prf[3]; + raw_phy_config_data[5] = g_phy_pre_tx_2M_ptr_prf[6]; + raw_phy_config_data[6] = g_phy_pre_rx_2M_ptr_prf[6]; + } + + if (p_config->phy == PRF_PHY_1M) { + if (restore) { + g_phy_pre_tx_1M_ptr_prf[3] = raw_phy_config_data[1]; + g_phy_pre_tx_1M_ptr_prf[6] = raw_phy_config_data[2]; + g_phy_post_tx_ptr_prf[2] = raw_phy_config_data[0]; + /* 21us */ + g_phy_pre_rx_1M_ptr_prf[6] = raw_phy_config_data[3]; + } else { + /* 24us */ + g_phy_pre_tx_1M_ptr_prf[3] = (g_phy_pre_tx_1M_ptr_prf[3] & 0x00ffffff); + g_phy_pre_tx_1M_ptr_prf[6] = (g_phy_pre_tx_1M_ptr_prf[6] & 0x00ffffff) | (0x8 << 24); + g_phy_post_tx_ptr_prf[2] = g_phy_post_tx_ptr_prf[2] & 0x00ffffff; + /* 21us */ + g_phy_pre_rx_1M_ptr_prf[6] = (g_phy_pre_rx_1M_ptr_prf[6] & 0x00ffffff) | (0x0 << 24); + } + } else if (p_config->phy == PRF_PHY_2M) { + + if (restore) { + g_phy_pre_tx_2M_ptr_prf[3] = raw_phy_config_data[4]; + g_phy_pre_tx_2M_ptr_prf[6] = raw_phy_config_data[5]; + g_phy_post_tx_ptr_prf[2] = raw_phy_config_data[0]; + /* 21us */ + g_phy_pre_rx_2M_ptr_prf[6] = raw_phy_config_data[6]; + } else { + /* 24us */ + g_phy_pre_tx_2M_ptr_prf[3] = (g_phy_pre_tx_2M_ptr_prf[3] & 0x00ffffff); + g_phy_pre_tx_2M_ptr_prf[6] = (g_phy_pre_tx_2M_ptr_prf[6] & 0x00ffffff) | (0x8 << 24); + g_phy_post_tx_ptr_prf[2] = g_phy_post_tx_ptr_prf[2] & 0x00ffffff; + /* 21us */ + g_phy_pre_rx_2M_ptr_prf[6] = (g_phy_pre_rx_2M_ptr_prf[6] & 0x00ffffff) | (0x0 << 24); + } + } + + extern uint32_t PHY_SeqRamInit(void); + PHY_SeqRamInit(); +} + +__ramfunc int16_t panchip_prf_set_trx_trans_time(pan_prf_config_t *p_config, + prf_speed_sel_t speed, + uint16_t transfer_time) +{ + int16_t trans_wait_time = 0; + uint32_t prescale_clk; + uint32_t write_phy_time = 0, write_phy_delay_time = 0; + uint32_t legency_time = 0; + + if ((speed == PRF_TRANSFER_SPEED_4K) || (speed == PRF_TRANSFER_SPEED_8K)) { + panchip_prf_reduce_trx_pre_post_delay_time(p_config, false); + } + + prescale_clk = PRI_RF_READ_REG_VALUE(PRI_RF, PHY1, IF_CLK_PRESCALE); + /* calculate phy write time */ + if (p_config->trx_mode == PRF_TX_MODE) { + if (p_config->phy == PRF_PHY_1M) { + write_phy_time = (24 * prescale_clk + 8) * ((post_tx_interpacket_size >> 2)); + if (p_config->work_mode == PRF_MODE_ENHANCE) { + write_phy_time += (24 * prescale_clk + 8) * ((pre_rx_interpacket_size >> 2) + 1) + 10; + /* calculate phy write delay time */ + write_phy_delay_time = phy_time_cfg(p_config->phy - 1, 1); + } + } else if (p_config->phy == PRF_PHY_2M) { + write_phy_time = (24 * prescale_clk + 8) * ((post_tx_interpacket_size >> 2)); + if (p_config->work_mode == PRF_MODE_ENHANCE) { + write_phy_time += (24 * prescale_clk + 8) * ((pre_rx_interpacket_2M_size >> 2) + 1) + 10; + /* calculate phy write delay time */ + write_phy_delay_time = phy_time_cfg(p_config->phy - 1, 1); + } + } + } + if (p_config->trx_mode == PRF_RX_MODE) { + if (p_config->phy == PRF_PHY_1M) { + legency_time = RX_LEGENCY_1M; + write_phy_time = (24 * prescale_clk + 8) * ((post_rx_interpacket_size >> 2)); + if (p_config->work_mode == PRF_MODE_ENHANCE) { + write_phy_time += (24 * prescale_clk + 8) * ((pre_tx_interpacket_size >> 2) + 1) + 10; + /* calculate phy write delay time */ + write_phy_delay_time = phy_time_cfg(p_config->phy - 1, 0); + } + } else if (p_config->phy == PRF_PHY_2M) { + legency_time = RX_LEGENCY_2M; + write_phy_time = (24 * prescale_clk + 8) * ((post_rx_interpacket_size >> 2)); + if (p_config->work_mode == PRF_MODE_ENHANCE) { + write_phy_time += (24 * prescale_clk + 8) * ((pre_tx_interpacket_2M_size >> 2) + 1) + 10; + /* calculate phy write delay time */ + write_phy_delay_time = phy_time_cfg(p_config->phy - 1, 0); + } + } + } + /* phy clk is 32M, here right shift 5 bit means the time is microsecond */ + write_phy_time >>= 5; + if (p_config->trx_mode == PRF_RX_MODE) { + trans_wait_time = transfer_time - write_phy_time - write_phy_delay_time + - legency_time - RX_WINDOW; + } else { + trans_wait_time = transfer_time - write_phy_time - write_phy_delay_time - TX_WINDOW; + } + + if (trans_wait_time < 0) { + return trans_wait_time; + } + + if (p_config->work_mode == PRF_MODE_ENHANCE) { + PRI_RF_SetTrxTransWaitTime(PRI_RF, trans_wait_time); + } + + return trans_wait_time; +} + +void panchip_prf_phy_cfg_mode_set(uint32_t *phy_data, uint16_t len) +{ + #if(PHY_CFG_MODE == PHY_MODED_AGC_0X0F) + for(int i = 0; i < len; i++) { + if(phy_data[i] == 0x00d4a202) { + phy_data[i] = 0x00dea202; + } else if(phy_data[i] == 0x002fa202) { + phy_data[i] = 0x000fa202; + + break; + } + } + #elif(PHY_CFG_MODE == PHY_MODED_FORCE_GAIN_0X0F) + for(int i = 0; i < len; i++) { + if(phy_data[i] == 0x00d6a202) { + phy_data[i] = 0x00c2a202; + } else if(phy_data[i] == 0x00b7a202) { + phy_data[i] = 0x00c2a202; + } else if((phy_data[i] == 0x0006a202) && (phy_data[i + 1] == 0x000ca302)) { + phy_data[i] = 0x00dea202; + } else if(phy_data[i] == 0x00f2a202) { + phy_data[i] = 0x00dea202; + } else if(phy_data[i] == 0x00d4a202) { + phy_data[i] = 0x00dea202; + } else if(phy_data[i] == 0x0003a202) { + phy_data[i] = 0x000fa202; + } else if(phy_data[i] == 0x0007a202) { + phy_data[i] = 0x000fa202; + } else if(phy_data[i] == 0x002fa202) { + phy_data[i] = 0x000fa202; + + break; + } + } + #endif +} -- Gitblit v1.9.3