UART console application for testing SX1272/SX1276

Dependencies:   SX127x

/media/uploads/dudmuck/lora.png

This is a UART console test application for using SX127x library driver for SX1272/SX1276 radio transceivers. Serial console is provided at 57600bps. Refer to Serial Communication with a PC for information about using the serial port with your PC.

Using this command interface, you can exercise the functionality of radio chip without needing specialized software application for your PC.

Commands which can be used include ? to list available commands, or . to query status from radio chip, for example. The serial console allows you to configure the radio chip, such as setting spreading factor, bandwidth, operating frequency, etc.

A simple chat application is provided to try communications between two boards. The SX127x library object is instantiated with pin assignments generic arduino headers, but can be easily reassigned for any mbed board.

The same driver library can operate for both SX1272 and SX1276. Upon starting, the driver auto-detects whether SX1272 or SX1276 transceiver chip is connected by attempting to change the LowFrequencyModeOn bit in RegOpMode register. If this bit can be changed, then the radio device is SX1276. This bit is not implemented in SX1272. A few of the radio driver functions select behavior based on this detection. The differences between these two devices is small, from a software perspective.

Using with SX1276MB1xAS Shield

This component plugs into any board with arduino uno headers.

There are two different version of this shield. European version (MAS), and North American (LAS). The LAS shield uses PA_BOOST transmit pin to permit +20dBm power. The MAS version uses RFO transmit pin in Europe. This software reads RF switch pin (A4 pin) pulling resistor to determine which type of shield is installed.


Using with your own production board

This software is useful for validating RF performance your own LoRa board design, because only two external pins needs to be provided to PC (UART TX/RX). You can select an mbed platform which matches the CPU on your own board. If the memory size doesnt match exactly, you can export the program to an offline toolchain and edit the target type or linker file there.

Transmitter Test Guidelines

FSK mode is used for transmitter testing, because an unmodulated carrier can be sent, permitting easy measurement of TX power and frequency error.

commands used for transmitter testing:

  • frf915.0 change to your desired RF center frequency (in this case 915MHz)
  • L to toggle the radio chip into FSK mode.
  • fdev0 to configure TX frequency deviation to zero, to put the transmitted carrier on the center frequency.
  • pas to select which TX pin is connected to antenna matching (RFO vs PA_BOOST).
  • op<dBm> to configure TX power.
  • If you desire to test higher power PA_BOOST, use ocp<mA>
  • w 01 03 put radio chip into transmit mode (skips writing to FIFO). This will cause radio to transmit preamble, because the FIFO is empty in TX mode. Since Fdev is zero, an unmodulated carrier is sent.
  • Spectrum analyzer can now be used to to observe TX power, harmonics, power consumption, or frequency error.
  • stby to end transmission, or use h to reset radio chip to default condition.
  • Use period . command at any time to review current radio configuration.

LoRa transmitter testing

  • use L command to toggle radio into LoRa, if necessary.
  • Normally the tx command is used to manually send single packets.
  • txc will toggle TxContinuousMode in LoRa modem to send continuous modulated transmission.
  • Useful for checking adjacent channel power.
  • enter txc again to end transmission.

Receiver Test Guidelines

FSK mode is used for receiver sensitivity testing, allowing the use of a BERT signal generator (such as R/S SMIQ03B). Using this method provides real-time indication of receiver sensitivity, useful for tuning and impedance matching. The radio chip outputs DCLK and DATA digital signals which are connected back to BERT signal generator.

commands used for receiver testing:

  • L to toggle the radio chip into FSK mode.
  • datam to toggle FSK modem into continuous mode. This disables packet engine and gives direct access to demodulator.
  • configure DIO1 pin to DCLK function, and DIO2 pin to DATA function:
    • dio command to list current DIO pin asignments
    • d1 to cycle DIO1 function until Dclk is selected
    • d2 for DIO2, only Data function is available in FSK continuous mode
  • frf915.0 change to your desired RF center frequency (in this case 915MHz)
  • rx to start receiver
  • stby to disable receiver

Full command list

Arguments shown in square brackets [] indicate required. <> are optional, where leaving off the argument usually causes a read of the item, and providing the value causes a write operation. You should always have the radio chip datasheet on-hand when using these commands.

Hitting <enter> key by itself will repeat last command.
<Ctrl-C> will cancel an operation in progress.

command list: common commands (both LoRa and FSK)

commanddescription
. (period)print current radio status
?list available commands
Ltoggle active radio modem (LoRa vs FSK)
hhardware reset, put radio into default power-on condition
frf<MHz>get/set RF operating frequency
rxstart radio receiver (any received packets are printed onto your serial terminal)
rssiread instantaneous RSSI (level read at the time command is issued)
tx<%d>transmit test packet. Packet length value can be provided as argument, or uses last value if not provided
payl<%d>get/set payload length
bw<KHz>get/set bandwidth. In LoRa mode, both receive and transmit bandwidth are changed. For FSK, only receive bandwidth is affected. bwa accesses AFC bandwidth in FSK
pastoggle RFO / PA_BOOST transmit pin output selection
op<dBm>get/set TX output power. Value is provided in dBm. Special case is value of 20dBm (on PA_BOOST), which causes increase in TX DAC voltage
ocp<mA>get/set TX current limit, in milliamps. Necessary adjustment when +20dBm is used
dioshow DIO pin assignments
d<0-5>change DIO pin assignment, the pin number is given as arguement. Each pin has up to 4 possible functions
pres<%d>set preamble length. LoRa: number of symbols. FSK: number of bytes
crcontoggle crcOn
lnabcycle LNA-boost setting (receiver performance adjustment)
Rread all radio registers (use only while reading chip datasheet)
r[%x]read single radio register (use only while reading chip datasheet)
w[%x %x]write single radio register (use only while reading chip datasheet)
pllbwchange PLL bandwidth
stbyset chip mode to standby
sleepset chip mode to sleep
fstxset chip mode to fstx
fsrxset chip mode to fsrx
Eiger range test commandsdescription
pid<%d>get set ID number in range test payload
pertx<%d>start Eiger PER transmit. The count of packets to send is provided as arguement
perrxstart Eiger PER receive
txpd<%d>get/set tx delay between PER packets transmitted

command list: LoRa modem commands

LoRa commandLoRa description
iqinvtoggle RX IQ invert
cintoggle TX IQ invert
lhp<%d>(RX) get/set hop period
sync<%x>get/set sync (post-preamble gap, single byte)
cr<1-4>get/set codingRate
lhmtoggle explicit/implicit (explicit mode sends payload length with each packet)
sf<%d>get/set spreadingFactor (SF7 to SF12)
ldrtoggle LowDataRateOptimize (changes payload encoding, for long packets)
txctoggle TxContinuousMode
rxt<%d>get/set SymbTimeout
rxsstart RX_SINGLE (receives only for SymbTimeout symbols)
cad<%d num tries>run channel activity detection

command list: FSK modem commands

