Hardware Abstraction Layer, permitting any LoRa application to use any LoRa radio chip

Dependents:   alarm_slave alarm_master lora_p2p lorawan1v1 ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers radio_ff_arduino_sx127x.cpp Source File

radio_ff_arduino_sx127x.cpp

00001 /* Only for NUCLEO boards: prevent compiling for MOTE_L152RC and typeABZ discovery */
00002 #if defined(TARGET_FF_ARDUINO) && !defined(TARGET_DISCO_L072CZ_LRWAN1) && !defined(TARGET_MOTE_L152RC)
00003 #include "radio.h"
00004 #ifdef SX127x_H 
00005 #include "SPIu.h"
00006 
00007 SPIu spi(D11, D12, D13); // mosi, miso, sclk
00008 //                  dio0, dio1, nss, spi, rst
00009 SX127x Radio::radio(  D2,   D3, D10, spi, A0); // sx127[62] arduino shield
00010 SX127x_lora Radio::lora(radio);
00011 SX127x_fsk Radio::fsk(radio);
00012 
00013 InterruptIn Radio::dio0(D2);
00014 InterruptIn Radio::dio1(D3);
00015 
00016 typedef enum {
00017     SHIELD_TYPE_NONE = 0,
00018     SHIELD_TYPE_LAS,
00019     SHIELD_TYPE_MAS,
00020 } shield_type_e;
00021 shield_type_e shield_type;
00022 
00023 #ifdef TARGET_FF_MORPHO
00024 DigitalOut pc3(PC_3);   // debug RX indication, for nucleo boards
00025 #endif /* TARGET_FF_MORPHO */
00026 DigitalInOut rfsw(A4);
00027 void Radio::rfsw_callback()
00028 {
00029     if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER)
00030         rfsw = 1;
00031     else
00032         rfsw = 0;
00033 
00034 #ifdef TARGET_FF_MORPHO
00035     if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE)
00036         pc3 = 1;
00037     else
00038         pc3 = 0;
00039 #endif /* TARGET_FF_MORPHO */
00040 }
00041 
00042 void
00043 Radio::set_tx_dbm(int8_t dbm)
00044 {
00045     RegPdsTrim1_t pds_trim;
00046     uint8_t v, adr, pa_test_adr;
00047 
00048     if (radio.type == SX1276) {
00049         adr = REG_PDSTRIM1_SX1276;
00050         pa_test_adr = REG_PATEST_SX1276;
00051     } else {
00052         adr = REG_PDSTRIM1_SX1272;
00053         pa_test_adr = REG_PATEST_SX1272;
00054     }
00055        
00056     v = radio.read_reg(pa_test_adr);
00057     if (dbm == PA_OFF_DBM) {
00058         /* for bench testing: prevent overloading receiving station (very low TX power) */
00059         v &= ~0x20; // turn off pu_regpa_n: disable PA
00060         radio.write_reg(pa_test_adr, v);
00061         return;
00062     } else if ((v & 0x20) == 0) {
00063         v |= 0x20; // turn on pu_regpa_n: enable PA
00064         radio.write_reg(pa_test_adr, v);
00065     }
00066 
00067     pds_trim.octet = radio.read_reg(adr);   
00068 
00069     if (shield_type == SHIELD_TYPE_LAS)
00070         radio.RegPaConfig.bits.PaSelect = 1;
00071     else
00072         radio.RegPaConfig.bits.PaSelect = 0;
00073                 
00074     if (radio.RegPaConfig.bits.PaSelect) {
00075         /* PABOOST used: +2dbm to +17, or +20 */
00076         if (dbm > 17) {
00077             if (dbm > 20)
00078                 dbm = 20;
00079             dbm -= 3;
00080             pds_trim.bits.prog_txdac = 7;
00081             radio.write_reg(adr, pds_trim.octet);
00082             ocp(150);
00083         } else
00084             ocp(120);
00085 
00086         if (dbm > 1)
00087                 radio.RegPaConfig.bits.OutputPower = dbm - 2;
00088     } else {
00089         /* RFO used: -1 to +14dbm */
00090         ocp(80);
00091         if (dbm < 15)
00092             radio.RegPaConfig.bits.OutputPower = dbm + 1;
00093     }
00094     radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
00095 
00096     radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
00097     if (radio.RegPaConfig.bits.PaSelect) {
00098         dbm = radio.RegPaConfig.bits.OutputPower + pds_trim.bits.prog_txdac - 2;
00099     } else {
00100         dbm = radio.RegPaConfig.bits.OutputPower - 1;
00101     }
00102 }
00103 
00104 void Radio::boardInit()
00105 {
00106     printf("boardInit sx127x-ff-arduino ");
00107     rfsw.input();
00108     if (rfsw.read()) {
00109         shield_type = SHIELD_TYPE_LAS;
00110         printf("LAS\r\n");
00111     } else {
00112         shield_type = SHIELD_TYPE_MAS;
00113         printf("MAS\r\n");
00114     }
00115     
00116     rfsw.output();
00117 }
00118 
00119 #endif /* ..SX127x_H */
00120 #endif /* ...sx127x shield */
00121