Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
TARGET_MOTE_L152RC/radio_mote.cpp@1:0817a150122b, 2018-08-20 (annotated)
- Committer:
- Wayne Roberts
- Date:
- Mon Aug 20 18:13:09 2018 -0700
- Revision:
- 1:0817a150122b
- Child:
- 5:1e5cb7139acb
add source files
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Wayne Roberts |
1:0817a150122b | 1 | #include "radio.h" |
Wayne Roberts |
1:0817a150122b | 2 | |
Wayne Roberts |
1:0817a150122b | 3 | #define RADIO_RESET PC_2 //NorAm_Mote Reset_sx |
Wayne Roberts |
1:0817a150122b | 4 | #define RADIO_MOSI PB_15 //NorAm_Mote SPI2 Mosi |
Wayne Roberts |
1:0817a150122b | 5 | #define RADIO_MISO PB_14 //NorAm_Mote SPI2 Miso |
Wayne Roberts |
1:0817a150122b | 6 | #define RADIO_SCLK PB_13 //NorAm_Mote SPI2 Clk |
Wayne Roberts |
1:0817a150122b | 7 | #define RADIO_NSS PB_12 //NorAm_Mote SPI2 Nss |
Wayne Roberts |
1:0817a150122b | 8 | |
Wayne Roberts |
1:0817a150122b | 9 | #define RADIO_DIO_0 PC_6 //NorAm_Mote DIO0 |
Wayne Roberts |
1:0817a150122b | 10 | #define RADIO_DIO_1 PC_10 //NorAm_Mote DIO1 |
Wayne Roberts |
1:0817a150122b | 11 | #define RADIO_DIO_2 PC_8 //NorAm_Mote DIO2 |
Wayne Roberts |
1:0817a150122b | 12 | #define RADIO_DIO_3 PB_4 //NorAm_Mote DIO3 |
Wayne Roberts |
1:0817a150122b | 13 | #define RADIO_DIO_4 PB_5 //NorAm_Mote DIO4 |
Wayne Roberts |
1:0817a150122b | 14 | #define RADIO_DIO_5 PB_6 //NorAm_Mote DIO5 |
Wayne Roberts |
1:0817a150122b | 15 | |
Wayne Roberts |
1:0817a150122b | 16 | #define RFSW1 PC_4 //NorAm_Mote RFSwitch_CNTR_1 |
Wayne Roberts |
1:0817a150122b | 17 | #define RFSW2 PC_13 //NorAm_Mote RFSwitch_CNTR_2 |
Wayne Roberts |
1:0817a150122b | 18 | |
Wayne Roberts |
1:0817a150122b | 19 | SPI spi(RADIO_MOSI, RADIO_MISO, RADIO_SCLK); // mosi, miso, sclk |
Wayne Roberts |
1:0817a150122b | 20 | // dio0, dio1, nss, spi, rst |
Wayne Roberts |
1:0817a150122b | 21 | SX127x Radio::radio(RADIO_DIO_0, RADIO_DIO_1, RADIO_NSS, spi, RADIO_RESET); |
Wayne Roberts |
1:0817a150122b | 22 | SX127x_lora Radio::lora(radio); |
Wayne Roberts |
1:0817a150122b | 23 | SX127x_fsk Radio::fsk(radio); |
Wayne Roberts |
1:0817a150122b | 24 | |
Wayne Roberts |
1:0817a150122b | 25 | DigitalOut rfsw1(RFSW1); |
Wayne Roberts |
1:0817a150122b | 26 | DigitalOut rfsw2(RFSW2); |
Wayne Roberts |
1:0817a150122b | 27 | |
Wayne Roberts |
1:0817a150122b | 28 | DigitalOut red(LED1); |
Wayne Roberts |
1:0817a150122b | 29 | DigitalOut yellow(LED3); |
Wayne Roberts |
1:0817a150122b | 30 | #define LED_OFF 1 |
Wayne Roberts |
1:0817a150122b | 31 | #define LED_ON 0 |
Wayne Roberts |
1:0817a150122b | 32 | |
Wayne Roberts |
1:0817a150122b | 33 | void Radio::rfsw_callback() |
Wayne Roberts |
1:0817a150122b | 34 | { |
Wayne Roberts |
1:0817a150122b | 35 | if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER) { // start of transmission |
Wayne Roberts |
1:0817a150122b | 36 | red = LED_ON; |
Wayne Roberts |
1:0817a150122b | 37 | yellow = LED_OFF; |
Wayne Roberts |
1:0817a150122b | 38 | if (radio.HF) { |
Wayne Roberts |
1:0817a150122b | 39 | if (radio.RegPaConfig.bits.PaSelect) { // if PA_BOOST |
Wayne Roberts |
1:0817a150122b | 40 | rfsw2 = 0; |
Wayne Roberts |
1:0817a150122b | 41 | rfsw1 = 1; |
Wayne Roberts |
1:0817a150122b | 42 | } else { // RFO to power amp |
Wayne Roberts |
1:0817a150122b | 43 | rfsw2 = 1; |
Wayne Roberts |
1:0817a150122b | 44 | rfsw1 = 0; |
Wayne Roberts |
1:0817a150122b | 45 | } |
Wayne Roberts |
1:0817a150122b | 46 | } else { |
Wayne Roberts |
1:0817a150122b | 47 | // todo: sx1276 |
Wayne Roberts |
1:0817a150122b | 48 | } |
Wayne Roberts |
1:0817a150122b | 49 | } else if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE || radio.RegOpMode.bits.Mode == RF_OPMODE_CAD) { // start of reception |
Wayne Roberts |
1:0817a150122b | 50 | red = LED_OFF; |
Wayne Roberts |
1:0817a150122b | 51 | yellow = LED_ON; |
Wayne Roberts |
1:0817a150122b | 52 | if (radio.HF) { |
Wayne Roberts |
1:0817a150122b | 53 | rfsw2 = 1; |
Wayne Roberts |
1:0817a150122b | 54 | rfsw1 = 1; |
Wayne Roberts |
1:0817a150122b | 55 | } else { |
Wayne Roberts |
1:0817a150122b | 56 | // todo: sx1276 |
Wayne Roberts |
1:0817a150122b | 57 | } |
Wayne Roberts |
1:0817a150122b | 58 | } else { // RF switch shutdown |
Wayne Roberts |
1:0817a150122b | 59 | yellow = LED_OFF; |
Wayne Roberts |
1:0817a150122b | 60 | red = LED_OFF; |
Wayne Roberts |
1:0817a150122b | 61 | rfsw2 = 0; |
Wayne Roberts |
1:0817a150122b | 62 | rfsw1 = 0; |
Wayne Roberts |
1:0817a150122b | 63 | } |
Wayne Roberts |
1:0817a150122b | 64 | } |
Wayne Roberts |
1:0817a150122b | 65 | |
Wayne Roberts |
1:0817a150122b | 66 | void Radio::tx_dbm_print() |
Wayne Roberts |
1:0817a150122b | 67 | { |
Wayne Roberts |
1:0817a150122b | 68 | int dbm; |
Wayne Roberts |
1:0817a150122b | 69 | |
Wayne Roberts |
1:0817a150122b | 70 | radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG); |
Wayne Roberts |
1:0817a150122b | 71 | if (radio.RegPaConfig.bits.PaSelect) { |
Wayne Roberts |
1:0817a150122b | 72 | RegPdsTrim1_t pds_trim; |
Wayne Roberts |
1:0817a150122b | 73 | uint8_t adr; |
Wayne Roberts |
1:0817a150122b | 74 | |
Wayne Roberts |
1:0817a150122b | 75 | if (radio.type == SX1276) |
Wayne Roberts |
1:0817a150122b | 76 | adr = REG_PDSTRIM1_SX1276; |
Wayne Roberts |
1:0817a150122b | 77 | else |
Wayne Roberts |
1:0817a150122b | 78 | adr = REG_PDSTRIM1_SX1272; |
Wayne Roberts |
1:0817a150122b | 79 | |
Wayne Roberts |
1:0817a150122b | 80 | pds_trim.octet = radio.read_reg(adr); |
Wayne Roberts |
1:0817a150122b | 81 | dbm = radio.RegPaConfig.bits.OutputPower + pds_trim.bits.prog_txdac - 2; |
Wayne Roberts |
1:0817a150122b | 82 | } else { |
Wayne Roberts |
1:0817a150122b | 83 | dbm = radio.RegPaConfig.bits.OutputPower - 21; |
Wayne Roberts |
1:0817a150122b | 84 | } |
Wayne Roberts |
1:0817a150122b | 85 | pc.printf(":%d", dbm); |
Wayne Roberts |
1:0817a150122b | 86 | } |
Wayne Roberts |
1:0817a150122b | 87 | |
Wayne Roberts |
1:0817a150122b | 88 | bool Radio::tx_dbm_write(const char* str) |
Wayne Roberts |
1:0817a150122b | 89 | { |
Wayne Roberts |
1:0817a150122b | 90 | int dbm; |
Wayne Roberts |
1:0817a150122b | 91 | |
Wayne Roberts |
1:0817a150122b | 92 | sscanf(str, "%d", &dbm); |
Wayne Roberts |
1:0817a150122b | 93 | |
Wayne Roberts |
1:0817a150122b | 94 | if (dbm > 20) { |
Wayne Roberts |
1:0817a150122b | 95 | radio.RegPaConfig.bits.PaSelect = 0; // RFO to external amplifier |
Wayne Roberts |
1:0817a150122b | 96 | dbm -= 20; |
Wayne Roberts |
1:0817a150122b | 97 | if (dbm < 15) |
Wayne Roberts |
1:0817a150122b | 98 | radio.RegPaConfig.bits.OutputPower = dbm + 1; |
Wayne Roberts |
1:0817a150122b | 99 | } else { |
Wayne Roberts |
1:0817a150122b | 100 | uint8_t adr; |
Wayne Roberts |
1:0817a150122b | 101 | RegPdsTrim1_t pds_trim; |
Wayne Roberts |
1:0817a150122b | 102 | |
Wayne Roberts |
1:0817a150122b | 103 | radio.RegPaConfig.bits.PaSelect = 1; // PA_BOOST |
Wayne Roberts |
1:0817a150122b | 104 | /* PABOOST used: +2dbm to +17, or +20 */ |
Wayne Roberts |
1:0817a150122b | 105 | |
Wayne Roberts |
1:0817a150122b | 106 | if (radio.type == SX1276) |
Wayne Roberts |
1:0817a150122b | 107 | adr = REG_PDSTRIM1_SX1276; |
Wayne Roberts |
1:0817a150122b | 108 | else |
Wayne Roberts |
1:0817a150122b | 109 | adr = REG_PDSTRIM1_SX1272; |
Wayne Roberts |
1:0817a150122b | 110 | |
Wayne Roberts |
1:0817a150122b | 111 | pds_trim.octet = radio.read_reg(adr); |
Wayne Roberts |
1:0817a150122b | 112 | if (dbm > 17) { |
Wayne Roberts |
1:0817a150122b | 113 | dbm -= 3; |
Wayne Roberts |
1:0817a150122b | 114 | pds_trim.bits.prog_txdac = 7; |
Wayne Roberts |
1:0817a150122b | 115 | radio.write_reg(adr, pds_trim.octet); |
Wayne Roberts |
1:0817a150122b | 116 | } |
Wayne Roberts |
1:0817a150122b | 117 | |
Wayne Roberts |
1:0817a150122b | 118 | if (dbm > 1) |
Wayne Roberts |
1:0817a150122b | 119 | radio.RegPaConfig.bits.OutputPower = dbm - 2; |
Wayne Roberts |
1:0817a150122b | 120 | } |
Wayne Roberts |
1:0817a150122b | 121 | |
Wayne Roberts |
1:0817a150122b | 122 | radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet); |
Wayne Roberts |
1:0817a150122b | 123 | |
Wayne Roberts |
1:0817a150122b | 124 | return false; |
Wayne Roberts |
1:0817a150122b | 125 | } |
Wayne Roberts |
1:0817a150122b | 126 | |
Wayne Roberts |
1:0817a150122b | 127 | void Radio::targetInit() |
Wayne Roberts |
1:0817a150122b | 128 | { |
Wayne Roberts |
1:0817a150122b | 129 | radio.rf_switch = rfsw_callback; |
Wayne Roberts |
1:0817a150122b | 130 | } |