FSK commandFSK description
c<%d>get/set test cases. Several FSK bitrates/bandwidths pre-configured to give optimal performance.
fdev<kHz>(TX) get/set frequency deviation
mods(TX) increment modulation shaping
par(TX) increment paRamp
datamtoggle DataMode (packet/continuous)
fifottoggle TxStartCondition (FifoThreshold level vs FifoNotEmpty)
br<%f kbps>get/set bitrate
dcfincrement DcFree (manchester / whitening)
pktftoggle PacketFormat fixed/variable length
syncontoggle SyncOn (frame sync, SFD enable)
bitsynctoggle BitSyncOn (continuous mode only)
syncw<hex bytes>get/set syncword. Sync bytes are provided by hex octects separated by spaces.
fei(RX) read FEI
rxt(RX) increment RxTrigger (RX start on rssi vs. preamble detect)
rssit<-dBm>(RX) get/set rssi threshold (trigger level for RSSI interrupt)
rssis<%d>(RX) get/set rssi smoothing
rssio<%d>(RX) get/set rssi offset
agcauto(RX) toggle AgcAutoOn (true = LNA gain set automatically)
afcauto(RX) toggle AfcAutoOn
ac(RX) AfcClear
ar(RX) increment AutoRestartRxMode
alc(RX) toggle AfcAutoClearOn (only if AfcAutoOn is set)
prep(RX) toggle PreamblePolarity (0xAA vs 0x55)
pde(RX) toggle PreambleDetectorOn
pds<%d>(RX) get/set PreambleDetectorSize
pdt<%d>(RX) get/set PreambleDetectorTol
mp(RX) toggle MapPreambleDetect (DIO function RSSI vs PreambleDetect)
thr<%d>get/set FifoThreshold (triggers FifoLevel interrupt)
polltoggle poll_irq_en. Radio events read from DIO pins vs polling of IrqFlags register
Eempty out FIFO
clkoutincrement ClkOut divider
ookenter OOK mode
ooktincrement OokThreshType
ooksincrement OokPeakTheshStep
sqlch<%d>get/set OokFixedThresh
Committer:
dudmuck
Date:
Wed Mar 26 01:13:30 2014 +0000
Revision:
0:be215de91a68
Child:
1:1cd0afbed23c
demo test application for sx127x

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudmuck 0:be215de91a68 1 #include "sx127x.h"
dudmuck 0:be215de91a68 2
dudmuck 0:be215de91a68 3 /*
dudmuck 0:be215de91a68 4 * http://mbed.org/handbook/mbed-FRDM-KL25Z
dudmuck 0:be215de91a68 5 */
dudmuck 0:be215de91a68 6
dudmuck 0:be215de91a68 7 DigitalOut green(LED_GREEN);
dudmuck 0:be215de91a68 8
dudmuck 0:be215de91a68 9 Serial pc(USBTX, USBRX);
dudmuck 0:be215de91a68 10
dudmuck 0:be215de91a68 11 uint8_t tx_cnt;
dudmuck 0:be215de91a68 12 char pcbuf[64];
dudmuck 0:be215de91a68 13
dudmuck 0:be215de91a68 14 typedef enum {
dudmuck 0:be215de91a68 15 APP_NONE = 0,
dudmuck 0:be215de91a68 16 APP_CHAT
dudmuck 0:be215de91a68 17 } app_e;
dudmuck 0:be215de91a68 18
dudmuck 0:be215de91a68 19 app_e app = APP_NONE;
dudmuck 0:be215de91a68 20
dudmuck 0:be215de91a68 21
dudmuck 0:be215de91a68 22 /*const uint32_t my_frf_a = 914.0 / FREQ_STEP_MHZ;
dudmuck 0:be215de91a68 23 const uint32_t my_frf_b = 915.0 / FREQ_STEP_MHZ;*/
dudmuck 0:be215de91a68 24 const uint32_t frfs[] = {
dudmuck 0:be215de91a68 25 MHZ_TO_FRF(903.0),
dudmuck 0:be215de91a68 26 MHZ_TO_FRF(904.0),
dudmuck 0:be215de91a68 27 MHZ_TO_FRF(905.0),
dudmuck 0:be215de91a68 28 MHZ_TO_FRF(906.0),
dudmuck 0:be215de91a68 29 MHZ_TO_FRF(907.0),
dudmuck 0:be215de91a68 30 MHZ_TO_FRF(908.0),
dudmuck 0:be215de91a68 31 MHZ_TO_FRF(909.0),
dudmuck 0:be215de91a68 32 MHZ_TO_FRF(910.0),
dudmuck 0:be215de91a68 33 MHZ_TO_FRF(911.0),
dudmuck 0:be215de91a68 34 MHZ_TO_FRF(912.0),
dudmuck 0:be215de91a68 35 MHZ_TO_FRF(913.0),
dudmuck 0:be215de91a68 36 MHZ_TO_FRF(914.0),
dudmuck 0:be215de91a68 37 MHZ_TO_FRF(915.0)
dudmuck 0:be215de91a68 38 };
dudmuck 0:be215de91a68 39
dudmuck 0:be215de91a68 40 /******************************************************************************/
dudmuck 0:be215de91a68 41
dudmuck 0:be215de91a68 42 // pin: 3 8 1 7 10 12 5 20 18
dudmuck 0:be215de91a68 43 // mosi, miso, sclk, cs, rst, dio0, dio1, fctx, fcps
dudmuck 0:be215de91a68 44 SX127x radio(PTD2, PTD3, PTD1, PTD0, PTD5, PTA13, PTD4, PTC9, PTC8);
dudmuck 0:be215de91a68 45
dudmuck 0:be215de91a68 46 void printLoraIrqs_(bool clear)
dudmuck 0:be215de91a68 47 {
dudmuck 0:be215de91a68 48 //in radio class -- RegIrqFlags_t RegIrqFlags;
dudmuck 0:be215de91a68 49
dudmuck 0:be215de91a68 50 //already read RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS);
dudmuck 0:be215de91a68 51 printf("\r\nIrqFlags:");
dudmuck 0:be215de91a68 52 if (radio.RegIrqFlags.bits.CadDetected)
dudmuck 0:be215de91a68 53 printf("CadDetected ");
dudmuck 0:be215de91a68 54 if (radio.RegIrqFlags.bits.FhssChangeChannel) {
dudmuck 0:be215de91a68 55 //radio.RegHopChannel.octet = radio.read_reg(REG_LR_HOPCHANNEL);
dudmuck 0:be215de91a68 56 printf("FhssChangeChannel:%d ", radio.RegHopChannel.bits.FhssPresentChannel);
dudmuck 0:be215de91a68 57 }
dudmuck 0:be215de91a68 58 if (radio.RegIrqFlags.bits.CadDone)
dudmuck 0:be215de91a68 59 printf("CadDone ");
dudmuck 0:be215de91a68 60 if (radio.RegIrqFlags.bits.TxDone)
dudmuck 0:be215de91a68 61 printf("TxDone ");
dudmuck 0:be215de91a68 62 if (radio.RegIrqFlags.bits.ValidHeader)
dudmuck 0:be215de91a68 63 printf("ValidHeader ");
dudmuck 0:be215de91a68 64 if (radio.RegIrqFlags.bits.PayloadCrcError)
dudmuck 0:be215de91a68 65 printf("PayloadCrcError ");
dudmuck 0:be215de91a68 66 if (radio.RegIrqFlags.bits.RxDone)
dudmuck 0:be215de91a68 67 printf("RxDone ");
dudmuck 0:be215de91a68 68 if (radio.RegIrqFlags.bits.RxTimeout)
dudmuck 0:be215de91a68 69 printf("RxTimeout ");
dudmuck 0:be215de91a68 70
dudmuck 0:be215de91a68 71 printf("\r\n");
dudmuck 0:be215de91a68 72
dudmuck 0:be215de91a68 73 if (clear)
dudmuck 0:be215de91a68 74 radio.write_reg(REG_LR_IRQFLAGS, radio.RegIrqFlags.octet);
dudmuck 0:be215de91a68 75
dudmuck 0:be215de91a68 76 }
dudmuck 0:be215de91a68 77
dudmuck 0:be215de91a68 78 void printCodingRate(bool from_rx)
dudmuck 0:be215de91a68 79 {
dudmuck 0:be215de91a68 80 uint8_t d = radio.getCodingRate(from_rx);
dudmuck 0:be215de91a68 81 printf("CodingRate:");
dudmuck 0:be215de91a68 82 switch (d) {
dudmuck 0:be215de91a68 83 case 1: printf("4/5 "); break;
dudmuck 0:be215de91a68 84 case 2: printf("4/6 "); break;
dudmuck 0:be215de91a68 85 case 3: printf("4/7 "); break;
dudmuck 0:be215de91a68 86 case 4: printf("4/8 "); break;
dudmuck 0:be215de91a68 87 default:
dudmuck 0:be215de91a68 88 printf("%d ", d);
dudmuck 0:be215de91a68 89 break;
dudmuck 0:be215de91a68 90 }
dudmuck 0:be215de91a68 91 }
dudmuck 0:be215de91a68 92
dudmuck 0:be215de91a68 93 void printHeaderMode()
dudmuck 0:be215de91a68 94 {
dudmuck 0:be215de91a68 95 if (radio.getHeaderMode())
dudmuck 0:be215de91a68 96 printf("implicit ");
dudmuck 0:be215de91a68 97 else
dudmuck 0:be215de91a68 98 printf("explicit ");
dudmuck 0:be215de91a68 99 }
dudmuck 0:be215de91a68 100
dudmuck 0:be215de91a68 101 void printBw()
dudmuck 0:be215de91a68 102 {
dudmuck 0:be215de91a68 103 uint8_t bw = radio.getBw();
dudmuck 0:be215de91a68 104
dudmuck 0:be215de91a68 105 printf("Bw:");
dudmuck 0:be215de91a68 106 if (radio.type == SX1276) {
dudmuck 0:be215de91a68 107 switch (radio.RegModemConfig.sx1276bits.Bw) {
dudmuck 0:be215de91a68 108 case 0: printf("7.8KHz "); break;
dudmuck 0:be215de91a68 109 case 1: printf("10.4KHz "); break;
dudmuck 0:be215de91a68 110 case 2: printf("15.6KHz "); break;
dudmuck 0:be215de91a68 111 case 3: printf("20.8KHz "); break;
dudmuck 0:be215de91a68 112 case 4: printf("31.25KHz "); break;
dudmuck 0:be215de91a68 113 case 5: printf("41.7KHz "); break;
dudmuck 0:be215de91a68 114 case 6: printf("62.5KHz "); break;
dudmuck 0:be215de91a68 115 case 7: printf("125KHz "); break;
dudmuck 0:be215de91a68 116 case 8: printf("250KHz "); break;
dudmuck 0:be215de91a68 117 case 9: printf("500KHz "); break;
dudmuck 0:be215de91a68 118 default: printf("%x ", radio.RegModemConfig.sx1276bits.Bw); break;
dudmuck 0:be215de91a68 119 }
dudmuck 0:be215de91a68 120 } else if (radio.type == SX1272) {
dudmuck 0:be215de91a68 121 switch (radio.RegModemConfig.sx1272bits.Bw) {
dudmuck 0:be215de91a68 122 case 0: printf("125KHz "); break;
dudmuck 0:be215de91a68 123 case 1: printf("250KHz "); break;
dudmuck 0:be215de91a68 124 case 2: printf("500KHz "); break;
dudmuck 0:be215de91a68 125 case 3: printf("11b "); break;
dudmuck 0:be215de91a68 126 }
dudmuck 0:be215de91a68 127 }
dudmuck 0:be215de91a68 128 }
dudmuck 0:be215de91a68 129
dudmuck 0:be215de91a68 130 void printAllBw()
dudmuck 0:be215de91a68 131 {
dudmuck 0:be215de91a68 132 int i, s;
dudmuck 0:be215de91a68 133
dudmuck 0:be215de91a68 134 if (radio.type == SX1276) {
dudmuck 0:be215de91a68 135 s = radio.RegModemConfig.sx1276bits.Bw;
dudmuck 0:be215de91a68 136 for (i = 0; i < 10; i++ ) {
dudmuck 0:be215de91a68 137 radio.RegModemConfig.sx1276bits.Bw = i;
dudmuck 0:be215de91a68 138 printf("%d ", i);
dudmuck 0:be215de91a68 139 printBw();
dudmuck 0:be215de91a68 140 printf("\r\n");
dudmuck 0:be215de91a68 141 }
dudmuck 0:be215de91a68 142 radio.RegModemConfig.sx1276bits.Bw = s;
dudmuck 0:be215de91a68 143 } else if (radio.type == SX1272) {
dudmuck 0:be215de91a68 144 s = radio.RegModemConfig.sx1272bits.Bw;
dudmuck 0:be215de91a68 145 for (i = 0; i < 3; i++ ) {
dudmuck 0:be215de91a68 146 radio.RegModemConfig.sx1272bits.Bw = i;
dudmuck 0:be215de91a68 147 printf("%d ", i);
dudmuck 0:be215de91a68 148 printBw();
dudmuck 0:be215de91a68 149 printf("\r\n");
dudmuck 0:be215de91a68 150 }
dudmuck 0:be215de91a68 151 radio.RegModemConfig.sx1272bits.Bw = s;
dudmuck 0:be215de91a68 152 }
dudmuck 0:be215de91a68 153 }
dudmuck 0:be215de91a68 154
dudmuck 0:be215de91a68 155 void printSf()
dudmuck 0:be215de91a68 156 {
dudmuck 0:be215de91a68 157 // spreading factor same between sx127[26]
dudmuck 0:be215de91a68 158 printf("sf:%d ", radio.getSf());
dudmuck 0:be215de91a68 159 }
dudmuck 0:be215de91a68 160
dudmuck 0:be215de91a68 161 void printRxPayloadCrcOn()
dudmuck 0:be215de91a68 162 {
dudmuck 0:be215de91a68 163 bool on = radio.getRxPayloadCrcOn();
dudmuck 0:be215de91a68 164 //printf("RxPayloadCrcOn:%s ", on ? "on" : "off");
dudmuck 0:be215de91a68 165 if (on)
dudmuck 0:be215de91a68 166 printf("RxPayloadCrcOn:1 = Tx CRC Enabled\r\n");
dudmuck 0:be215de91a68 167 else
dudmuck 0:be215de91a68 168 printf("RxPayloadCrcOn:1 = no Tx CRC\r\n");
dudmuck 0:be215de91a68 169 }
dudmuck 0:be215de91a68 170
dudmuck 0:be215de91a68 171 void printTxContinuousMode()
dudmuck 0:be215de91a68 172 {
dudmuck 0:be215de91a68 173 printf("TxContinuousMode:%d ", radio.RegModemConfig2.sx1276bits.TxContinuousMode); // same for sx1272 and sx1276
dudmuck 0:be215de91a68 174 }
dudmuck 0:be215de91a68 175
dudmuck 0:be215de91a68 176 void printAgcAutoOn()
dudmuck 0:be215de91a68 177 {
dudmuck 0:be215de91a68 178 printf("AgcAutoOn:%d", radio.getAgcAutoOn());
dudmuck 0:be215de91a68 179 }
dudmuck 0:be215de91a68 180
dudmuck 0:be215de91a68 181 void print_dio()
dudmuck 0:be215de91a68 182 {
dudmuck 0:be215de91a68 183 radio.RegDioMapping2.octet = radio.read_reg(REG_DIOMAPPING2);
dudmuck 0:be215de91a68 184 printf("DIO5:");
dudmuck 0:be215de91a68 185 switch (radio.RegDioMapping2.bits.Dio5Mapping) {
dudmuck 0:be215de91a68 186 case 0: printf("ModeReady"); break;
dudmuck 0:be215de91a68 187 case 1: printf("ClkOut"); break;
dudmuck 0:be215de91a68 188 case 2: printf("ClkOut"); break;
dudmuck 0:be215de91a68 189 }
dudmuck 0:be215de91a68 190 printf(" DIO4:");
dudmuck 0:be215de91a68 191 switch (radio.RegDioMapping2.bits.Dio4Mapping) {
dudmuck 0:be215de91a68 192 case 0: printf("CadDetected"); break;
dudmuck 0:be215de91a68 193 case 1: printf("PllLock"); break;
dudmuck 0:be215de91a68 194 case 2: printf("PllLock"); break;
dudmuck 0:be215de91a68 195 }
dudmuck 0:be215de91a68 196 radio.RegDioMapping1.octet = radio.read_reg(REG_DIOMAPPING1);
dudmuck 0:be215de91a68 197 printf(" DIO3:");
dudmuck 0:be215de91a68 198 switch (radio.RegDioMapping1.bits.Dio3Mapping) {
dudmuck 0:be215de91a68 199 case 0: printf("CadDone"); break;
dudmuck 0:be215de91a68 200 case 1: printf("ValidHeader"); break;
dudmuck 0:be215de91a68 201 case 2: printf("PayloadCrcError"); break;
dudmuck 0:be215de91a68 202 }
dudmuck 0:be215de91a68 203 printf(" DIO2:");
dudmuck 0:be215de91a68 204 switch (radio.RegDioMapping1.bits.Dio2Mapping) {
dudmuck 0:be215de91a68 205 case 0:
dudmuck 0:be215de91a68 206 case 1:
dudmuck 0:be215de91a68 207 case 2:
dudmuck 0:be215de91a68 208 printf("FhssChangeChannel");
dudmuck 0:be215de91a68 209 break;
dudmuck 0:be215de91a68 210 }
dudmuck 0:be215de91a68 211 printf(" DIO1:");
dudmuck 0:be215de91a68 212 switch (radio.RegDioMapping1.bits.Dio1Mapping) {
dudmuck 0:be215de91a68 213 case 0: printf("RxTimeout"); break;
dudmuck 0:be215de91a68 214 case 1: printf("FhssChangeChannel"); break;
dudmuck 0:be215de91a68 215 case 2: printf("CadDetected"); break;
dudmuck 0:be215de91a68 216 }
dudmuck 0:be215de91a68 217 printf(" DIO0:");
dudmuck 0:be215de91a68 218 switch (radio.RegDioMapping1.bits.Dio0Mapping) {
dudmuck 0:be215de91a68 219 case 0: printf("RxDone"); break;
dudmuck 0:be215de91a68 220 case 1: printf("TxDone"); break;
dudmuck 0:be215de91a68 221 case 2: printf("CadDone"); break;
dudmuck 0:be215de91a68 222 }
dudmuck 0:be215de91a68 223
dudmuck 0:be215de91a68 224 printf("\r\n");
dudmuck 0:be215de91a68 225 }
dudmuck 0:be215de91a68 226
dudmuck 0:be215de91a68 227 void lora_print_status()
dudmuck 0:be215de91a68 228 {
dudmuck 0:be215de91a68 229 uint8_t d;
dudmuck 0:be215de91a68 230
dudmuck 0:be215de91a68 231 if (radio.type == SX1276)
dudmuck 0:be215de91a68 232 printf("\r\nSX1276 ");
dudmuck 0:be215de91a68 233 else if (radio.type == SX1272)
dudmuck 0:be215de91a68 234 printf("\r\nSX1272 ");
dudmuck 0:be215de91a68 235
dudmuck 0:be215de91a68 236 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
dudmuck 0:be215de91a68 237 if (!radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:be215de91a68 238 printf("FSK\r\n");
dudmuck 0:be215de91a68 239 return;
dudmuck 0:be215de91a68 240 }
dudmuck 0:be215de91a68 241
dudmuck 0:be215de91a68 242 print_dio();
dudmuck 0:be215de91a68 243 printf("LoRa ");
dudmuck 0:be215de91a68 244
dudmuck 0:be215de91a68 245 // printing LoRa registers at 0x0d -> 0x3f
dudmuck 0:be215de91a68 246
dudmuck 0:be215de91a68 247 radio.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
dudmuck 0:be215de91a68 248 radio.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2);
dudmuck 0:be215de91a68 249
dudmuck 0:be215de91a68 250 printCodingRate(false); // false: transmitted coding rate
dudmuck 0:be215de91a68 251 printHeaderMode();
dudmuck 0:be215de91a68 252 printBw();
dudmuck 0:be215de91a68 253 printSf();
dudmuck 0:be215de91a68 254 printRxPayloadCrcOn();
dudmuck 0:be215de91a68 255 // RegModemStat
dudmuck 0:be215de91a68 256 printf("ModemStat:0x%02x\r\n", radio.read_reg(REG_LR_MODEMSTAT));
dudmuck 0:be215de91a68 257
dudmuck 0:be215de91a68 258 // fifo ptrs:
dudmuck 0:be215de91a68 259 radio.RegPayloadLength = radio.read_reg(REG_LR_PAYLOADLENGTH);
dudmuck 0:be215de91a68 260 radio.RegRxMaxPayloadLength = radio.read_reg(REG_LR_RX_MAX_PAYLOADLENGTH);
dudmuck 0:be215de91a68 261 printf("fifoptr=0x%02x txbase=0x%02x rxbase=0x%02x payloadLength=0x%02x maxlen=0x%02x",
dudmuck 0:be215de91a68 262 radio.read_reg(REG_LR_FIFOADDRPTR),
dudmuck 0:be215de91a68 263 radio.read_reg(REG_LR_FIFOTXBASEADDR),
dudmuck 0:be215de91a68 264 radio.read_reg(REG_LR_FIFORXBASEADDR),
dudmuck 0:be215de91a68 265 radio.RegPayloadLength,
dudmuck 0:be215de91a68 266 radio.RegRxMaxPayloadLength
dudmuck 0:be215de91a68 267 );
dudmuck 0:be215de91a68 268
dudmuck 0:be215de91a68 269 radio.RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS);
dudmuck 0:be215de91a68 270 printLoraIrqs_(false);
dudmuck 0:be215de91a68 271
dudmuck 0:be215de91a68 272 radio.RegHopPeriod = radio.read_reg(REG_LR_HOPPERIOD);
dudmuck 0:be215de91a68 273 if (radio.RegHopPeriod != 0) {
dudmuck 0:be215de91a68 274 printf("\r\nHopPeriod:0x%02x\r\n", radio.RegHopPeriod);
dudmuck 0:be215de91a68 275 }
dudmuck 0:be215de91a68 276
dudmuck 0:be215de91a68 277 printf("SymbTimeout:0x%03x ", radio.read_u16(REG_LR_MODEMCONFIG2) & 0x3ff);
dudmuck 0:be215de91a68 278
dudmuck 0:be215de91a68 279 radio.RegPreamble = radio.read_u16(REG_LR_PREAMBLEMSB);
dudmuck 0:be215de91a68 280 printf("PreambleLength:0x%03x ", radio.RegPreamble);
dudmuck 0:be215de91a68 281
dudmuck 0:be215de91a68 282
dudmuck 0:be215de91a68 283 if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE) {
dudmuck 0:be215de91a68 284 d = radio.read_reg(REG_LR_RSSIVALUE);
dudmuck 0:be215de91a68 285 printf("rssi:%ddBm ", d-120);
dudmuck 0:be215de91a68 286 }
dudmuck 0:be215de91a68 287
dudmuck 0:be215de91a68 288 printTxContinuousMode();
dudmuck 0:be215de91a68 289
dudmuck 0:be215de91a68 290 printf("\r\n");
dudmuck 0:be215de91a68 291 printAgcAutoOn();
dudmuck 0:be215de91a68 292 if (radio.type == SX1272) {
dudmuck 0:be215de91a68 293 printf(" LowDataRateOptimize:%d\r\n", radio.RegModemConfig.sx1272bits.LowDataRateOptimize);
dudmuck 0:be215de91a68 294 }
dudmuck 0:be215de91a68 295
dudmuck 0:be215de91a68 296 printf("\r\nHeaderCount:%d PacketCount:%d, ",
dudmuck 0:be215de91a68 297 radio.read_u16(REG_LR_RXHEADERCNTVALUE_MSB), radio.read_u16(REG_LR_RXPACKETCNTVALUE_MSB));
dudmuck 0:be215de91a68 298
dudmuck 0:be215de91a68 299 printf("Lora detection threshold:%02x\r\n", radio.read_reg(REG_LR_DETECTION_THRESHOLD));
dudmuck 0:be215de91a68 300 radio.RegTest31.octet = radio.read_reg(REG_LR_TEST31);
dudmuck 0:be215de91a68 301 printf("detect_trig_same_peaks_nb:%d\r\n", radio.RegTest31.bits.detect_trig_same_peaks_nb);
dudmuck 0:be215de91a68 302
dudmuck 0:be215de91a68 303 if (radio.type == SX1272) {
dudmuck 0:be215de91a68 304 radio.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
dudmuck 0:be215de91a68 305 printf("LowDataRateOptimize:%d\r\n", radio.RegModemConfig.sx1272bits.LowDataRateOptimize);
dudmuck 0:be215de91a68 306 } else if (radio.type == SX1276) {
dudmuck 0:be215de91a68 307 radio.RegModemConfig3.octet = radio.read_reg(REG_LR_MODEMCONFIG3);
dudmuck 0:be215de91a68 308 printf("LowDataRateOptimize:%d\r\n", radio.RegModemConfig3.sx1276bits.LowDataRateOptimize);
dudmuck 0:be215de91a68 309 }
dudmuck 0:be215de91a68 310
dudmuck 0:be215de91a68 311 printf("\r\n");
dudmuck 0:be215de91a68 312 //printf("A %02x\r\n", radio.RegModemConfig2.octet);
dudmuck 0:be215de91a68 313 }
dudmuck 0:be215de91a68 314
dudmuck 0:be215de91a68 315 void printOpMode()
dudmuck 0:be215de91a68 316 {
dudmuck 0:be215de91a68 317 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
dudmuck 0:be215de91a68 318 switch (radio.RegOpMode.bits.Mode) {
dudmuck 0:be215de91a68 319 case RF_OPMODE_SLEEP: printf("sleep"); break;
dudmuck 0:be215de91a68 320 case RF_OPMODE_STANDBY: printf("stby"); break;
dudmuck 0:be215de91a68 321 case RF_OPMODE_SYNTHESIZER_TX: printf("fstx"); break;
dudmuck 0:be215de91a68 322 case RF_OPMODE_TRANSMITTER: printf("tx"); break;
dudmuck 0:be215de91a68 323 case RF_OPMODE_SYNTHESIZER_RX: printf("fsrx"); break;
dudmuck 0:be215de91a68 324 case RF_OPMODE_RECEIVER: printf("rx"); break;
dudmuck 0:be215de91a68 325 case 6:
dudmuck 0:be215de91a68 326 if (radio.RegOpMode.bits.LongRangeMode)
dudmuck 0:be215de91a68 327 printf("rxs");
dudmuck 0:be215de91a68 328 else
dudmuck 0:be215de91a68 329 printf("-6-");
dudmuck 0:be215de91a68 330 break; // todo: different lora/fsk
dudmuck 0:be215de91a68 331 case 7:
dudmuck 0:be215de91a68 332 if (radio.RegOpMode.bits.LongRangeMode)
dudmuck 0:be215de91a68 333 printf("cad");
dudmuck 0:be215de91a68 334 else
dudmuck 0:be215de91a68 335 printf("-7-");
dudmuck 0:be215de91a68 336 break; // todo: different lora/fsk
dudmuck 0:be215de91a68 337 }
dudmuck 0:be215de91a68 338 }
dudmuck 0:be215de91a68 339
dudmuck 0:be215de91a68 340 void
dudmuck 0:be215de91a68 341 printPa()
dudmuck 0:be215de91a68 342 {
dudmuck 0:be215de91a68 343 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
dudmuck 0:be215de91a68 344 if (radio.RegPaConfig.bits.PaSelect) {
dudmuck 0:be215de91a68 345 float output_dBm = 17 - (15-radio.RegPaConfig.bits.OutputPower);
dudmuck 0:be215de91a68 346 printf(" PABOOST OutputPower=%.1fdBm", output_dBm);
dudmuck 0:be215de91a68 347 } else {
dudmuck 0:be215de91a68 348 float pmax = (0.6*radio.RegPaConfig.bits.MaxPower) + 10.8;
dudmuck 0:be215de91a68 349 float output_dBm = pmax - (15-radio.RegPaConfig.bits.OutputPower);
dudmuck 0:be215de91a68 350 printf(" RFO pmax=%.1fdBm OutputPower=%.1fdBm", pmax, output_dBm);
dudmuck 0:be215de91a68 351 }
dudmuck 0:be215de91a68 352 }
dudmuck 0:be215de91a68 353
dudmuck 0:be215de91a68 354 void /* things always present, whether lora or fsk */
dudmuck 0:be215de91a68 355 common_print_status()
dudmuck 0:be215de91a68 356 {
dudmuck 0:be215de91a68 357 printf("version:0x%02x %.3fMHz ", radio.read_reg(REG_VERSION), radio.get_frf_MHz());
dudmuck 0:be215de91a68 358 printOpMode();
dudmuck 0:be215de91a68 359
dudmuck 0:be215de91a68 360 printPa();
dudmuck 0:be215de91a68 361
dudmuck 0:be215de91a68 362 radio.RegOcp.octet = radio.read_reg(REG_OCP);
dudmuck 0:be215de91a68 363 if (radio.RegOcp.bits.OcpOn) {
dudmuck 0:be215de91a68 364 int imax = 0;
dudmuck 0:be215de91a68 365 if (radio.RegOcp.bits.OcpTrim < 16)
dudmuck 0:be215de91a68 366 imax = 45 + (5 * radio.RegOcp.bits.OcpTrim);
dudmuck 0:be215de91a68 367 else if (radio.RegOcp.bits.OcpTrim < 28)
dudmuck 0:be215de91a68 368 imax = -30 + (10 * radio.RegOcp.bits.OcpTrim);
dudmuck 0:be215de91a68 369 else
dudmuck 0:be215de91a68 370 imax = 240;
dudmuck 0:be215de91a68 371 printf(" OcpOn %dmA ", imax);
dudmuck 0:be215de91a68 372 } else
dudmuck 0:be215de91a68 373 printf(" OcpOFF ");
dudmuck 0:be215de91a68 374
dudmuck 0:be215de91a68 375 printf("\r\n");
dudmuck 0:be215de91a68 376
dudmuck 0:be215de91a68 377 }
dudmuck 0:be215de91a68 378
dudmuck 0:be215de91a68 379 void print_rx_buf(int len)
dudmuck 0:be215de91a68 380 {
dudmuck 0:be215de91a68 381 int i;
dudmuck 0:be215de91a68 382
dudmuck 0:be215de91a68 383 printf("000:");
dudmuck 0:be215de91a68 384 for (i = 0; i < len; i++) {
dudmuck 0:be215de91a68 385 //printf("(%d)%02x ", i % 16, rx_buf[i]);
dudmuck 0:be215de91a68 386 printf("%02x ", radio.rx_buf[i]);
dudmuck 0:be215de91a68 387 if (i % 16 == 15 && i != len-1)
dudmuck 0:be215de91a68 388 printf("\r\n%03d:", i+1);
dudmuck 0:be215de91a68 389
dudmuck 0:be215de91a68 390 }
dudmuck 0:be215de91a68 391 printf("\r\n");
dudmuck 0:be215de91a68 392 }
dudmuck 0:be215de91a68 393
dudmuck 0:be215de91a68 394 void
dudmuck 0:be215de91a68 395 service_radio()
dudmuck 0:be215de91a68 396 {
dudmuck 0:be215de91a68 397 service_action_e act = radio.service();
dudmuck 0:be215de91a68 398
dudmuck 0:be215de91a68 399 switch (act) {
dudmuck 0:be215de91a68 400 case SERVICE_READ_FIFO:
dudmuck 0:be215de91a68 401 if (app == APP_NONE) {
dudmuck 0:be215de91a68 402 printLoraIrqs_(false);
dudmuck 0:be215de91a68 403 if (radio.RegHopPeriod > 0) {
dudmuck 0:be215de91a68 404 radio.RegHopChannel.octet = radio.read_reg(REG_LR_HOPCHANNEL);
dudmuck 0:be215de91a68 405 printf("HopCH:%d ", radio.RegHopChannel.bits.FhssPresentChannel);
dudmuck 0:be215de91a68 406 }
dudmuck 0:be215de91a68 407 printCodingRate(true); // true: of received packet
dudmuck 0:be215de91a68 408 printf(" crc%s %.1fdB %ddBm\r\n",
dudmuck 0:be215de91a68 409 radio.RegHopChannel.bits.RxPayloadCrcOn ? "On" : "OFF",
dudmuck 0:be215de91a68 410 radio.RegPktSnrValue / 4.0,
dudmuck 0:be215de91a68 411 radio.RegPktRssiValue - 137
dudmuck 0:be215de91a68 412 );
dudmuck 0:be215de91a68 413 print_rx_buf(radio.RegRxNbBytes);
dudmuck 0:be215de91a68 414 } else if (app == APP_CHAT) {
dudmuck 0:be215de91a68 415 if (radio.RegHopChannel.bits.RxPayloadCrcOn) {
dudmuck 0:be215de91a68 416 if (radio.RegIrqFlags.bits.PayloadCrcError)
dudmuck 0:be215de91a68 417 printf("crcError\r\n");
dudmuck 0:be215de91a68 418 else {
dudmuck 0:be215de91a68 419 int n = radio.RegRxNbBytes;
dudmuck 0:be215de91a68 420 radio.rx_buf[n++] = '\r';
dudmuck 0:be215de91a68 421 radio.rx_buf[n++] = '\n';
dudmuck 0:be215de91a68 422 radio.rx_buf[n] = 0; // null terminate
dudmuck 0:be215de91a68 423 printf((char *)radio.rx_buf);
dudmuck 0:be215de91a68 424 }
dudmuck 0:be215de91a68 425 } else
dudmuck 0:be215de91a68 426 printf("crcOff\r\n");
dudmuck 0:be215de91a68 427
dudmuck 0:be215de91a68 428 // clear Irq flags
dudmuck 0:be215de91a68 429 radio.write_reg(REG_LR_IRQFLAGS, radio.RegIrqFlags.octet);
dudmuck 0:be215de91a68 430 // should still be in receive mode
dudmuck 0:be215de91a68 431 }
dudmuck 0:be215de91a68 432 break;
dudmuck 0:be215de91a68 433 case SERVICE_TX_DONE:
dudmuck 0:be215de91a68 434 if (app == APP_CHAT) {
dudmuck 0:be215de91a68 435 radio.lora_start_rx();
dudmuck 0:be215de91a68 436 }
dudmuck 0:be215de91a68 437 break;
dudmuck 0:be215de91a68 438 case SERVICE_ERROR:
dudmuck 0:be215de91a68 439 printf("error\r\n");
dudmuck 0:be215de91a68 440 break;
dudmuck 0:be215de91a68 441 } // ...switch (act)
dudmuck 0:be215de91a68 442 }
dudmuck 0:be215de91a68 443
dudmuck 0:be215de91a68 444 void user_init(void)
dudmuck 0:be215de91a68 445 {
dudmuck 0:be215de91a68 446 // set desired spreadingfactor, bandwidth, MHz, etc.
dudmuck 0:be215de91a68 447 }
dudmuck 0:be215de91a68 448
dudmuck 0:be215de91a68 449 int get_kbd_str(char* buf, int size)
dudmuck 0:be215de91a68 450 {
dudmuck 0:be215de91a68 451 char c;
dudmuck 0:be215de91a68 452 int i;
dudmuck 0:be215de91a68 453 static int prev_len;
dudmuck 0:be215de91a68 454
dudmuck 0:be215de91a68 455 for (i = 0;;) {
dudmuck 0:be215de91a68 456 if (pc.readable()) {
dudmuck 0:be215de91a68 457 c = pc.getc();
dudmuck 0:be215de91a68 458 if (c == 8 && i > 0) {
dudmuck 0:be215de91a68 459 pc.putc(8);
dudmuck 0:be215de91a68 460 pc.putc(' ');
dudmuck 0:be215de91a68 461 pc.putc(8);
dudmuck 0:be215de91a68 462 i--;
dudmuck 0:be215de91a68 463 } else if (c == '\r') {
dudmuck 0:be215de91a68 464 if (i == 0) {
dudmuck 0:be215de91a68 465 return prev_len; // repeat previous
dudmuck 0:be215de91a68 466 } else {
dudmuck 0:be215de91a68 467 buf[i] = 0; // null terminate
dudmuck 0:be215de91a68 468 prev_len = i;
dudmuck 0:be215de91a68 469 return i;
dudmuck 0:be215de91a68 470 }
dudmuck 0:be215de91a68 471 } else if (c == 3) {
dudmuck 0:be215de91a68 472 // ctrl-C abort
dudmuck 0:be215de91a68 473 return -1;
dudmuck 0:be215de91a68 474 } else if (i < size) {
dudmuck 0:be215de91a68 475 buf[i++] = c;
dudmuck 0:be215de91a68 476 pc.putc(c);
dudmuck 0:be215de91a68 477 }
dudmuck 0:be215de91a68 478 } else
dudmuck 0:be215de91a68 479 service_radio();
dudmuck 0:be215de91a68 480 } // ...for()
dudmuck 0:be215de91a68 481 }
dudmuck 0:be215de91a68 482
dudmuck 0:be215de91a68 483 void
dudmuck 0:be215de91a68 484 console_chat()
dudmuck 0:be215de91a68 485 {
dudmuck 0:be215de91a68 486 int i, len = get_kbd_str(pcbuf, sizeof(pcbuf));
dudmuck 0:be215de91a68 487 if (len < 0) {
dudmuck 0:be215de91a68 488 printf("chat abort\r\n");
dudmuck 0:be215de91a68 489 app = APP_NONE;
dudmuck 0:be215de91a68 490 return;
dudmuck 0:be215de91a68 491 } else {
dudmuck 0:be215de91a68 492 for (i = 0; i < len; i++)
dudmuck 0:be215de91a68 493 radio.tx_buf[i] = pcbuf[i];
dudmuck 0:be215de91a68 494 radio.RegPayloadLength = len;
dudmuck 0:be215de91a68 495 radio.write_reg(REG_LR_PAYLOADLENGTH, radio.RegPayloadLength);
dudmuck 0:be215de91a68 496 radio.lora_start_tx(len);
dudmuck 0:be215de91a68 497 printf("\r\n");
dudmuck 0:be215de91a68 498 }
dudmuck 0:be215de91a68 499 }
dudmuck 0:be215de91a68 500
dudmuck 0:be215de91a68 501 void
dudmuck 0:be215de91a68 502 console()
dudmuck 0:be215de91a68 503 {
dudmuck 0:be215de91a68 504 int len, i;
dudmuck 0:be215de91a68 505 uint8_t a, d;
dudmuck 0:be215de91a68 506
dudmuck 0:be215de91a68 507 len = get_kbd_str(pcbuf, sizeof(pcbuf));
dudmuck 0:be215de91a68 508 if (len < 0) {
dudmuck 0:be215de91a68 509 printf("abort\r\n");
dudmuck 0:be215de91a68 510 return;
dudmuck 0:be215de91a68 511 }
dudmuck 0:be215de91a68 512
dudmuck 0:be215de91a68 513 printf("\r\n");
dudmuck 0:be215de91a68 514 if (len == 1) {
dudmuck 0:be215de91a68 515 switch (pcbuf[0]) {
dudmuck 0:be215de91a68 516 case 'i':
dudmuck 0:be215de91a68 517 radio.init();
dudmuck 0:be215de91a68 518 user_init();
dudmuck 0:be215de91a68 519 break;
dudmuck 0:be215de91a68 520 case 'h':
dudmuck 0:be215de91a68 521 printf("hw_reset()\r\n");
dudmuck 0:be215de91a68 522 radio.hw_reset();
dudmuck 0:be215de91a68 523 break;
dudmuck 0:be215de91a68 524 case 'R':
dudmuck 0:be215de91a68 525 // read all registers
dudmuck 0:be215de91a68 526 for (a = 1; a < 0x71; a++) {
dudmuck 0:be215de91a68 527 d = radio.read_reg(a);
dudmuck 0:be215de91a68 528 //update_shadow_regs(selected_radio, a, d);
dudmuck 0:be215de91a68 529 printf("%02x: %02x\r\n", a, d);
dudmuck 0:be215de91a68 530 }
dudmuck 0:be215de91a68 531 break;
dudmuck 0:be215de91a68 532 case 'T':
dudmuck 0:be215de91a68 533 radio.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2);
dudmuck 0:be215de91a68 534 //printf("a %02x\r\n", radio.RegModemConfig2.octet);
dudmuck 0:be215de91a68 535 radio.RegModemConfig2.sx1276bits.TxContinuousMode ^= 1; // same for sx1272 and sx1276
dudmuck 0:be215de91a68 536 //printf("b %02x\r\n", radio.RegModemConfig2.octet);
dudmuck 0:be215de91a68 537 radio.write_reg(REG_LR_MODEMCONFIG2, radio.RegModemConfig2.octet);
dudmuck 0:be215de91a68 538 radio.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG);
dudmuck 0:be215de91a68 539 //printf("c %02x\r\n", radio.RegModemConfig2.octet);
dudmuck 0:be215de91a68 540 printTxContinuousMode();
dudmuck 0:be215de91a68 541 printf("\r\n");
dudmuck 0:be215de91a68 542 break;
dudmuck 0:be215de91a68 543 case 'C':
dudmuck 0:be215de91a68 544 radio.setRxPayloadCrcOn(!radio.getRxPayloadCrcOn());
dudmuck 0:be215de91a68 545 printRxPayloadCrcOn();
dudmuck 0:be215de91a68 546 printf("\r\n");
dudmuck 0:be215de91a68 547 break;
dudmuck 0:be215de91a68 548 case 'B':
dudmuck 0:be215de91a68 549 radio.RegPaConfig.bits.PaSelect ^= 1;
dudmuck 0:be215de91a68 550 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
dudmuck 0:be215de91a68 551 printPa();
dudmuck 0:be215de91a68 552 printf("\r\n");
dudmuck 0:be215de91a68 553 break;
dudmuck 0:be215de91a68 554 case '?':
dudmuck 0:be215de91a68 555 printf("i radio_init\r\n");
dudmuck 0:be215de91a68 556 printf("h hw_reset\r\n");
dudmuck 0:be215de91a68 557 printf("hm toggle explicit/explicit header mode\r\n");
dudmuck 0:be215de91a68 558 printf("tx[ %%d] transmit\r\n");
dudmuck 0:be215de91a68 559 printf("rx receive\r\n");
dudmuck 0:be215de91a68 560 printf("cr[1234] set coding rate\r\n");
dudmuck 0:be215de91a68 561 printf("bw[%%d] get/set bandwidth\r\n");
dudmuck 0:be215de91a68 562 printf("sf[%%d] get/set spreading factor\r\n");
dudmuck 0:be215de91a68 563 printf("pl[%%d] get/set RegPayloadLength\r\n");
dudmuck 0:be215de91a68 564 printf("C toggle crcOn\r\n");
dudmuck 0:be215de91a68 565 printf("T toggle TxContinuousMode\r\n");
dudmuck 0:be215de91a68 566 printf("op[%%d] get/set output power\r\n");
dudmuck 0:be215de91a68 567 printf("hp[%%d] get/set hop period\r\n");
dudmuck 0:be215de91a68 568 printf("d[0-5] change DIO pin assignment\r\n");
dudmuck 0:be215de91a68 569 break;
dudmuck 0:be215de91a68 570 case '.':
dudmuck 0:be215de91a68 571 lora_print_status();
dudmuck 0:be215de91a68 572 common_print_status();
dudmuck 0:be215de91a68 573 break;
dudmuck 0:be215de91a68 574 } // ...switch (pcbuf[0])
dudmuck 0:be215de91a68 575 } else {
dudmuck 0:be215de91a68 576 if (pcbuf[0] == 't' && pcbuf[1] == 'x') { // TX
dudmuck 0:be215de91a68 577 if (pcbuf[2] == ' ') {
dudmuck 0:be215de91a68 578 sscanf(pcbuf+3, "%d", &i);
dudmuck 0:be215de91a68 579 radio.RegPayloadLength = i;
dudmuck 0:be215de91a68 580 }
dudmuck 0:be215de91a68 581 tx_cnt++;
dudmuck 0:be215de91a68 582 for (i = 0; i < radio.RegPayloadLength; i++)
dudmuck 0:be215de91a68 583 radio.tx_buf[i] = tx_cnt;
dudmuck 0:be215de91a68 584 radio.lora_start_tx(radio.RegPayloadLength);
dudmuck 0:be215de91a68 585 } else if (pcbuf[0] == 'h' && pcbuf[1] == 'p') { //
dudmuck 0:be215de91a68 586 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 0:be215de91a68 587 sscanf(pcbuf+2, "%d", &i);
dudmuck 0:be215de91a68 588 radio.RegHopPeriod = i;
dudmuck 0:be215de91a68 589 radio.write_reg(REG_LR_HOPPERIOD, radio.RegHopPeriod);
dudmuck 0:be215de91a68 590 if (radio.RegDioMapping1.bits.Dio1Mapping != 1) {
dudmuck 0:be215de91a68 591 radio.RegDioMapping1.bits.Dio1Mapping = 1;
dudmuck 0:be215de91a68 592 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
dudmuck 0:be215de91a68 593 }
dudmuck 0:be215de91a68 594 }
dudmuck 0:be215de91a68 595 radio.RegHopPeriod = radio.read_reg(REG_LR_HOPPERIOD);
dudmuck 0:be215de91a68 596 printf("HopPeriod:0x%02x\r\n", radio.RegHopPeriod);
dudmuck 0:be215de91a68 597 } else if (pcbuf[0] == 'r' && pcbuf[1] == 'x') { // RX
dudmuck 0:be215de91a68 598 radio.lora_start_rx();
dudmuck 0:be215de91a68 599 } else if (pcbuf[0] == 'r' && pcbuf[1] == ' ') { // read single register
dudmuck 0:be215de91a68 600 sscanf(pcbuf+2, "%x", &i);
dudmuck 0:be215de91a68 601 printf("%02x: %02x\r\n", i, radio.read_reg(i));
dudmuck 0:be215de91a68 602 } else if (pcbuf[0] == 'w' && pcbuf[1] == ' ') { // write single register
dudmuck 0:be215de91a68 603 sscanf(pcbuf+2, "%x %x", &i, &len);
dudmuck 0:be215de91a68 604 radio.write_reg(i, len);
dudmuck 0:be215de91a68 605 printf("%02x: %02x\r\n", i, radio.read_reg(i));
dudmuck 0:be215de91a68 606 } else if (pcbuf[0] == 'o' && pcbuf[1] == 'p') {
dudmuck 0:be215de91a68 607 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 0:be215de91a68 608 sscanf(pcbuf+2, "%d", &i);
dudmuck 0:be215de91a68 609 radio.RegPaConfig.bits.OutputPower = i;
dudmuck 0:be215de91a68 610 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
dudmuck 0:be215de91a68 611 }
dudmuck 0:be215de91a68 612 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
dudmuck 0:be215de91a68 613 printf("OutputPower:%d\r\n", radio.RegPaConfig.bits.OutputPower);
dudmuck 0:be215de91a68 614 } else if (pcbuf[0] == 'c' && pcbuf[1] == 'r') {
dudmuck 0:be215de91a68 615 if (pcbuf[2] >= '0' && pcbuf[2] <= '9')
dudmuck 0:be215de91a68 616 radio.setCodingRate(pcbuf[2] - '0');
dudmuck 0:be215de91a68 617 radio.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
dudmuck 0:be215de91a68 618 printCodingRate(false); // false: transmitted
dudmuck 0:be215de91a68 619 printf("\r\n");
dudmuck 0:be215de91a68 620 } else if (pcbuf[0] == 'h' && pcbuf[1] == 'm') { // toggle implicit/explicit
dudmuck 0:be215de91a68 621 radio.setHeaderMode(!radio.getHeaderMode());
dudmuck 0:be215de91a68 622 radio.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
dudmuck 0:be215de91a68 623 printHeaderMode();
dudmuck 0:be215de91a68 624 printf("\r\n");
dudmuck 0:be215de91a68 625 } else if (pcbuf[0] == 'b' && pcbuf[1] == 'w') {
dudmuck 0:be215de91a68 626 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 0:be215de91a68 627 radio.set_opmode(RF_OPMODE_STANDBY);
dudmuck 0:be215de91a68 628 sscanf(&pcbuf[2], "%d", &i);
dudmuck 0:be215de91a68 629 radio.setBw(i);
dudmuck 0:be215de91a68 630 } else
dudmuck 0:be215de91a68 631 printAllBw();
dudmuck 0:be215de91a68 632 radio.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
dudmuck 0:be215de91a68 633 printf("current ");
dudmuck 0:be215de91a68 634 printBw();
dudmuck 0:be215de91a68 635 printf("\r\n");
dudmuck 0:be215de91a68 636 } else if (pcbuf[0] == 'v' && pcbuf[1] == 'h') {
dudmuck 0:be215de91a68 637 radio.poll_vh ^= 1;
dudmuck 0:be215de91a68 638 printf("poll_vh:%d\r\n", radio.poll_vh);
dudmuck 0:be215de91a68 639 } else if (pcbuf[0] == 's' && pcbuf[1] == 'f') {
dudmuck 0:be215de91a68 640 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 0:be215de91a68 641 sscanf(pcbuf+2, "%d", &i);
dudmuck 0:be215de91a68 642 radio.setSf(i);
dudmuck 0:be215de91a68 643 if (i == 6 && !radio.getHeaderMode()) {
dudmuck 0:be215de91a68 644 printf("SF6: to implicit header mode\r\n");
dudmuck 0:be215de91a68 645 radio.setHeaderMode(true);
dudmuck 0:be215de91a68 646 }
dudmuck 0:be215de91a68 647 }
dudmuck 0:be215de91a68 648 radio.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2);
dudmuck 0:be215de91a68 649 printSf();
dudmuck 0:be215de91a68 650 printf("\r\n");
dudmuck 0:be215de91a68 651 } else if (pcbuf[0] == 'f' && pcbuf[1] == 'r' && pcbuf[2] == 'f') {
dudmuck 0:be215de91a68 652 if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
dudmuck 0:be215de91a68 653 float MHz;
dudmuck 0:be215de91a68 654 sscanf(pcbuf+3, "%f", &MHz);
dudmuck 0:be215de91a68 655 //printf("MHz:%f\r\n", MHz);
dudmuck 0:be215de91a68 656 radio.set_frf_MHz(MHz);
dudmuck 0:be215de91a68 657 } else
dudmuck 0:be215de91a68 658 printf("%fMHz\r\n", radio.get_frf_MHz());
dudmuck 0:be215de91a68 659 } else if (pcbuf[0] == 'p' && pcbuf[1] == 'l') {
dudmuck 0:be215de91a68 660 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 0:be215de91a68 661 sscanf(pcbuf+2, "%d", &i);
dudmuck 0:be215de91a68 662 radio.RegPayloadLength = i;
dudmuck 0:be215de91a68 663 radio.write_reg(REG_LR_PAYLOADLENGTH, radio.RegPayloadLength);
dudmuck 0:be215de91a68 664 }
dudmuck 0:be215de91a68 665 radio.RegPayloadLength = radio.read_reg(REG_LR_PAYLOADLENGTH);
dudmuck 0:be215de91a68 666 printf("PayloadLength:%d\r\n", radio.RegPayloadLength);
dudmuck 0:be215de91a68 667 } else if (pcbuf[0] == 'd' && pcbuf[1] >= '0' && pcbuf[1] <= '5') {
dudmuck 0:be215de91a68 668 switch (pcbuf[1]) {
dudmuck 0:be215de91a68 669 case '0':
dudmuck 0:be215de91a68 670 radio.RegDioMapping1.bits.Dio0Mapping++;
dudmuck 0:be215de91a68 671 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
dudmuck 0:be215de91a68 672 break;
dudmuck 0:be215de91a68 673 case '1':
dudmuck 0:be215de91a68 674 radio.RegDioMapping1.bits.Dio1Mapping++;
dudmuck 0:be215de91a68 675 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
dudmuck 0:be215de91a68 676 break;
dudmuck 0:be215de91a68 677 case '2':
dudmuck 0:be215de91a68 678 radio.RegDioMapping1.bits.Dio2Mapping++;
dudmuck 0:be215de91a68 679 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
dudmuck 0:be215de91a68 680 break;
dudmuck 0:be215de91a68 681 case '3':
dudmuck 0:be215de91a68 682 radio.RegDioMapping1.bits.Dio3Mapping++;
dudmuck 0:be215de91a68 683 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
dudmuck 0:be215de91a68 684 break;
dudmuck 0:be215de91a68 685 case '4':
dudmuck 0:be215de91a68 686 radio.RegDioMapping2.bits.Dio4Mapping++;
dudmuck 0:be215de91a68 687 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping2.octet);
dudmuck 0:be215de91a68 688 break;
dudmuck 0:be215de91a68 689 case '5':
dudmuck 0:be215de91a68 690 radio.RegDioMapping2.bits.Dio5Mapping++;
dudmuck 0:be215de91a68 691 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping2.octet);
dudmuck 0:be215de91a68 692 break;
dudmuck 0:be215de91a68 693 } // ...switch (pcbuf[1])
dudmuck 0:be215de91a68 694 print_dio();
dudmuck 0:be215de91a68 695 } else if (pcbuf[0] == 's' && pcbuf[1] == 't' && pcbuf[2] == 'b') {
dudmuck 0:be215de91a68 696 radio.set_opmode(RF_OPMODE_STANDBY);
dudmuck 0:be215de91a68 697 } else if (pcbuf[0] == 's' && pcbuf[1] == 'l' && pcbuf[2] == 'e') {
dudmuck 0:be215de91a68 698 radio.set_opmode(RF_OPMODE_SLEEP);
dudmuck 0:be215de91a68 699 } else if (pcbuf[0] == 'c' && pcbuf[1] == 'h' && pcbuf[2] == 'a') {
dudmuck 0:be215de91a68 700 app = APP_CHAT;
dudmuck 0:be215de91a68 701 radio.lora_start_rx();
dudmuck 0:be215de91a68 702 printf("chat start\r\n");
dudmuck 0:be215de91a68 703 }
dudmuck 0:be215de91a68 704 }
dudmuck 0:be215de91a68 705 printf("> ");
dudmuck 0:be215de91a68 706 fflush(stdout);
dudmuck 0:be215de91a68 707
dudmuck 0:be215de91a68 708 }
dudmuck 0:be215de91a68 709
dudmuck 0:be215de91a68 710 int main()
dudmuck 0:be215de91a68 711 {
dudmuck 0:be215de91a68 712
dudmuck 0:be215de91a68 713 pc.baud(57600);
dudmuck 0:be215de91a68 714 user_init();
dudmuck 0:be215de91a68 715
dudmuck 0:be215de91a68 716 radio.frfs = frfs;
dudmuck 0:be215de91a68 717
dudmuck 0:be215de91a68 718 while(1) {
dudmuck 0:be215de91a68 719 switch (app) {
dudmuck 0:be215de91a68 720 case APP_NONE:
dudmuck 0:be215de91a68 721 console();
dudmuck 0:be215de91a68 722 break;
dudmuck 0:be215de91a68 723 case APP_CHAT:
dudmuck 0:be215de91a68 724 console_chat();
dudmuck 0:be215de91a68 725 break;
dudmuck 0:be215de91a68 726 } // ...switch (app)
dudmuck 0:be215de91a68 727 } // ...while(1)
dudmuck 0:be215de91a68 728 }
dudmuck 0:be215de91a68 729