1

TARGET_DISCO_L072CZ_LRWAN1/radio_typeABZ.cpp

Committer:
Wayne Roberts
Date:
2018-11-25
Revision:
5:ab124d3842a8
Parent:
0:9c052ff8dd6a
Child:
18:78c5e644d37a

File content as of revision 5:ab124d3842a8:

#include "radio.h"

#define SSA_BOARD   1

#include "SPIu.h"
SPIu spi(PA_7, PA_6, PB_3); // mosi, miso, sclk
//                  dio0, dio1,  nss,  spi,  rst
SX127x Radio::radio(PB_4, PB_1, PA_15, spi, PC_0); // sx1276 arduino shield
SX127x_lora Radio::lora(radio);
SX127x_fsk Radio::fsk(radio);

InterruptIn Radio::dio0(PB_4);
InterruptIn Radio::dio1(PB_1);

#define CRF1    PA_1
#define CRF2    PC_2
#define CRF3    PC_1
DigitalOut Vctl1(CRF1);
DigitalOut Vctl2(CRF2);
DigitalOut Vctl3(CRF3);

void Radio::rfsw_callback()
{
    if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER) {
        Vctl1 = 0;        
        if (radio.RegPaConfig.bits.PaSelect) {
            Vctl2 = 0;
            Vctl3 = 1;                        
        } else {
            Vctl2 = 1;
            Vctl3 = 0;            
        }
    } else {
        if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE)
            Vctl1 = 1;
        else
            Vctl1 = 0;
        
        Vctl2 = 0;
        Vctl3 = 0;        
    }
}

void
Radio::set_tx_dbm(int8_t dbm)
{
    RegPdsTrim1_t pds_trim;
    unsigned v = radio.read_reg(REG_PATEST_SX1276);

    if (dbm == PA_OFF_DBM) {
        /* for bench testing: prevent overloading receiving station (very low TX power) */
        v &= ~0x20; // turn off pu_regpa_n: disable PA
        radio.write_reg(REG_PATEST_SX1276, v);
        return;
    } else if ((v & 0x20) == 0) {
        v |= 0x20; // turn on pu_regpa_n: enable PA
        radio.write_reg(REG_PATEST_SX1276, v);
    }

    pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1276);

    if (dbm > 13) {
        radio.RegPaConfig.bits.PaSelect = 1;
        if (dbm > 17) {
            pds_trim.bits.prog_txdac = 7;
            dbm -= 3;
            ocp(150);
        } else {
            pds_trim.bits.prog_txdac = 4;
            ocp(120);
        }

        radio.RegPaConfig.bits.OutputPower = dbm - 2;
    } else {
        pds_trim.bits.prog_txdac = 4;
        radio.RegPaConfig.bits.PaSelect = 0;
        radio.RegPaConfig.bits.OutputPower = dbm + 1;
        ocp(80);
    }

    radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
    radio.write_reg(REG_PDSTRIM1_SX1276, pds_trim.octet);
}

#ifdef SSA_BOARD
DigitalOut pa12(PA_12); // tcxo enable
DigitalOut pa11(PA_11); // sw9v enable -> sw3v3
#endif
void Radio::boardInit()
{
#ifdef SSA_BOARD
    pa12 = 1; // tcxo
    pa11 = 1; // sw9v -> sw3v3
#endif    
}