Hardware Abstraction Layer, permitting any LoRa application to use any LoRa radio chip
Dependents: alarm_slave alarm_master lora_p2p lorawan1v1 ... more
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
Generated on Wed Jul 13 2022 17:56:01 by 1.7.2