#include "board.h" #include "myRadio.h" #include "myRadio_gpio.h" /**-------------------------radio include----------------------------------**/ #include "radio.h" #include "cmt2300.h" #include "cmt2300_defs.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----------------------------------**/ bool rf_irq; rfRxPacket_ts rfRxPacket; txPowerTab_ts txPowerTab_13dBm[] = { {-10, {0x01, 0x01}}, { -9, {0x02, 0x01}}, { -8, {0x03, 0x01}}, { -7, {0x04, 0x01}}, { -6, {0x05, 0x01}}, { -5, {0x06, 0x01}}, { -4, {0x07, 0x01}}, { -3, {0x08, 0x01}}, { -2, {0x09, 0x01}}, { -1, {0x0A, 0x01}}, { 0, {0x0B, 0x01}}, { 1, {0x0C, 0x01}}, { 2, {0x0D, 0x01}}, { 3, {0x0E, 0x01}}, { 4, {0x0F, 0x01}}, { 5, {0x11, 0x01}}, { 6, {0x13, 0x02}}, { 7, {0x14, 0x02}}, { 8, {0x18, 0x03}}, { 9, {0x1B, 0x03}}, { 10, {0x1F, 0x04}}, { 11, {0x24, 0x05}}, { 12, {0x2D, 0x07}}, { 13, {0x37, 0x0A}}, { 14, {0x46, 0x0D}} }; txPowerTab_ts txPowerTab_20dBm[] = { {-10, {0x05, 0x01}}, { -9, {0x06, 0x01}}, { -8, {0x07, 0x01}}, { -7, {0x08, 0x01}}, { -6, {0x09, 0x01}}, { -5, {0x0A, 0x01}}, { -4, {0x0B, 0x01}}, { -3, {0x0C, 0x01}}, { -2, {0x0D, 0x01}}, { -1, {0x0E, 0x01}}, { 0, {0x10, 0x02}}, { 1, {0x12, 0x02}}, { 2, {0x14, 0x02}}, { 3, {0x17, 0x02}}, { 4, {0x1A, 0x02}}, { 5, {0x1D, 0x03}}, { 6, {0x20, 0x03}}, { 7, {0x24, 0x04}}, { 8, {0x29, 0x04}}, { 9, {0x2E, 0x05}}, { 10, {0x33, 0x06}}, { 11, {0x3C, 0x07}}, { 12, {0x42, 0x08}}, { 13, {0x4b, 0x09}}, { 14, {0x56, 0x0B}}, { 15, {0X5A, 0x0C}}, { 16, {0x5F, 0x0D}}, { 17, {0x8F, 0x21}}, { 18, {0xbF, 0x24}}, { 19, {0xdF, 0x26}}, { 20, {0xfF, 0x27}} }; 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) { rf_irq = true; } /** * @brief 射频初始化 * * @param agr0 * @param agr1_ptr 无线工作状态响应回调 * 产生回调给外部使用,@rfRxCallBack */ void myRadio_init(int agr0, void *agr1_ptr) { myRadio_gpio_init(myRadio_gpioCallback); /**-------------------------radio init----------------------------------**/ RF_Init(chipType, rfBaudrate); /**-------------------------radio init end----------------------------------**/ RF_EXT_PA_TO_IDLE(); if ((rfRxCallBack )agr1_ptr) { rxCb = (rfRxCallBack )agr1_ptr; } rf_handle = 0xe5; } /** * @brief 射频底层执行程序 * 要放在主循环中执行 * */ void myRadio_process(void) { cmtInt_tu getIntFlag; if (rf_handle == 0) { return; } if (rf_irq == false) { return; } rf_irq = false; getIntFlag.value = Cmt2300_ClearInterruptFlags(); if (getIntFlag.bits.pkt_done) { if (getIntFlag.bits.crc_ok) { if (rxCb) { rfRxPacket.rssi = Cmt2300_GetRssiDBm(); Cmt2300_ReadFifo(&rfRxPacket.len, 1); //可变长包接收,先从fifo中读取数据包长度,再读取数据包数据 Cmt2300_ReadFifo(rfRxPacket.payload, rfRxPacket.len); rxCb(RX_STA_SECCESS, rfRxPacket); } } } if (getIntFlag.bits.tx_done) { if (rxCb) { rxCb(TX_STA_SECCESS, rfRxPacket); } } // switch(RF_Process()) // { // case RF_IDLE: // { // } // break; // case RF_RX_DONE: // { // if (rxCb) // { // //接收到的数据已放在调用@myRadio_receiver时传入的缓存地址中 // rfRxPacket.len = 0; // rfRxPacket.rssi = RF_GetPacketRssi(); // rxCb(RX_STA_SECCESS, rfRxPacket); // } // } // break; // case RF_TX_DONE: // { // rxCb(TX_STA_SECCESS, rfRxPacket); // } // break; // case RF_ERROR: // { // rxCb(RX_STA_PAYLOAD_ERROR, rfRxPacket); // } // break; // default: // break; // } } /** * @brief 退出射频进入休眠 * */ void myRadio_abort(void) { if (rf_handle == 0) { return; } RF_EXT_PA_TO_IDLE(); Cmt2300_GoStby(); } /** * @brief 获取射频工作中心频率 * * @return uint32_t */ uint32_t myRadio_getFrequency(void) { if (rf_handle == 0) { return 0; } return rfFrequence; } /** * @brief 设置射频工作信道 * * @param freq * */ void myRadio_setFrequency(uint32_t freq) { if (rf_handle == 0) { return; } rfFrequence = freq; Cmt2300_SetFrequencyChannel(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; Cmt2300_WriteReg(CMT2300_CUS_TX8, txPowerTab_20dBm[getRfPowerTabIndex(power)].value[0]); Cmt2300_WriteReg(CMT2300_CUS_TX9, txPowerTab_20dBm[getRfPowerTabIndex(power)].value[1]); } /** * 获取射频波特率 * @param : br-> */ uint32_t myRadio_getBaudrate(void) { if (rf_handle == 0) { return 0; } return rfBaudrate; } /** * 设置射频波特率 * @param : br-> */ void myRadio_setBaudrate(uint32_t br) { 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 Cmt2300_GetRssiDBm(); } /** * @brief 无线发送数据包 * * @param packet */ void myRadio_transmit(rfTxPacket_ts *packet) { if (rf_handle == 0) { return; } RF_EXT_PA_TO_TX(); RF_StartTx(packet->payload, packet->len, 1000); } /** * @brief 进入无线接收 * 固定长度包 */ void myRadio_receiver(void) { if (rf_handle == 0) { return; } RF_EXT_PA_TO_RX(); RF_StartRx(rfRxPacket.payload, 0, ~0); } void myRadio_setCtrl(controlMode_te mode, uint32_t value) { if (rf_handle == 0) { return; } myRadio_init(0, 0); Cmt2300_SetFrequencyChannel(rfFrequence); switch (mode) { case RADIO_EXT_CONTROL_TX_UNMODULATED: { RF_EXT_PA_TO_TX(); Cmt2300_GoStby(); Cmt2300_GoTx(); myRadio_setTxPower(rfTxPower); } break; case RADIO_EXT_CONTROL_TX_MODULATED: { RF_EXT_PA_TO_TX(); } break; case RADIO_EXT_CONTROL_RX_SENSITIVITY: { RF_EXT_PA_TO_RX(); Cmt2300_GoStby(); Cmt2300_SetRssiDetMode(RDS_ALWAYS); // package type to direct cmtCusPkt1_tu cmtCusPkt1; cmtCusPkt1.bits.data_mode = DM_DIRECT; Cmt2300_WriteReg(CMT2300_CUS_PKT1, cmtCusPkt1.value); Cmt2300_WriteReg(CMT2300_CUS_TX1, 0x54); Cmt2300_ConfigGpio( CMT2300_GPIO1_SEL_INT1 | /* INT1 > GPIO1 */ CMT2300_GPIO2_SEL_INT2 | /* INT2 > GPIO2 */ CMT2300_GPIO3_SEL_DOUT ); Cmt2300_GoRx(); } break; default: break; } } /**-------------------------radio funtion----------------------------------**/ uint8_t getRfPowerTabIndex(int8_t power) { for (int i = 0; i < sizeof(txPowerTab_20dBm)/sizeof(txPowerTab_ts); i++) { if (txPowerTab_20dBm[i].dBm >= power) { return i; } } return sizeof(txPowerTab_20dBm)/sizeof(txPowerTab_ts) - 1; } /**-------------------------radio funtion end----------------------------------**/