wayne roberts / Mbed OS utility_sx12xx
Committer:
Wayne Roberts
Date:
Mon Aug 20 18:13:09 2018 -0700
Revision:
1:0817a150122b
Child:
5:1e5cb7139acb
add source files

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wayne Roberts 1:0817a150122b 1 #include "radio.h"
Wayne Roberts 1:0817a150122b 2
Wayne Roberts 1:0817a150122b 3 #define RADIO_RESET PC_2 //NorAm_Mote Reset_sx
Wayne Roberts 1:0817a150122b 4 #define RADIO_MOSI PB_15 //NorAm_Mote SPI2 Mosi
Wayne Roberts 1:0817a150122b 5 #define RADIO_MISO PB_14 //NorAm_Mote SPI2 Miso
Wayne Roberts 1:0817a150122b 6 #define RADIO_SCLK PB_13 //NorAm_Mote SPI2 Clk
Wayne Roberts 1:0817a150122b 7 #define RADIO_NSS PB_12 //NorAm_Mote SPI2 Nss
Wayne Roberts 1:0817a150122b 8
Wayne Roberts 1:0817a150122b 9 #define RADIO_DIO_0 PC_6 //NorAm_Mote DIO0
Wayne Roberts 1:0817a150122b 10 #define RADIO_DIO_1 PC_10 //NorAm_Mote DIO1
Wayne Roberts 1:0817a150122b 11 #define RADIO_DIO_2 PC_8 //NorAm_Mote DIO2
Wayne Roberts 1:0817a150122b 12 #define RADIO_DIO_3 PB_4 //NorAm_Mote DIO3
Wayne Roberts 1:0817a150122b 13 #define RADIO_DIO_4 PB_5 //NorAm_Mote DIO4
Wayne Roberts 1:0817a150122b 14 #define RADIO_DIO_5 PB_6 //NorAm_Mote DIO5
Wayne Roberts 1:0817a150122b 15
Wayne Roberts 1:0817a150122b 16 #define RFSW1 PC_4 //NorAm_Mote RFSwitch_CNTR_1
Wayne Roberts 1:0817a150122b 17 #define RFSW2 PC_13 //NorAm_Mote RFSwitch_CNTR_2
Wayne Roberts 1:0817a150122b 18
Wayne Roberts 1:0817a150122b 19 SPI spi(RADIO_MOSI, RADIO_MISO, RADIO_SCLK); // mosi, miso, sclk
Wayne Roberts 1:0817a150122b 20 // dio0, dio1, nss, spi, rst
Wayne Roberts 1:0817a150122b 21 SX127x Radio::radio(RADIO_DIO_0, RADIO_DIO_1, RADIO_NSS, spi, RADIO_RESET);
Wayne Roberts 1:0817a150122b 22 SX127x_lora Radio::lora(radio);
Wayne Roberts 1:0817a150122b 23 SX127x_fsk Radio::fsk(radio);
Wayne Roberts 1:0817a150122b 24
Wayne Roberts 1:0817a150122b 25 DigitalOut rfsw1(RFSW1);
Wayne Roberts 1:0817a150122b 26 DigitalOut rfsw2(RFSW2);
Wayne Roberts 1:0817a150122b 27
Wayne Roberts 1:0817a150122b 28 DigitalOut red(LED1);
Wayne Roberts 1:0817a150122b 29 DigitalOut yellow(LED3);
Wayne Roberts 1:0817a150122b 30 #define LED_OFF 1
Wayne Roberts 1:0817a150122b 31 #define LED_ON 0
Wayne Roberts 1:0817a150122b 32
Wayne Roberts 1:0817a150122b 33 void Radio::rfsw_callback()
Wayne Roberts 1:0817a150122b 34 {
Wayne Roberts 1:0817a150122b 35 if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER) { // start of transmission
Wayne Roberts 1:0817a150122b 36 red = LED_ON;
Wayne Roberts 1:0817a150122b 37 yellow = LED_OFF;
Wayne Roberts 1:0817a150122b 38 if (radio.HF) {
Wayne Roberts 1:0817a150122b 39 if (radio.RegPaConfig.bits.PaSelect) { // if PA_BOOST
Wayne Roberts 1:0817a150122b 40 rfsw2 = 0;
Wayne Roberts 1:0817a150122b 41 rfsw1 = 1;
Wayne Roberts 1:0817a150122b 42 } else { // RFO to power amp
Wayne Roberts 1:0817a150122b 43 rfsw2 = 1;
Wayne Roberts 1:0817a150122b 44 rfsw1 = 0;
Wayne Roberts 1:0817a150122b 45 }
Wayne Roberts 1:0817a150122b 46 } else {
Wayne Roberts 1:0817a150122b 47 // todo: sx1276
Wayne Roberts 1:0817a150122b 48 }
Wayne Roberts 1:0817a150122b 49 } else if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE || radio.RegOpMode.bits.Mode == RF_OPMODE_CAD) { // start of reception
Wayne Roberts 1:0817a150122b 50 red = LED_OFF;
Wayne Roberts 1:0817a150122b 51 yellow = LED_ON;
Wayne Roberts 1:0817a150122b 52 if (radio.HF) {
Wayne Roberts 1:0817a150122b 53 rfsw2 = 1;
Wayne Roberts 1:0817a150122b 54 rfsw1 = 1;
Wayne Roberts 1:0817a150122b 55 } else {
Wayne Roberts 1:0817a150122b 56 // todo: sx1276
Wayne Roberts 1:0817a150122b 57 }
Wayne Roberts 1:0817a150122b 58 } else { // RF switch shutdown
Wayne Roberts 1:0817a150122b 59 yellow = LED_OFF;
Wayne Roberts 1:0817a150122b 60 red = LED_OFF;
Wayne Roberts 1:0817a150122b 61 rfsw2 = 0;
Wayne Roberts 1:0817a150122b 62 rfsw1 = 0;
Wayne Roberts 1:0817a150122b 63 }
Wayne Roberts 1:0817a150122b 64 }
Wayne Roberts 1:0817a150122b 65
Wayne Roberts 1:0817a150122b 66 void Radio::tx_dbm_print()
Wayne Roberts 1:0817a150122b 67 {
Wayne Roberts 1:0817a150122b 68 int dbm;
Wayne Roberts 1:0817a150122b 69
Wayne Roberts 1:0817a150122b 70 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
Wayne Roberts 1:0817a150122b 71 if (radio.RegPaConfig.bits.PaSelect) {
Wayne Roberts 1:0817a150122b 72 RegPdsTrim1_t pds_trim;
Wayne Roberts 1:0817a150122b 73 uint8_t adr;
Wayne Roberts 1:0817a150122b 74
Wayne Roberts 1:0817a150122b 75 if (radio.type == SX1276)
Wayne Roberts 1:0817a150122b 76 adr = REG_PDSTRIM1_SX1276;
Wayne Roberts 1:0817a150122b 77 else
Wayne Roberts 1:0817a150122b 78 adr = REG_PDSTRIM1_SX1272;
Wayne Roberts 1:0817a150122b 79
Wayne Roberts 1:0817a150122b 80 pds_trim.octet = radio.read_reg(adr);
Wayne Roberts 1:0817a150122b 81 dbm = radio.RegPaConfig.bits.OutputPower + pds_trim.bits.prog_txdac - 2;
Wayne Roberts 1:0817a150122b 82 } else {
Wayne Roberts 1:0817a150122b 83 dbm = radio.RegPaConfig.bits.OutputPower - 21;
Wayne Roberts 1:0817a150122b 84 }
Wayne Roberts 1:0817a150122b 85 pc.printf(":%d", dbm);
Wayne Roberts 1:0817a150122b 86 }
Wayne Roberts 1:0817a150122b 87
Wayne Roberts 1:0817a150122b 88 bool Radio::tx_dbm_write(const char* str)
Wayne Roberts 1:0817a150122b 89 {
Wayne Roberts 1:0817a150122b 90 int dbm;
Wayne Roberts 1:0817a150122b 91
Wayne Roberts 1:0817a150122b 92 sscanf(str, "%d", &dbm);
Wayne Roberts 1:0817a150122b 93
Wayne Roberts 1:0817a150122b 94 if (dbm > 20) {
Wayne Roberts 1:0817a150122b 95 radio.RegPaConfig.bits.PaSelect = 0; // RFO to external amplifier
Wayne Roberts 1:0817a150122b 96 dbm -= 20;
Wayne Roberts 1:0817a150122b 97 if (dbm < 15)
Wayne Roberts 1:0817a150122b 98 radio.RegPaConfig.bits.OutputPower = dbm + 1;
Wayne Roberts 1:0817a150122b 99 } else {
Wayne Roberts 1:0817a150122b 100 uint8_t adr;
Wayne Roberts 1:0817a150122b 101 RegPdsTrim1_t pds_trim;
Wayne Roberts 1:0817a150122b 102
Wayne Roberts 1:0817a150122b 103 radio.RegPaConfig.bits.PaSelect = 1; // PA_BOOST
Wayne Roberts 1:0817a150122b 104 /* PABOOST used: +2dbm to +17, or +20 */
Wayne Roberts 1:0817a150122b 105
Wayne Roberts 1:0817a150122b 106 if (radio.type == SX1276)
Wayne Roberts 1:0817a150122b 107 adr = REG_PDSTRIM1_SX1276;
Wayne Roberts 1:0817a150122b 108 else
Wayne Roberts 1:0817a150122b 109 adr = REG_PDSTRIM1_SX1272;
Wayne Roberts 1:0817a150122b 110
Wayne Roberts 1:0817a150122b 111 pds_trim.octet = radio.read_reg(adr);
Wayne Roberts 1:0817a150122b 112 if (dbm > 17) {
Wayne Roberts 1:0817a150122b 113 dbm -= 3;
Wayne Roberts 1:0817a150122b 114 pds_trim.bits.prog_txdac = 7;
Wayne Roberts 1:0817a150122b 115 radio.write_reg(adr, pds_trim.octet);
Wayne Roberts 1:0817a150122b 116 }
Wayne Roberts 1:0817a150122b 117
Wayne Roberts 1:0817a150122b 118 if (dbm > 1)
Wayne Roberts 1:0817a150122b 119 radio.RegPaConfig.bits.OutputPower = dbm - 2;
Wayne Roberts 1:0817a150122b 120 }
Wayne Roberts 1:0817a150122b 121
Wayne Roberts 1:0817a150122b 122 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
Wayne Roberts 1:0817a150122b 123
Wayne Roberts 1:0817a150122b 124 return false;
Wayne Roberts 1:0817a150122b 125 }
Wayne Roberts 1:0817a150122b 126
Wayne Roberts 1:0817a150122b 127 void Radio::targetInit()
Wayne Roberts 1:0817a150122b 128 {
Wayne Roberts 1:0817a150122b 129 radio.rf_switch = rfsw_callback;
Wayne Roberts 1:0817a150122b 130 }