1
Diff: radio_ff_arduino_sx127x.cpp
- Revision:
- 0:9c052ff8dd6a
- Child:
- 5:ab124d3842a8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/radio_ff_arduino_sx127x.cpp Thu Jul 05 17:31:54 2018 -0700 @@ -0,0 +1,105 @@ +/* Only for NUCLEO boards: prevent compiling for MOTE_L152RC and typeABZ discovery */ +#if defined(TARGET_FF_ARDUINO) && defined(TARGET_FF_MORPHO) && !defined(TARGET_DISCO_L072CZ_LRWAN1) +#include "radio.h" +#ifdef SX127x_H +#include "SPIu.h" + +SPIu spi(D11, D12, D13); // mosi, miso, sclk +// dio0, dio1, nss, spi, rst +SX127x Radio::radio( D2, D3, D10, spi, A0); // sx127[62] arduino shield +SX127x_lora Radio::lora(radio); +SX127x_fsk Radio::fsk(radio); + +InterruptIn Radio::dio0(D2); +InterruptIn Radio::dio1(D3); + +typedef enum { + SHIELD_TYPE_NONE = 0, + SHIELD_TYPE_LAS, + SHIELD_TYPE_MAS, +} shield_type_e; +shield_type_e shield_type; + +#ifdef TARGET_FF_MORPHO +DigitalOut pc3(PC_3); // debug RX indication, for nucleo boards +#endif /* TARGET_FF_MORPHO */ +DigitalInOut rfsw(A4); +void Radio::rfsw_callback() +{ + if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER) + rfsw = 1; + else + rfsw = 0; + + if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE) + pc3 = 1; + else + pc3 = 0; +} + +void +Radio::set_tx_dbm(int8_t dbm) +{ + RegPdsTrim1_t pds_trim; + uint8_t adr; + + if (radio.type == SX1276) + adr = REG_PDSTRIM1_SX1276; + else + adr = REG_PDSTRIM1_SX1272; + + pds_trim.octet = radio.read_reg(adr); + + if (shield_type == SHIELD_TYPE_LAS) + radio.RegPaConfig.bits.PaSelect = 1; + else + radio.RegPaConfig.bits.PaSelect = 0; + + if (radio.RegPaConfig.bits.PaSelect) { + /* PABOOST used: +2dbm to +17, or +20 */ + if (dbm > 17) { + if (dbm > 20) + dbm = 20; + dbm -= 3; + pds_trim.bits.prog_txdac = 7; + radio.write_reg(adr, pds_trim.octet); + ocp(150); + } else + ocp(120); + + if (dbm > 1) + radio.RegPaConfig.bits.OutputPower = dbm - 2; + } else { + /* RFO used: -1 to +14dbm */ + ocp(80); + if (dbm < 15) + radio.RegPaConfig.bits.OutputPower = dbm + 1; + } + radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet); + + radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG); + if (radio.RegPaConfig.bits.PaSelect) { + dbm = radio.RegPaConfig.bits.OutputPower + pds_trim.bits.prog_txdac - 2; + } else { + dbm = radio.RegPaConfig.bits.OutputPower - 1; + } +} + +void Radio::boardInit() +{ + printf("boardInit sx127x-ff-arduino "); + rfsw.input(); + if (rfsw.read()) { + shield_type = SHIELD_TYPE_LAS; + printf("LAS\r\n"); + } else { + shield_type = SHIELD_TYPE_MAS; + printf("MAS\r\n"); + } + + rfsw.output(); +} + +#endif /* ..SX127x_H */ +#endif /* ...sx127x shield */ +