1

Committer:
Wayne Roberts
Date:
Tue Dec 04 15:22:54 2018 -0800
Revision:
6:b7bbf31e06e4
Parent:
5:ab124d3842a8
Child:
17:5f34cbe2ac53
add fixed payload length

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 0:9c052ff8dd6a 2 #if defined(TARGET_FF_ARDUINO) && defined(TARGET_FF_MORPHO) && !defined(TARGET_DISCO_L072CZ_LRWAN1)
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 0:9c052ff8dd6a 34 if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE)
Wayne Roberts 0:9c052ff8dd6a 35 pc3 = 1;
Wayne Roberts 0:9c052ff8dd6a 36 else
Wayne Roberts 0:9c052ff8dd6a 37 pc3 = 0;
Wayne Roberts 0:9c052ff8dd6a 38 }
Wayne Roberts 0:9c052ff8dd6a 39
Wayne Roberts 0:9c052ff8dd6a 40 void
Wayne Roberts 0:9c052ff8dd6a 41 Radio::set_tx_dbm(int8_t dbm)
Wayne Roberts 0:9c052ff8dd6a 42 {
Wayne Roberts 0:9c052ff8dd6a 43 RegPdsTrim1_t pds_trim;
Wayne Roberts 6:b7bbf31e06e4 44 uint8_t v, adr, pa_test_adr;
Wayne Roberts 0:9c052ff8dd6a 45
Wayne Roberts 5:ab124d3842a8 46 if (radio.type == SX1276) {
Wayne Roberts 0:9c052ff8dd6a 47 adr = REG_PDSTRIM1_SX1276;
Wayne Roberts 5:ab124d3842a8 48 pa_test_adr = REG_PATEST_SX1276;
Wayne Roberts 5:ab124d3842a8 49 } else {
Wayne Roberts 0:9c052ff8dd6a 50 adr = REG_PDSTRIM1_SX1272;
Wayne Roberts 5:ab124d3842a8 51 pa_test_adr = REG_PATEST_SX1272;
Wayne Roberts 5:ab124d3842a8 52 }
Wayne Roberts 0:9c052ff8dd6a 53
Wayne Roberts 5:ab124d3842a8 54 v = radio.read_reg(pa_test_adr);
Wayne Roberts 5:ab124d3842a8 55 if (dbm == PA_OFF_DBM) {
Wayne Roberts 5:ab124d3842a8 56 /* for bench testing: prevent overloading receiving station (very low TX power) */
Wayne Roberts 5:ab124d3842a8 57 v &= ~0x20; // turn off pu_regpa_n: disable PA
Wayne Roberts 5:ab124d3842a8 58 radio.write_reg(pa_test_adr, v);
Wayne Roberts 5:ab124d3842a8 59 return;
Wayne Roberts 5:ab124d3842a8 60 } else if ((v & 0x20) == 0) {
Wayne Roberts 5:ab124d3842a8 61 v |= 0x20; // turn on pu_regpa_n: enable PA
Wayne Roberts 5:ab124d3842a8 62 radio.write_reg(pa_test_adr, v);
Wayne Roberts 5:ab124d3842a8 63 }
Wayne Roberts 5:ab124d3842a8 64
Wayne Roberts 0:9c052ff8dd6a 65 pds_trim.octet = radio.read_reg(adr);
Wayne Roberts 0:9c052ff8dd6a 66
Wayne Roberts 0:9c052ff8dd6a 67 if (shield_type == SHIELD_TYPE_LAS)
Wayne Roberts 0:9c052ff8dd6a 68 radio.RegPaConfig.bits.PaSelect = 1;
Wayne Roberts 0:9c052ff8dd6a 69 else
Wayne Roberts 0:9c052ff8dd6a 70 radio.RegPaConfig.bits.PaSelect = 0;
Wayne Roberts 0:9c052ff8dd6a 71
Wayne Roberts 0:9c052ff8dd6a 72 if (radio.RegPaConfig.bits.PaSelect) {
Wayne Roberts 0:9c052ff8dd6a 73 /* PABOOST used: +2dbm to +17, or +20 */
Wayne Roberts 0:9c052ff8dd6a 74 if (dbm > 17) {
Wayne Roberts 0:9c052ff8dd6a 75 if (dbm > 20)
Wayne Roberts 0:9c052ff8dd6a 76 dbm = 20;
Wayne Roberts 0:9c052ff8dd6a 77 dbm -= 3;
Wayne Roberts 0:9c052ff8dd6a 78 pds_trim.bits.prog_txdac = 7;
Wayne Roberts 0:9c052ff8dd6a 79 radio.write_reg(adr, pds_trim.octet);
Wayne Roberts 0:9c052ff8dd6a 80 ocp(150);
Wayne Roberts 0:9c052ff8dd6a 81 } else
Wayne Roberts 0:9c052ff8dd6a 82 ocp(120);
Wayne Roberts 0:9c052ff8dd6a 83
Wayne Roberts 0:9c052ff8dd6a 84 if (dbm > 1)
Wayne Roberts 0:9c052ff8dd6a 85 radio.RegPaConfig.bits.OutputPower = dbm - 2;
Wayne Roberts 0:9c052ff8dd6a 86 } else {
Wayne Roberts 0:9c052ff8dd6a 87 /* RFO used: -1 to +14dbm */
Wayne Roberts 0:9c052ff8dd6a 88 ocp(80);
Wayne Roberts 0:9c052ff8dd6a 89 if (dbm < 15)
Wayne Roberts 0:9c052ff8dd6a 90 radio.RegPaConfig.bits.OutputPower = dbm + 1;
Wayne Roberts 0:9c052ff8dd6a 91 }
Wayne Roberts 0:9c052ff8dd6a 92 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
Wayne Roberts 0:9c052ff8dd6a 93
Wayne Roberts 0:9c052ff8dd6a 94 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
Wayne Roberts 0:9c052ff8dd6a 95 if (radio.RegPaConfig.bits.PaSelect) {
Wayne Roberts 0:9c052ff8dd6a 96 dbm = radio.RegPaConfig.bits.OutputPower + pds_trim.bits.prog_txdac - 2;
Wayne Roberts 0:9c052ff8dd6a 97 } else {
Wayne Roberts 0:9c052ff8dd6a 98 dbm = radio.RegPaConfig.bits.OutputPower - 1;
Wayne Roberts 0:9c052ff8dd6a 99 }
Wayne Roberts 0:9c052ff8dd6a 100 }
Wayne Roberts 0:9c052ff8dd6a 101
Wayne Roberts 0:9c052ff8dd6a 102 void Radio::boardInit()
Wayne Roberts 0:9c052ff8dd6a 103 {
Wayne Roberts 0:9c052ff8dd6a 104 printf("boardInit sx127x-ff-arduino ");
Wayne Roberts 0:9c052ff8dd6a 105 rfsw.input();
Wayne Roberts 0:9c052ff8dd6a 106 if (rfsw.read()) {
Wayne Roberts 0:9c052ff8dd6a 107 shield_type = SHIELD_TYPE_LAS;
Wayne Roberts 0:9c052ff8dd6a 108 printf("LAS\r\n");
Wayne Roberts 0:9c052ff8dd6a 109 } else {
Wayne Roberts 0:9c052ff8dd6a 110 shield_type = SHIELD_TYPE_MAS;
Wayne Roberts 0:9c052ff8dd6a 111 printf("MAS\r\n");
Wayne Roberts 0:9c052ff8dd6a 112 }
Wayne Roberts 0:9c052ff8dd6a 113
Wayne Roberts 0:9c052ff8dd6a 114 rfsw.output();
Wayne Roberts 0:9c052ff8dd6a 115 }
Wayne Roberts 0:9c052ff8dd6a 116
Wayne Roberts 0:9c052ff8dd6a 117 #endif /* ..SX127x_H */
Wayne Roberts 0:9c052ff8dd6a 118 #endif /* ...sx127x shield */
Wayne Roberts 0:9c052ff8dd6a 119