Text menu driven ANSI/VT100 console test utility for LoRa transceivers

radio chip selection

Radio chip driver is not included, allowing choice of radio device.
If you're using SX1272 or SX1276, then import sx127x driver into your program.
if you're using SX1261 or SX1262, then import sx126x driver into your program.
if you're using SX1280, then import sx1280 driver into your program.
if you're using LR1110, then import LR1110 driver into your program.
If you're using NAmote72 or Murata discovery, then you must import only sx127x driver.
If you're using Type1SJ select target DISCO_L072CZ_LRWAN1 and import sx126x driver into your program.

This is VT100 text-based menu driven test program for SX12xx transceiver devices.
Serial console is divided into horizontally into top half and bottom half.
The bottom half serves as scrolling area to log activity.
The top half serves as menu, to configure the radio.
For all devices, the serial console operates at 115200 8N1, and requires terminal with ANSI-VT100 capability, such as putty/teraterm/minicom etc.
Use program only with keyboard up/down/left/right keys. Enter to change an item, or number for value item. Some items are single bit, requiring only enter key to toggle. Others with fixed choices give a drop-down menu.

Committer:
Wayne Roberts
Date:
Thu Dec 06 14:24:18 2018 -0800
Revision:
5:1e5cb7139acb
Parent:
1:0817a150122b
correct PA_OFF for sx127x

Who changed what in which revision?

UserRevisionLine numberNew 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 5:1e5cb7139acb 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 5:1e5cb7139acb 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 5:1e5cb7139acb 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 5:1e5cb7139acb 69 uint8_t adr, pa_test_adr;
Wayne Roberts 1:0817a150122b 70
Wayne Roberts 5:1e5cb7139acb 71 if (radio.type == SX1276) {
Wayne Roberts 5:1e5cb7139acb 72 adr = REG_PDSTRIM1_SX1276;
Wayne Roberts 5:1e5cb7139acb 73 pa_test_adr = REG_PATEST_SX1276;
Wayne Roberts 5:1e5cb7139acb 74 } else {
Wayne Roberts 5:1e5cb7139acb 75 adr = REG_PDSTRIM1_SX1272;
Wayne Roberts 5:1e5cb7139acb 76 pa_test_adr = REG_PATEST_SX1272;
Wayne Roberts 5:1e5cb7139acb 77 }
Wayne Roberts 1:0817a150122b 78
Wayne Roberts 5:1e5cb7139acb 79 if (radio.read_reg(pa_test_adr) & 0x20) {
Wayne Roberts 5:1e5cb7139acb 80 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
Wayne Roberts 5:1e5cb7139acb 81 if (radio.RegPaConfig.bits.PaSelect) {
Wayne Roberts 5:1e5cb7139acb 82 RegPdsTrim1_t pds_trim;
Wayne Roberts 1:0817a150122b 83
Wayne Roberts 5:1e5cb7139acb 84 pds_trim.octet = radio.read_reg(adr);
Wayne Roberts 5:1e5cb7139acb 85 dbm = radio.RegPaConfig.bits.OutputPower + pds_trim.bits.prog_txdac - 2;
Wayne Roberts 5:1e5cb7139acb 86 } else {
Wayne Roberts 5:1e5cb7139acb 87 dbm = radio.RegPaConfig.bits.OutputPower - 21;
Wayne Roberts 5:1e5cb7139acb 88 }
Wayne Roberts 5:1e5cb7139acb 89 } else
Wayne Roberts 5:1e5cb7139acb 90 dbm = PA_OFF_DBM;
Wayne Roberts 5:1e5cb7139acb 91
Wayne Roberts 1:0817a150122b 92 pc.printf(":%d", dbm);
Wayne Roberts 1:0817a150122b 93 }
Wayne Roberts 1:0817a150122b 94
Wayne Roberts 1:0817a150122b 95 bool Radio::tx_dbm_write(const char* str)
Wayne Roberts 1:0817a150122b 96 {
Wayne Roberts 1:0817a150122b 97 int dbm;
Wayne Roberts 1:0817a150122b 98
Wayne Roberts 1:0817a150122b 99 sscanf(str, "%d", &dbm);
Wayne Roberts 1:0817a150122b 100
Wayne Roberts 1:0817a150122b 101 if (dbm > 20) {
Wayne Roberts 1:0817a150122b 102 radio.RegPaConfig.bits.PaSelect = 0; // RFO to external amplifier
Wayne Roberts 1:0817a150122b 103 dbm -= 20;
Wayne Roberts 1:0817a150122b 104 if (dbm < 15)
Wayne Roberts 1:0817a150122b 105 radio.RegPaConfig.bits.OutputPower = dbm + 1;
Wayne Roberts 1:0817a150122b 106 } else {
Wayne Roberts 1:0817a150122b 107 uint8_t adr;
Wayne Roberts 1:0817a150122b 108 RegPdsTrim1_t pds_trim;
Wayne Roberts 1:0817a150122b 109
Wayne Roberts 1:0817a150122b 110 radio.RegPaConfig.bits.PaSelect = 1; // PA_BOOST
Wayne Roberts 1:0817a150122b 111 /* PABOOST used: +2dbm to +17, or +20 */
Wayne Roberts 1:0817a150122b 112
Wayne Roberts 1:0817a150122b 113 if (radio.type == SX1276)
Wayne Roberts 1:0817a150122b 114 adr = REG_PDSTRIM1_SX1276;
Wayne Roberts 1:0817a150122b 115 else
Wayne Roberts 1:0817a150122b 116 adr = REG_PDSTRIM1_SX1272;
Wayne Roberts 5:1e5cb7139acb 117
Wayne Roberts 5:1e5cb7139acb 118 pds_trim.octet = radio.read_reg(adr);
Wayne Roberts 1:0817a150122b 119 if (dbm > 17) {
Wayne Roberts 1:0817a150122b 120 dbm -= 3;
Wayne Roberts 1:0817a150122b 121 pds_trim.bits.prog_txdac = 7;
Wayne Roberts 1:0817a150122b 122 radio.write_reg(adr, pds_trim.octet);
Wayne Roberts 1:0817a150122b 123 }
Wayne Roberts 1:0817a150122b 124
Wayne Roberts 1:0817a150122b 125 if (dbm > 1)
Wayne Roberts 1:0817a150122b 126 radio.RegPaConfig.bits.OutputPower = dbm - 2;
Wayne Roberts 1:0817a150122b 127 }
Wayne Roberts 1:0817a150122b 128
Wayne Roberts 1:0817a150122b 129 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
Wayne Roberts 1:0817a150122b 130
Wayne Roberts 1:0817a150122b 131 return false;
Wayne Roberts 1:0817a150122b 132 }
Wayne Roberts 1:0817a150122b 133
Wayne Roberts 1:0817a150122b 134 void Radio::targetInit()
Wayne Roberts 1:0817a150122b 135 {
Wayne Roberts 1:0817a150122b 136 radio.rf_switch = rfsw_callback;
Wayne Roberts 1:0817a150122b 137 }