1

TARGET_MOTE_L152RC/radio_mote.cpp

Committer:
Wayne Roberts
Date:
2018-07-05
Revision:
0:9c052ff8dd6a
Child:
5:ab124d3842a8

File content as of revision 0:9c052ff8dd6a:

#include "radio.h"

#define RADIO_RESET              PC_2 //NorAm_Mote Reset_sx
#define RADIO_MOSI               PB_15 //NorAm_Mote SPI2 Mosi
#define RADIO_MISO               PB_14 //NorAm_Mote SPI2 Miso
#define RADIO_SCLK               PB_13 //NorAm_Mote  SPI2 Clk
#define RADIO_NSS                PB_12 //NorAm_Mote SPI2 Nss
 
#define RADIO_DIO_0              PC_6 //NorAm_Mote DIO0 
#define RADIO_DIO_1              PC_10 //NorAm_Mote DIO1 
#define RADIO_DIO_2              PC_8 //NorAm_Mote DIO2 
#define RADIO_DIO_3              PB_4 //NorAm_Mote DIO3 
#define RADIO_DIO_4              PB_5 //NorAm_Mote DIO4 
#define RADIO_DIO_5              PB_6 //NorAm_Mote DIO5
 
#define RFSW1                    PC_4 //NorAm_Mote RFSwitch_CNTR_1
#define RFSW2                    PC_13 //NorAm_Mote RFSwitch_CNTR_2

//                    txpow:   0  1  2  3  4  5  6  7  8  9 10 11 12 13 14  15  16  17  18  19
const uint8_t PaBTable[20] = { 0, 0, 0, 0, 0, 1, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15 };

//                    txpow:  20 21 22 23 24 25 26 27 28 29 30
const uint8_t RfoTable[11] = { 1, 1, 1, 2, 2, 3, 4, 5, 6, 8, 9 };
 
SPI spi(RADIO_MOSI, RADIO_MISO, RADIO_SCLK); // mosi, miso, sclk
//                   dio0, dio1, nss, spi, rst
SX127x Radio::radio(RADIO_DIO_0, RADIO_DIO_1, RADIO_NSS, spi, RADIO_RESET); // sx1276 arduino shield
SX127x_lora Radio::lora(radio);
SX127x_fsk Radio::fsk(radio);

DigitalOut rfsw1(RFSW1);
DigitalOut rfsw2(RFSW2);

InterruptIn Radio::dio0(RADIO_DIO_0);
InterruptIn Radio::dio1(RADIO_DIO_1);

DigitalOut red(LED1);
DigitalOut yellow(LED3);
#define LED_OFF     1
#define LED_ON      0

void Radio::rfsw_callback()
{
    if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER) {  // start of transmission
        red = LED_ON;
        yellow = LED_OFF;
        if (radio.HF) {
            if (radio.RegPaConfig.bits.PaSelect) { // if PA_BOOST
                rfsw2 = 0;
                rfsw1 = 1;
            } else { // RFO to power amp
                rfsw2 = 1;
                rfsw1 = 0;            
            }
        } else {
            // todo: sx1276
        }
    } 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
        red = LED_OFF;
        yellow = LED_ON;
        if (radio.HF) {
            rfsw2 = 1;
            rfsw1 = 1;              
        } else {
            // todo: sx1276
        }
    } else { // RF switch shutdown
        yellow = LED_OFF;
        red = LED_OFF;
        rfsw2 = 0;
        rfsw1 = 0;     
    }
}

void
Radio::set_tx_dbm(int8_t dbm)
{
    //int i = dbm;
    RegPdsTrim1_t pds_trim;
    uint8_t adr;

    radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);

    if (dbm < 20) {
        radio.RegPaConfig.bits.PaSelect = 1;
        if (dbm < 0)
            dbm = 0;
        radio.RegPaConfig.bits.OutputPower = PaBTable[dbm];
    } else {
        radio.RegPaConfig.bits.PaSelect = 0;
        if (dbm > 30)
            dbm = 30;
        radio.RegPaConfig.bits.OutputPower = RfoTable[dbm-20];
    }

    if (radio.type == SX1276)
        adr = REG_PDSTRIM1_SX1276;
    else
        adr = REG_PDSTRIM1_SX1272;
       
    pds_trim.octet = radio.read_reg(adr);   

    if (radio.RegPaConfig.bits.PaSelect) {
        /* PABOOST used: +2dbm to +17, or +20 */
        if (dbm == 20) {
            dbm -= 3;
            pds_trim.bits.prog_txdac = 7;
            radio.write_reg(adr, pds_trim.octet);
            ocp(150);
        } else if (dbm < 18) {
            pds_trim.bits.prog_txdac = 5;
            radio.write_reg(adr, pds_trim.octet);
            ocp(120);
        }
    } else
        ocp(80);

    radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
} // ..set_tx_dbm()

void Radio::boardInit()
{
    red = LED_OFF;
    yellow = LED_OFF;
}