#include "board.h" #include "myRadio.h" #include "myRadio_gpio.h" /**-------------------------radio include----------------------------------**/ #include "si446x_cmd.h" #include "si446x_api_lib.h" #include "si446x_prop.h" #include "myRadio_setting.h" /**-------------------------radio include end----------------------------------**/ static int8_t rfTxPower; static uint32_t rfFrequence; static uint32_t rfBaudrate; static rfRxCallBack rxCb; static uint8_t rfRxBuffer[255]; static uint32_t rf_handle; static uint8_t rf_workProcess; static uint8_t chipType; /**-------------------------radio params----------------------------------**/ typedef struct { int8_t power; uint8_t regValue; }rfPowerReg_ts; rfPowerReg_ts rfPowerRegTab[] = { { .power = -7, .regValue = 3, }, { .power = -6, .regValue = 4, }, { .power = -5, .regValue = 4, }, { .power = -4, .regValue = 5, }, { .power = -3, .regValue = 5, }, { .power = -2, .regValue = 6, }, { .power = -1, .regValue = 6, }, { .power = 0, .regValue = 7, }, { .power = 1, .regValue = 8, }, { .power = 2, .regValue = 9, }, { .power = 3, .regValue = 10, }, { .power = 4, .regValue = 10, }, { .power = 5, .regValue = 13, }, { .power = 6, .regValue = 14, }, { .power = 7, .regValue = 16, }, { .power = 8, .regValue = 18, }, { .power = 9, .regValue = 21, }, { .power = 10, .regValue = 23, }, { .power = 11, .regValue = 26, }, { .power = 12, .regValue = 30, }, { .power = 13, .regValue = 34, }, { .power = 14, .regValue = 37, }, { .power = 15, .regValue = 43, }, { .power = 16, .regValue = 50, }, { .power = 17, .regValue = 57, }, { .power = 18, .regValue = 68, }, { .power = 19, .regValue = 96, }, { .power = 20, .regValue = 127, }, }; void myRadio_setModType(mod_type_te MOD_TYPE, mod_sourse_te MOD_SOURCE, mod_gpio_te TX_DIRECT_MODE_GPIO, direct_mode_type_te TX_DIRECT_MODE_TYPE); void myRadio_initDirectRxGpioMode(void); void myRadio_setPh_rxDisable(bool sta); uint16_t myRadio_getPktField2Length(void); tRadioConfiguration* getRadioConfig(uint8_t chipType); void continuous_modul_test(uint32_t ch); void continuous_noModul_test(uint32_t ch); uint8_t getRfPowerTabIndex(int8_t power); /**-------------------------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++) { ; } } } /** * @brief IO口中断回调 * IO口产生中断后会执行该函数 * 用于接收射频工作的中断响应 * * @param index */ void myRadio_gpioCallback(uint8_t index) { } /** * @brief 射频初始化 * * @param agr0 * @param agr1_ptr 无线工作状态响应回调 * 产生回调给外部使用,@rfRxCallBack */ void myRadio_init(int agr0, void *agr1_ptr) { myRadio_gpio_init(myRadio_gpioCallback); /**-------------------------radio init----------------------------------**/ gpio_pin_cfg_tu gpio_pin_cfg_0; gpio_pin_cfg_tu gpio_pin_cfg_1; gpio_pin_cfg_tu gpio_pin_cfg_2; gpio_pin_cfg_tu gpio_pin_cfg_3; nirq_pin_cfg_tu nirq_pin_cfg; sdo_pin_cfg_tu sdo_pin_cfg; gen_config_tu gen_config; pRadioConfiguration = getRadioConfig(chipType); vRadio_Init(); //使能数据包收发中断控制 //Interrupt->Packet Handler HW interrupt //使能调制解调器中断控制 //Interrupt->Modem HW interrupt si446x_set_property(SI446X_PROP_GRP_ID_INT_CTL, 1, SI446X_PROP_GRP_INDEX_INT_CTL_ENABLE, SI446X_PROP_INT_CTL_ENABLE_MODEM_INT_STATUS_EN_BIT | SI446X_PROP_INT_CTL_ENABLE_PH_INT_STATUS_EN_BIT ); //使能同步字侦测中断, 用于获取数据包RSSI //Interrupt->Modem HW interrupt->SYDE si446x_set_property(SI446X_PROP_GRP_ID_INT_CTL, 1, SI446X_PROP_GRP_INDEX_INT_CTL_MODEM_ENABLE, SI446X_PROP_INT_CTL_MODEM_ENABLE_SYNC_DETECT_EN_BIT ); //配置GPIO状态,GPIO0和GPIO2用于模块内部天线开关控制 //GPIO and FRR->GPIO // GPIO 0配置为TX_STETE // GPIO 2配置为RX_STETE gpio_pin_cfg_0.regValue = 0; gpio_pin_cfg_0.unit.GPIO_MODE = SI446X_CMD_GPIO_PIN_CFG_ARG_GPIO_GPIO_MODE_ENUM_TX_STATE; gpio_pin_cfg_0.unit.PULL_CTL = SI446X_CMD_GPIO_PIN_CFG_ARG_GPIO_PULL_CTL_ENUM_PULL_DIS; gpio_pin_cfg_1.regValue = 0; gpio_pin_cfg_1.unit.GPIO_MODE = SI446X_CMD_GPIO_PIN_CFG_ARG_GPIO_GPIO_MODE_ENUM_DONOTHING; gpio_pin_cfg_1.unit.PULL_CTL = SI446X_CMD_GPIO_PIN_CFG_ARG_GPIO_PULL_CTL_ENUM_PULL_DIS; gpio_pin_cfg_2.regValue = 0; gpio_pin_cfg_2.unit.GPIO_MODE = SI446X_CMD_GPIO_PIN_CFG_ARG_GPIO_GPIO_MODE_ENUM_RX_STATE; gpio_pin_cfg_2.unit.PULL_CTL = SI446X_CMD_GPIO_PIN_CFG_ARG_GPIO_PULL_CTL_ENUM_PULL_DIS; gpio_pin_cfg_3.regValue = 0; gpio_pin_cfg_3.unit.GPIO_MODE = SI446X_CMD_GPIO_PIN_CFG_ARG_GPIO_GPIO_MODE_ENUM_DONOTHING; gpio_pin_cfg_3.unit.PULL_CTL = SI446X_CMD_GPIO_PIN_CFG_ARG_GPIO_PULL_CTL_ENUM_PULL_DIS; nirq_pin_cfg.regValue = 0; nirq_pin_cfg.unit.NIRQ_MODE = SI446X_CMD_GPIO_PIN_CFG_ARG_NIRQ_NIRQ_MODE_ENUM_DONOTHING; nirq_pin_cfg.unit.PULL_CTL = SI446X_CMD_GPIO_PIN_CFG_ARG_NIRQ_PULL_CTL_ENUM_PULL_DIS; sdo_pin_cfg.regValue = 0; sdo_pin_cfg.unit.SDO_MODE = SI446X_CMD_GPIO_PIN_CFG_ARG_SDO_SDO_MODE_ENUM_DONOTHING; sdo_pin_cfg.unit.PULL_CTL = SI446X_CMD_GPIO_PIN_CFG_ARG_SDO_PULL_CTL_ENUM_PULL_DIS; gen_config.regValue = 0; gen_config.unit.DRV_STRENGTH = SI446X_CMD_GPIO_PIN_CFG_ARG_GEN_CONFIG_DRV_STRENGTH_ENUM_HIGH; si446x_gpio_pin_cfg(gpio_pin_cfg_0.regValue, gpio_pin_cfg_1.regValue, gpio_pin_cfg_2.regValue, gpio_pin_cfg_3.regValue, nirq_pin_cfg.regValue, sdo_pin_cfg.regValue, gen_config.regValue ); /**-------------------------radio init end----------------------------------**/ if ((rfRxCallBack )agr1_ptr) { rxCb = (rfRxCallBack )agr1_ptr; } rf_handle = 0xe5; } /** * @brief 射频底层执行程序 * 要放在主循环中执行 * */ void myRadio_process(void) { if (rf_handle == 0) { return; } uint8_t bMain_IT_Status; rfRxPacket_ts rfRxPacket; if (rf_handle == 0) { return; } bMain_IT_Status = bRadio_Check_Tx_RX(); if(bMain_IT_Status == SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_RX_PEND_BIT) { if (rxCb) { rfRxPacket.len = vRadio_getRxCount();//12; // memset(rfRxPacket.payload, 0, sizeof(rfRxPacket.payload)); memcpy(rfRxPacket.payload, customRadioPacket, rfRxPacket.len); rxCb(RX_STA_SECCESS, rfRxPacket); } } if(bMain_IT_Status == SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_SENT_PEND_BIT) { // RFstate=RFLR_STATE_TX_DONE; if (rxCb) { rxCb(TX_STA_SECCESS, rfRxPacket); } } if(bMain_IT_Status == SI446X_CMD_GET_INT_STATUS_REP_MODEM_PEND_SYNC_DETECT_PEND_BIT) { rfRxPacket.rssi = (int16_t)vRadio_getPacketRssi()/2-64-70; } } /** * @brief 退出射频进入休眠 * */ void myRadio_abort(void) { if (rf_handle == 0) { return; } vRadio_StartSleep(); } /** * @brief 获取射频工作中心频率 * * @return uint32_t */ uint32_t myRadio_getFrequency(void) { if (rf_handle == 0) { return 0; } return rfFrequence; } /** * @brief 设置射频工作中心频率 * * @param freq * 具体频点,单位:Hz */ void myRadio_setFrequency(uint32_t freq) { if (rf_handle == 0) { return; } rfFrequence = freq; pRadioConfiguration->Radio_ChannelNumber = rfFrequence; } /** * @brief 获取发射功率 * * @return int8_t */ int8_t myRadio_getTxPower(void) { if (rf_handle == 0) { return 0; } return rfTxPower; } /** * @brief 设置发射功率 * * @param power * 单位:dbm */ void myRadio_setTxPower(int8_t power) { if (rf_handle == 0) { return; } rfTxPower = power; si446x_set_property(SI446X_PROP_GRP_ID_PA, 1, SI446X_PROP_GRP_INDEX_PA_PWR_LVL, rfPowerRegTab[getRfPowerTabIndex(rfTxPower)].regValue); } /** * 获取射频波特率 * @param : br-> */ uint32_t myRadio_getBaudrate(void) { if (rf_handle == 0) { return 0; } return rfBaudrate; } /** * 设置射频波特率 * @param : br-> */ void myRadio_setBaudrate(uint32_t br) { if (rf_handle == 0) { return; } rfBaudrate = br; } /** * @brief 设置模组型号 * * @param type */ void myRadio_setChipType(uint8_t type) { chipType = type; } /** * @brief 获取模组型号 * * @return uint8_t */ uint8_t myRadio_getChipType(void) { return chipType; } //获取环境信号强度 int16_t myRadio_getRssi(void) { return (int16_t)vRadio_getRssi()/2-64-70; } /** * @brief 无线发送数据包 * * @param packet */ void myRadio_transmit(rfTxPacket_ts *packet) { if (rf_handle == 0) { return; } RF_SI4438_RF_MODE(RF_MODE_IO_TX); vRadio_StartTx_Variable_Packet(pRadioConfiguration->Radio_ChannelNumber, packet->payload, packet->len); } /** * @brief 进入无线接收 * 固定数据包长度接收 */ void myRadio_receiver(void) { if (rf_handle == 0) { return; } RF_SI4438_RF_MODE(RF_MODE_IO_RX); vRadio_StartRX(pRadioConfiguration->Radio_ChannelNumber, 12); } 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_SI4438_RF_MODE(RF_MODE_IO_TX); myRadio_setTxPower(rfTxPower); continuous_noModul_test(rfFrequence); } break; case RADIO_EXT_CONTROL_TX_MODULATED: { RF_SI4438_RF_MODE(RF_MODE_IO_TX); continuous_modul_test(rfFrequence); } break; case RADIO_EXT_CONTROL_RX_SENSITIVITY: { RF_SI4438_RF_MODE(RF_MODE_IO_RX); myRadio_initDirectRxGpioMode(); vRadio_StartRX(rfFrequence, 0); } break; default: break; } } /**-------------------------radio funtion----------------------------------**/ void continuous_modul_test(uint32_t ch) { myRadio_setModType(MODTPE_2FSK, MODSRC_PSEUDO, MODGPIO_GPIO0, DRCTMODTY_ASYNC); si446x_start_tx(ch, 0, 0); } void continuous_noModul_test(uint32_t ch) { myRadio_setModType(MODTPE_CW, MODSRC_DIRECT, MODGPIO_GPIO0, DRCTMODTY_ASYNC); si446x_start_tx(ch, 0, 0); } tRadioConfiguration* getRadioConfig(uint8_t chipType) { tRadioConfiguration* returnConfig; returnConfig = (chipType < (CHIP_COUNT_MAX-1)) ? &RadioConfiguration_setting[chipType] : &RadioConfiguration; return returnConfig; } void myRadio_setDatarate(uint32_t datarate) { si446x_set_property(SI446X_PROP_GRP_ID_MODEM, 3, SI446X_PROP_GRP_INDEX_MODEM_DATA_RATE, (datarate >> 16) & 0xff, (datarate >> 8) & 0xff, datarate & 0x01 ); } void myRadio_setFrqDev(uint32_t dev) { si446x_set_property(SI446X_PROP_GRP_ID_MODEM, 3, SI446X_PROP_GRP_INDEX_MODEM_FREQ_DEV, (dev >> 16) & 0x01, (dev >> 8) & 0xff, dev & 0x01 ); } void myRadio_setPh_rxDisable(bool sta) { pkt_config1_tu pkt_config1; pkt_config1.regValue = 0x00; pkt_config1.unit.PH_FIELD_SPLIT = 0; pkt_config1.unit.PH_RX_DISABLE = sta; si446x_set_property(SI446X_PROP_GRP_ID_PKT, 1, SI446X_PROP_GRP_INDEX_PKT_CONFIG1, pkt_config1.regValue ); } void myRadio_setModType(mod_type_te MOD_TYPE, mod_sourse_te MOD_SOURCE, mod_gpio_te TX_DIRECT_MODE_GPIO, direct_mode_type_te TX_DIRECT_MODE_TYPE) { prop_modem_mod_type_tu mod_type; mod_type.unit.MOD_TYPE = MOD_TYPE; mod_type.unit.MOD_SOURCE = MOD_SOURCE; mod_type.unit.TX_DIRECT_MODE_GPIO = TX_DIRECT_MODE_GPIO; mod_type.unit.TX_DIRECT_MODE_TYPE = TX_DIRECT_MODE_TYPE; si446x_set_property(SI446X_PROP_GRP_ID_MODEM, 1, SI446X_PROP_GRP_INDEX_MODEM_MOD_TYPE, mod_type.regValue ); } void myRadio_setPktLen(void) { } uint16_t myRadio_getPktField2Length(void) { uint16_t length; si446x_get_property(SI446X_PROP_GRP_ID_PKT, 2, SI446X_PROP_GRP_INDEX_PKT_FIELD_2_LENGTH ); length = ((uint16_t)Si446xCmd.GET_PROPERTY.DATA[0] << 8) | Si446xCmd.GET_PROPERTY.DATA[1]; return length; } void myRadio_initDirectRxGpioMode(void) { gpio_pin_cfg_tu gpio_pin_cfg_0; gpio_pin_cfg_tu gpio_pin_cfg_1; gpio_pin_cfg_tu gpio_pin_cfg_2; gpio_pin_cfg_tu gpio_pin_cfg_3; nirq_pin_cfg_tu nirq_pin_cfg; sdo_pin_cfg_tu sdo_pin_cfg; gen_config_tu gen_config; gpio_pin_cfg_0.regValue = 0; gpio_pin_cfg_0.unit.GPIO_MODE = SI446X_CMD_GPIO_PIN_CFG_ARG_GPIO_GPIO_MODE_ENUM_TX_STATE; gpio_pin_cfg_0.unit.PULL_CTL = SI446X_CMD_GPIO_PIN_CFG_ARG_GPIO_PULL_CTL_ENUM_PULL_DIS; gpio_pin_cfg_1.regValue = 0; gpio_pin_cfg_1.unit.GPIO_MODE = SI446X_CMD_GPIO_PIN_CFG_ARG_GPIO_GPIO_MODE_ENUM_RX_DATA; gpio_pin_cfg_1.unit.PULL_CTL = SI446X_CMD_GPIO_PIN_CFG_ARG_GPIO_PULL_CTL_ENUM_PULL_DIS; gpio_pin_cfg_2.regValue = 0; gpio_pin_cfg_2.unit.GPIO_MODE = SI446X_CMD_GPIO_PIN_CFG_ARG_GPIO_GPIO_MODE_ENUM_RX_STATE; gpio_pin_cfg_2.unit.PULL_CTL = SI446X_CMD_GPIO_PIN_CFG_ARG_GPIO_PULL_CTL_ENUM_PULL_DIS; gpio_pin_cfg_3.regValue = 0; gpio_pin_cfg_3.unit.GPIO_MODE = SI446X_CMD_GPIO_PIN_CFG_ARG_GPIO_GPIO_MODE_ENUM_DONOTHING; gpio_pin_cfg_3.unit.PULL_CTL = SI446X_CMD_GPIO_PIN_CFG_ARG_GPIO_PULL_CTL_ENUM_PULL_DIS; nirq_pin_cfg.regValue = 0; nirq_pin_cfg.unit.NIRQ_MODE = SI446X_CMD_GPIO_PIN_CFG_ARG_NIRQ_NIRQ_MODE_ENUM_DONOTHING; nirq_pin_cfg.unit.PULL_CTL = SI446X_CMD_GPIO_PIN_CFG_ARG_NIRQ_PULL_CTL_ENUM_PULL_DIS; sdo_pin_cfg.regValue = 0; sdo_pin_cfg.unit.SDO_MODE = SI446X_CMD_GPIO_PIN_CFG_ARG_SDO_SDO_MODE_ENUM_DONOTHING; sdo_pin_cfg.unit.PULL_CTL = SI446X_CMD_GPIO_PIN_CFG_ARG_SDO_PULL_CTL_ENUM_PULL_DIS; gen_config.regValue = 0; gen_config.unit.DRV_STRENGTH = SI446X_CMD_GPIO_PIN_CFG_ARG_GEN_CONFIG_DRV_STRENGTH_ENUM_HIGH; si446x_gpio_pin_cfg(gpio_pin_cfg_0.regValue, gpio_pin_cfg_1.regValue, gpio_pin_cfg_2.regValue, gpio_pin_cfg_3.regValue, nirq_pin_cfg.regValue, sdo_pin_cfg.regValue, gen_config.regValue ); } 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; } /**-------------------------radio funtion end----------------------------------**/