1

Committer:
advxolltm
Date:
Mon Jun 06 16:37:12 2022 +0000
Revision:
22:fc88e265f425
Parent:
17:5f34cbe2ac53
123

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wayne Roberts 0:9c052ff8dd6a 1 /* Only for NUCLEO boards: prevent compiling for MOTE_L152RC and typeABZ discovery */
Wayne Roberts 17:5f34cbe2ac53 2 #if defined(TARGET_FF_ARDUINO) && !defined(TARGET_DISCO_L072CZ_LRWAN1) && !defined(TARGET_MOTE_L152RC)
Wayne Roberts 0:9c052ff8dd6a 3 #include "radio.h"
Wayne Roberts 0:9c052ff8dd6a 4 #ifdef SX127x_H
Wayne Roberts 0:9c052ff8dd6a 5 #include "SPIu.h"
Wayne Roberts 0:9c052ff8dd6a 6
Wayne Roberts 0:9c052ff8dd6a 7 SPIu spi(D11, D12, D13); // mosi, miso, sclk
Wayne Roberts 0:9c052ff8dd6a 8 // dio0, dio1, nss, spi, rst
Wayne Roberts 0:9c052ff8dd6a 9 SX127x Radio::radio( D2, D3, D10, spi, A0); // sx127[62] arduino shield
Wayne Roberts 0:9c052ff8dd6a 10 SX127x_lora Radio::lora(radio);
Wayne Roberts 0:9c052ff8dd6a 11 SX127x_fsk Radio::fsk(radio);
Wayne Roberts 0:9c052ff8dd6a 12
Wayne Roberts 0:9c052ff8dd6a 13 InterruptIn Radio::dio0(D2);
Wayne Roberts 0:9c052ff8dd6a 14 InterruptIn Radio::dio1(D3);
Wayne Roberts 0:9c052ff8dd6a 15
Wayne Roberts 0:9c052ff8dd6a 16 typedef enum {
Wayne Roberts 0:9c052ff8dd6a 17 SHIELD_TYPE_NONE = 0,
Wayne Roberts 0:9c052ff8dd6a 18 SHIELD_TYPE_LAS,
Wayne Roberts 0:9c052ff8dd6a 19 SHIELD_TYPE_MAS,
Wayne Roberts 0:9c052ff8dd6a 20 } shield_type_e;
Wayne Roberts 0:9c052ff8dd6a 21 shield_type_e shield_type;
Wayne Roberts 0:9c052ff8dd6a 22
Wayne Roberts 0:9c052ff8dd6a 23 #ifdef TARGET_FF_MORPHO
Wayne Roberts 0:9c052ff8dd6a 24 DigitalOut pc3(PC_3); // debug RX indication, for nucleo boards
Wayne Roberts 0:9c052ff8dd6a 25 #endif /* TARGET_FF_MORPHO */
Wayne Roberts 0:9c052ff8dd6a 26 DigitalInOut rfsw(A4);
Wayne Roberts 0:9c052ff8dd6a 27 void Radio::rfsw_callback()
Wayne Roberts 0:9c052ff8dd6a 28 {
Wayne Roberts 0:9c052ff8dd6a 29 if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER)
Wayne Roberts 0:9c052ff8dd6a 30 rfsw = 1;
Wayne Roberts 0:9c052ff8dd6a 31 else
Wayne Roberts 0:9c052ff8dd6a 32 rfsw = 0;
Wayne Roberts 0:9c052ff8dd6a 33
Wayne Roberts 17:5f34cbe2ac53 34 #ifdef TARGET_FF_MORPHO
Wayne Roberts 0:9c052ff8dd6a 35 if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE)
Wayne Roberts 0:9c052ff8dd6a 36 pc3 = 1;
Wayne Roberts 0:9c052ff8dd6a 37 else
Wayne Roberts 0:9c052ff8dd6a 38 pc3 = 0;
Wayne Roberts 17:5f34cbe2ac53 39 #endif /* TARGET_FF_MORPHO */
Wayne Roberts 0:9c052ff8dd6a 40 }
Wayne Roberts 0:9c052ff8dd6a 41
Wayne Roberts 0:9c052ff8dd6a 42 void
Wayne Roberts 0:9c052ff8dd6a 43 Radio::set_tx_dbm(int8_t dbm)
Wayne Roberts 0:9c052ff8dd6a 44 {
Wayne Roberts 0:9c052ff8dd6a 45 RegPdsTrim1_t pds_trim;
Wayne Roberts 6:b7bbf31e06e4 46 uint8_t v, adr, pa_test_adr;
Wayne Roberts 0:9c052ff8dd6a 47
Wayne Roberts 5:ab124d3842a8 48 if (radio.type == SX1276) {
Wayne Roberts 0:9c052ff8dd6a 49 adr = REG_PDSTRIM1_SX1276;
Wayne Roberts 5:ab124d3842a8 50 pa_test_adr = REG_PATEST_SX1276;
Wayne Roberts 5:ab124d3842a8 51 } else {
Wayne Roberts 0:9c052ff8dd6a 52 adr = REG_PDSTRIM1_SX1272;
Wayne Roberts 5:ab124d3842a8 53 pa_test_adr = REG_PATEST_SX1272;
Wayne Roberts 5:ab124d3842a8 54 }
Wayne Roberts 0:9c052ff8dd6a 55
Wayne Roberts 5:ab124d3842a8 56 v = radio.read_reg(pa_test_adr);
Wayne Roberts 5:ab124d3842a8 57 if (dbm == PA_OFF_DBM) {
Wayne Roberts 5:ab124d3842a8 58 /* for bench testing: prevent overloading receiving station (very low TX power) */
Wayne Roberts 5:ab124d3842a8 59 v &= ~0x20; // turn off pu_regpa_n: disable PA
Wayne Roberts 5:ab124d3842a8 60 radio.write_reg(pa_test_adr, v);
Wayne Roberts 5:ab124d3842a8 61 return;
Wayne Roberts 5:ab124d3842a8 62 } else if ((v & 0x20) == 0) {
Wayne Roberts 5:ab124d3842a8 63 v |= 0x20; // turn on pu_regpa_n: enable PA
Wayne Roberts 5:ab124d3842a8 64 radio.write_reg(pa_test_adr, v);
Wayne Roberts 5:ab124d3842a8 65 }
Wayne Roberts 5:ab124d3842a8 66
Wayne Roberts 0:9c052ff8dd6a 67 pds_trim.octet = radio.read_reg(adr);
Wayne Roberts 0:9c052ff8dd6a 68
Wayne Roberts 0:9c052ff8dd6a 69 if (shield_type == SHIELD_TYPE_LAS)
Wayne Roberts 0:9c052ff8dd6a 70 radio.RegPaConfig.bits.PaSelect = 1;
Wayne Roberts 0:9c052ff8dd6a 71 else
Wayne Roberts 0:9c052ff8dd6a 72 radio.RegPaConfig.bits.PaSelect = 0;
Wayne Roberts 0:9c052ff8dd6a 73
Wayne Roberts 0:9c052ff8dd6a 74 if (radio.RegPaConfig.bits.PaSelect) {
Wayne Roberts 0:9c052ff8dd6a 75 /* PABOOST used: +2dbm to +17, or +20 */
Wayne Roberts 0:9c052ff8dd6a 76 if (dbm > 17) {
Wayne Roberts 0:9c052ff8dd6a 77 if (dbm > 20)
Wayne Roberts 0:9c052ff8dd6a 78 dbm = 20;
Wayne Roberts 0:9c052ff8dd6a 79 dbm -= 3;
Wayne Roberts 0:9c052ff8dd6a 80 pds_trim.bits.prog_txdac = 7;
Wayne Roberts 0:9c052ff8dd6a 81 radio.write_reg(adr, pds_trim.octet);
Wayne Roberts 0:9c052ff8dd6a 82 ocp(150);
Wayne Roberts 0:9c052ff8dd6a 83 } else
Wayne Roberts 0:9c052ff8dd6a 84 ocp(120);
Wayne Roberts 0:9c052ff8dd6a 85
Wayne Roberts 0:9c052ff8dd6a 86 if (dbm > 1)
Wayne Roberts 0:9c052ff8dd6a 87 radio.RegPaConfig.bits.OutputPower = dbm - 2;
Wayne Roberts 0:9c052ff8dd6a 88 } else {
Wayne Roberts 0:9c052ff8dd6a 89 /* RFO used: -1 to +14dbm */
Wayne Roberts 0:9c052ff8dd6a 90 ocp(80);
Wayne Roberts 0:9c052ff8dd6a 91 if (dbm < 15)
Wayne Roberts 0:9c052ff8dd6a 92 radio.RegPaConfig.bits.OutputPower = dbm + 1;
Wayne Roberts 0:9c052ff8dd6a 93 }
Wayne Roberts 0:9c052ff8dd6a 94 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
Wayne Roberts 0:9c052ff8dd6a 95
Wayne Roberts 0:9c052ff8dd6a 96 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
Wayne Roberts 0:9c052ff8dd6a 97 if (radio.RegPaConfig.bits.PaSelect) {
Wayne Roberts 0:9c052ff8dd6a 98 dbm = radio.RegPaConfig.bits.OutputPower + pds_trim.bits.prog_txdac - 2;
Wayne Roberts 0:9c052ff8dd6a 99 } else {
Wayne Roberts 0:9c052ff8dd6a 100 dbm = radio.RegPaConfig.bits.OutputPower - 1;
Wayne Roberts 0:9c052ff8dd6a 101 }
Wayne Roberts 0:9c052ff8dd6a 102 }
Wayne Roberts 0:9c052ff8dd6a 103
Wayne Roberts 0:9c052ff8dd6a 104 void Radio::boardInit()
Wayne Roberts 0:9c052ff8dd6a 105 {
Wayne Roberts 0:9c052ff8dd6a 106 printf("boardInit sx127x-ff-arduino ");
Wayne Roberts 0:9c052ff8dd6a 107 rfsw.input();
Wayne Roberts 0:9c052ff8dd6a 108 if (rfsw.read()) {
Wayne Roberts 0:9c052ff8dd6a 109 shield_type = SHIELD_TYPE_LAS;
Wayne Roberts 0:9c052ff8dd6a 110 printf("LAS\r\n");
Wayne Roberts 0:9c052ff8dd6a 111 } else {
Wayne Roberts 0:9c052ff8dd6a 112 shield_type = SHIELD_TYPE_MAS;
Wayne Roberts 0:9c052ff8dd6a 113 printf("MAS\r\n");
Wayne Roberts 0:9c052ff8dd6a 114 }
Wayne Roberts 0:9c052ff8dd6a 115
Wayne Roberts 0:9c052ff8dd6a 116 rfsw.output();
Wayne Roberts 0:9c052ff8dd6a 117 }
Wayne Roberts 0:9c052ff8dd6a 118
Wayne Roberts 0:9c052ff8dd6a 119 #endif /* ..SX127x_H */
Wayne Roberts 0:9c052ff8dd6a 120 #endif /* ...sx127x shield */
Wayne Roberts 0:9c052ff8dd6a 121