1
radio_ff_arduino_sx127x.cpp@22:fc88e265f425, 2022-06-06 (annotated)
- Committer:
- advxolltm
- Date:
- Mon Jun 06 16:37:12 2022 +0000
- Revision:
- 22:fc88e265f425
- Parent:
- 17:5f34cbe2ac53
123
Who changed what in which revision?
User | Revision | Line number | New 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 |