#include "board.h" #include "myRadio.h" #include "myRadio_gpio.h" /**-------------------------radio include----------------------------------**/ #include "radio.h" /**-------------------------radio include end----------------------------------**/ static int8_t rfTxPower; static uint32_t rfFrequence; static rfRxCallBack rxCb; static uint8_t rfRxBuffer[255]; static uint32_t rf_handle; /**-------------------------radio params----------------------------------**/ typedef struct { int8_t power; uint8_t regValue; }rfPowerReg_ts; rfPowerReg_ts rfPowerRegTab[] = { { .power = -7, .regValue = 0, }, { .power = -6, .regValue = 10, }, { .power = -5, .regValue = 16, }, { .power = -4, .regValue = 32, }, { .power = -3, .regValue = 40, }, { .power = -2, .regValue = 48, }, { .power = -1, .regValue = 55, }, { .power = 0, .regValue = 64, }, { .power = 1, .regValue = 80, }, { .power = 2, .regValue = 96, }, { .power = 3, .regValue = 112, }, { .power = 4, .regValue = 112, }, { .power = 5, .regValue = 112, }, { .power = 6, .regValue = 113, }, { .power = 7, .regValue = 113, }, { .power = 8, .regValue = 114, }, { .power = 9, .regValue = 114, }, { .power = 10, .regValue = 115, }, { .power = 11, .regValue = 116, }, { .power = 12, .regValue = 117, }, { .power = 13, .regValue = 118, }, { .power = 14, .regValue = 120, }, { .power = 15, .regValue = 122, }, { .power = 16, .regValue = 124, }, { .power = 17, .regValue = 126, }, { .power = 18, .regValue = 126, }, { .power = 19, .regValue = 127, }, { .power = 20, .regValue = 127, }, }; const loraBaudrateFrame_ts loraBaudrateFrame[MAX_RF_BAUDRATE_COUNT] = { {//91.55bps,SF=12,BW=62.5kHz(6),CR=4 .SpreadingFactor = 12, .SignalBw = 6, .ErrorCoding = 4, }, {//610.35bps,SF=10,BW=125kHz(7),CR=4 .SpreadingFactor = 10, .SignalBw = 7, .ErrorCoding = 4, }, {//1220.7bps,SF=10,BW=250kHz(8),CR=4 .SpreadingFactor = 10, .SignalBw = 8, .ErrorCoding = 4, }, {//2441.41bps,SF=10,BW=500kHz(9),CR=4 .SpreadingFactor = 10, .SignalBw = 9, .ErrorCoding = 4, }, {//5022.32bps,SF=9,BW=500kHz(9),CR=3 .SpreadingFactor = 9, .SignalBw = 9, .ErrorCoding = 3, }, {//12500bps,SF=8,BW=500kHz(9),CR=1 .SpreadingFactor = 8, .SignalBw = 9, .ErrorCoding = 1, }, {//37500bps,SF=6,BW=500kHz(9),CR=1 .SpreadingFactor = 6, .SignalBw = 9, .ErrorCoding = 1, }, }; bool rf_ifq; extern struct RxDoneMsg RxDoneParams; /**-------------------------radio params end----------------------------------**/ void myRadio_delay(uint32_t time_ms) { uint32_t i, j; i = time_ms; while (i --) { for ( j = 0; j < 1000; j++) { ; } } } void myRadio_gpioCallback(uint8_t index) { PAN3028_irq_handler(); rf_ifq = true; } void myRadio_init(int agr0, void *agr1_ptr) { myRadio_gpio_init(myRadio_gpioCallback); /**-------------------------radio init----------------------------------**/ uint32_t ret = 0; ret = rf_init(); if(ret != OK) { // printf(" RF Init Fail"); while(1); } rf_set_default_para(); RF_EXT_PA_TO_IDLE(); /**-------------------------radio init end----------------------------------**/ if ((rfRxCallBack )agr1_ptr) { rxCb = (rfRxCallBack )agr1_ptr; } rf_handle = 0xe5; } void myRadio_process(void) { rfRxPacket_ts rfRxPacket; if (rf_handle == 0) { return; } if (rf_ifq == false) { return; } rf_ifq = false; if(rf_get_transmit_flag() == RADIO_FLAG_TXDONE) { rf_set_transmit_flag(RADIO_FLAG_IDLE); RF_EXT_PA_TO_IDLE(); if (rxCb) { rxCb(TX_STA_SECCESS, rfRxPacket); } } if(rf_get_recv_flag() == RADIO_FLAG_RXDONE) { rf_set_recv_flag(RADIO_FLAG_IDLE); if (rxCb) { rfRxPacket.rssi = RxDoneParams.Rssi; rfRxPacket.len = RxDoneParams.Size; memcpy(rfRxPacket.payload, RxDoneParams.Payload, RxDoneParams.Size); rxCb(RX_STA_SECCESS, rfRxPacket); } } if(rf_get_recv_flag() == RADIO_FLAG_RXTIMEOUT) { rf_set_recv_flag(RADIO_FLAG_IDLE); RF_EXT_PA_TO_IDLE(); if (rxCb) { rxCb(RX_STA_TIMEOUT, rfRxPacket); } } if(rf_get_recv_flag() == RADIO_FLAG_RXERR) { rf_set_recv_flag(RADIO_FLAG_IDLE); RF_EXT_PA_TO_IDLE(); if (rxCb) { rxCb(RX_STA_PAYLOAD_ERROR, rfRxPacket); } } } void myRadio_abort(void) { if (rf_handle == 0) { return; } RF_EXT_PA_TO_IDLE(); rf_deepsleep(); } uint32_t myRadio_getFrequency(void) { if (rf_handle == 0) { return 0; } return rfFrequence; } void myRadio_setFrequency(uint32_t freq) { if (rf_handle == 0) { return; } rfFrequence = freq; PAN3028_set_freq(rfFrequence); } uint8_t getRfPowerTabIndex(int8_t power) { for (int i = 0; i < sizeof(rfPowerRegTab)/2; i++) { if (rfPowerRegTab[i].power >= power) { return i; } } return sizeof(rfPowerRegTab)/2 - 1; } int8_t myRadio_getTxPower(void) { if (rf_handle == 0) { return 0; } return rfTxPower; } void myRadio_setTxPower(int8_t power) { if (rf_handle == 0) { return; } rfTxPower = power; PAN3028_set_tx_power(rfPowerRegTab[getRfPowerTabIndex(rfTxPower)].regValue); } /** * 获取射频波特率 * @param : br-> */ uint8_t myRadio_getBaudrate(void) { if (rf_handle == 0) { return 0; } } /** * 设置射频波特率 * @param : br-> */ void myRadio_setBaudrate(uint8_t br) { if (rf_handle == 0) { return; } PAN3028_set_mode(PAN3028_MODE_STB3); rf_set_para(RF_PARA_TYPE_CR, loraBaudrateFrame[br].ErrorCoding); rf_set_para(RF_PARA_TYPE_BW, loraBaudrateFrame[br].SignalBw); rf_set_para(RF_PARA_TYPE_SF, loraBaudrateFrame[br].SpreadingFactor); rf_set_ldr(LDR_OFF); } void myRadio_setChipType(uint8_t type) { } uint8_t myRadio_getChipType(void) { return 0; } void myRadio_transmit(rfTxPacket_ts *packet) { if (rf_handle == 0) { return; } uint32_t getTxtime; RF_EXT_PA_TO_TX(); if (rf_get_mode() == PAN3028_MODE_DEEP_SLEEP) { rf_deepsleep_wakeup(); myRadio_delay(10); } if(rf_single_tx_data(packet->payload, packet->len, &getTxtime) != OK) { } else { } } void myRadio_receiver(void) { if (rf_handle == 0) { return; } RF_EXT_PA_TO_RX(); if (rf_get_mode() == PAN3028_MODE_DEEP_SLEEP) { rf_deepsleep_wakeup(); myRadio_delay(10); } rf_enter_continous_rx(); } void myRadio_setCtrl(controlMode_te mode, uint32_t value) { if (rf_handle == 0) { return; } myRadio_init(0, 0); switch (mode) { case RADIO_EXT_CONTROL_TX_UNMODULATED: { RF_EXT_PA_TO_TX(); rf_enter_carrier_wave_test_mode(); PAN3028_set_freq(rfFrequence); PAN3028_set_carrier_tx_power(rfPowerRegTab[getRfPowerTabIndex(rfTxPower)].regValue); } break; case RADIO_EXT_CONTROL_TX_MODULATED: { RF_EXT_PA_TO_TX(); rf_enter_carrier_wave_test_mode(); PAN3028_set_freq(rfFrequence); PAN3028_set_carrier_tx_power(rfPowerRegTab[getRfPowerTabIndex(rfTxPower)].regValue); } break; case RADIO_EXT_CONTROL_RX_SENSITIVITY: { myRadio_receiver(); } break; default: break; } } /**-------------------------radio funtion----------------------------------**/ /**-------------------------radio funtion end----------------------------------**/