UART console application for testing SX1272/SX1276
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 useh
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 toggleTxContinuousMode
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 asignmentsd1
to cycle DIO1 function untilDclk
is selectedd2
for DIO2, onlyData
function is available in FSK continuous mode
frf915.0
change to your desired RF center frequency (in this case 915MHz)rx
to start receiverstby
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)
command | description |
---|---|
. (period) | print current radio status |
? | list available commands |
L | toggle active radio modem (LoRa vs FSK) |
h | hardware reset, put radio into default power-on condition |
frf<MHz> | get/set RF operating frequency |
rx | start radio receiver (any received packets are printed onto your serial terminal) |
rssi | read 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 |
pas | toggle 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 |
dio | show 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 |
crcon | toggle crcOn |
lnab | cycle LNA-boost setting (receiver performance adjustment) |
R | read 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) |
pllbw | change PLL bandwidth |
stby | set chip mode to standby |
sleep | set chip mode to sleep |
fstx | set chip mode to fstx |
fsrx | set chip mode to fsrx |
Eiger range test commands | description |
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 |
perrx | start Eiger PER receive |
txpd<%d> | get/set tx delay between PER packets transmitted |
command list: LoRa modem commands
LoRa command | LoRa description |
---|---|
iqinv | toggle RX IQ invert |
cin | toggle 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 |
lhm | toggle explicit/implicit (explicit mode sends payload length with each packet) |
sf<%d> | get/set spreadingFactor (SF7 to SF12) |
ldr | toggle LowDataRateOptimize (changes payload encoding, for long packets) |
txc | toggle TxContinuousMode |
rxt<%d> | get/set SymbTimeout |
rxs | start RX_SINGLE (receives only for SymbTimeout symbols) |
cad<%d num tries> | run channel activity detection |
command list: FSK modem commands
FSK command | FSK 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 |
datam | toggle DataMode (packet/continuous) |
fifot | toggle TxStartCondition (FifoThreshold level vs FifoNotEmpty) |
br<%f kbps> | get/set bitrate |
dcf | increment DcFree (manchester / whitening) |
pktf | toggle PacketFormat fixed/variable length |
syncon | toggle SyncOn (frame sync, SFD enable) |
bitsync | toggle 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) |
poll | toggle poll_irq_en. Radio events read from DIO pins vs polling of IrqFlags register |
E | empty out FIFO |
clkout | increment ClkOut divider |
ook | enter OOK mode |
ookt | increment OokThreshType |
ooks | increment OokPeakTheshStep |
sqlch<%d> | get/set OokFixedThresh |
Diff: main.cpp
- Revision:
- 20:b11592c9ba5f
- Parent:
- 19:be8a8b0e7320
- Child:
- 21:b84a77dfb43c
diff -r be8a8b0e7320 -r b11592c9ba5f main.cpp --- a/main.cpp Tue Aug 02 15:36:51 2016 -0700 +++ b/main.cpp Wed Aug 31 23:55:27 2016 +0000 @@ -26,6 +26,10 @@ bool ook_test_en; bool poll_irq_en; +volatile RegIrqFlags2_t fsk_RegIrqFlags2_prev; +volatile RegIrqFlags1_t fsk_RegIrqFlags1_prev; +Timer rx_start_timer; +uint32_t secs_rx_start; /***************************** eiger per: *************************************************/ @@ -65,6 +69,8 @@ #define FSK_RSSI_OFFSET 0 #define FSK_RSSI_SMOOTHING 2 +DigitalIn dio2(LORA_DIO2); +DigitalIn dio4(LORA_DIO4); #else /********************* ...mDot **********************/ @@ -82,6 +88,7 @@ #endif DigitalIn dio2(D4); +DigitalIn dio4(D8); void rfsw_callback() { @@ -107,6 +114,8 @@ SX127x_lora lora(radio); //Kermit kermit(lora); +volatile bool saved_dio4; + void printLoraIrqs_(bool clear) { //in radio class -- RegIrqFlags_t RegIrqFlags; @@ -906,7 +915,11 @@ } else { float pmax = (0.6*radio.RegPaConfig.bits.MaxPower) + 10.8; float output_dBm = pmax - (15-radio.RegPaConfig.bits.OutputPower); +#ifdef TARGET_MTS_MDOT_F411RE + printf(" \x1b[31mRFO pmax=%.1fdBm OutputPower=%.1fdBm\x1b[0m", pmax, output_dBm); // not connected +#else printf(" RFO pmax=%.1fdBm OutputPower=%.1fdBm", pmax, output_dBm); +#endif } } @@ -941,8 +954,12 @@ printf("PER device ID:%d\r\n", per_id); } - if (poll_irq_en) + if (poll_irq_en) { printf("poll_irq_en\r\n"); + if (!radio.RegOpMode.bits.LongRangeMode) { + printf("saved irqs: %02x %02x\r\n", fsk_RegIrqFlags1_prev.octet, fsk_RegIrqFlags2_prev.octet); + } + } } @@ -998,7 +1015,7 @@ } else { // fsk.. //fsk_tx_length = 9; } - PacketRxSequencePrev = -1; + PacketRxSequencePrev = 0; // transmitter side PacketTxCnt is 1 at first TX //PacketRxSequence = 0; PacketPerKoCnt = 0; PacketPerOkCnt = 0; @@ -1153,20 +1170,192 @@ lora.start_tx(lora.RegPayloadLength); } + void poll_service_radio() { if (radio.RegOpMode.bits.LongRangeMode) { } else { // fsk: - RegIrqFlags2_t RegIrqFlags2; + /*RegIrqFlags2_t RegIrqFlags2; if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER) { RegIrqFlags2.octet = radio.read_reg(REG_FSK_IRQFLAGS2); if (RegIrqFlags2.bits.PacketSent) { radio.set_opmode(RF_OPMODE_SLEEP); printf("poll mode fsk tx done\r\n"); } - } - } // ..fsk + }*/ + static uint8_t rssi; + RegIrqFlags2_t RegIrqFlags2; + RegIrqFlags1_t RegIrqFlags1; + RegIrqFlags1.octet = radio.read_reg(REG_FSK_IRQFLAGS1); + if (RegIrqFlags1.octet != fsk_RegIrqFlags1_prev.octet) { + printf("iF1:"); + if (RegIrqFlags1.bits.ModeReady ^ fsk_RegIrqFlags1_prev.bits.ModeReady) { + printf("ModeReady-"); + if (RegIrqFlags1.bits.ModeReady) + printf("on "); + else + printf("off "); + } + if (RegIrqFlags1.bits.RxReady ^ fsk_RegIrqFlags1_prev.bits.RxReady) { + printf("RxReady-"); + if (RegIrqFlags1.bits.RxReady) + printf("on "); + else + printf("off "); + } + if (RegIrqFlags1.bits.TxReady ^ fsk_RegIrqFlags1_prev.bits.TxReady) { + printf("TxReady-"); + if (RegIrqFlags1.bits.TxReady) + printf("on "); + else + printf("off "); + } + if (RegIrqFlags1.bits.PllLock ^ fsk_RegIrqFlags1_prev.bits.PllLock) { + printf("PllLock-"); + if (RegIrqFlags1.bits.PllLock) + printf("on "); + else + printf("off "); + } + if (RegIrqFlags1.bits.Rssi ^ fsk_RegIrqFlags1_prev.bits.Rssi) { + printf("Rssi-"); + if (RegIrqFlags1.bits.Rssi) + printf("on "); + else + printf("off "); + } + if (RegIrqFlags1.bits.Timeout ^ fsk_RegIrqFlags1_prev.bits.Timeout) { + printf("Timeout-"); + if (RegIrqFlags1.bits.Timeout) + printf("on "); + else + printf("off "); + } + if (RegIrqFlags1.bits.PreambleDetect ^ fsk_RegIrqFlags1_prev.bits.PreambleDetect) { + printf("PreambleDetect-"); + if (RegIrqFlags1.bits.PreambleDetect) + printf("on "); + else + printf("off "); + } + if (RegIrqFlags1.bits.SyncAddressMatch ^ fsk_RegIrqFlags1_prev.bits.SyncAddressMatch) { + printf("SyncAddressMatch-"); + if (RegIrqFlags1.bits.SyncAddressMatch) + printf("on "); + else + printf("off "); + } + fsk_RegIrqFlags1_prev.octet = RegIrqFlags1.octet; + printf("\r\n"); + fflush(stdout); + } + RegIrqFlags2.octet = radio.read_reg(REG_FSK_IRQFLAGS2); + if (RegIrqFlags2.octet != fsk_RegIrqFlags2_prev.octet) { + printf("iF2:"); + if (RegIrqFlags2.bits.FifoFull ^ fsk_RegIrqFlags2_prev.bits.FifoFull) { + printf("FifoFull-"); + if (RegIrqFlags2.bits.FifoFull) + printf("on "); + else + printf("off "); + } + if (RegIrqFlags2.bits.FifoEmpty ^ fsk_RegIrqFlags2_prev.bits.FifoEmpty) { + printf("FifoEmpty-"); + if (RegIrqFlags2.bits.FifoEmpty) + printf("on "); + else { + printf("off "); + rssi = radio.read_reg(REG_FSK_RSSIVALUE); + } + } + if (RegIrqFlags2.bits.FifoLevel ^ fsk_RegIrqFlags2_prev.bits.FifoLevel) { + printf("FifoLevel-"); + if (RegIrqFlags2.bits.FifoLevel) + printf("on "); + else + printf("off "); + } + if (RegIrqFlags2.bits.FifoOverrun ^ fsk_RegIrqFlags2_prev.bits.FifoOverrun) { + printf("FifoOverrun-"); + if (RegIrqFlags2.bits.FifoOverrun) + printf("on "); + else + printf("off "); + } + if (RegIrqFlags2.bits.PacketSent ^ fsk_RegIrqFlags2_prev.bits.PacketSent) { + printf("PacketSent-"); + if (RegIrqFlags2.bits.PacketSent) { + printf("on "); + } else + printf("off "); + } + if (RegIrqFlags2.bits.PayloadReady ^ fsk_RegIrqFlags2_prev.bits.PayloadReady) { + printf("PayloadReady-"); + if (RegIrqFlags2.bits.PayloadReady) + printf("on "); + else + printf("off "); + } + if (RegIrqFlags2.bits.CrcOk ^ fsk_RegIrqFlags2_prev.bits.CrcOk) { + printf("CrcOk-"); + if (RegIrqFlags2.bits.CrcOk) + printf("on "); + else + printf("off "); + } + if (RegIrqFlags2.bits.LowBat ^ fsk_RegIrqFlags2_prev.bits.LowBat) { + printf("LowBat-"); + if (RegIrqFlags2.bits.LowBat) + printf("on "); + else + printf("off "); + } + fsk_RegIrqFlags2_prev.octet = RegIrqFlags2.octet; + printf("\r\n"); + fflush(stdout); + + if (RegIrqFlags2.bits.PacketSent) { + if (fsk.tx_done_sleep) + radio.set_opmode(RF_OPMODE_SLEEP); + else + radio.set_opmode(RF_OPMODE_STANDBY); + } + + if (RegIrqFlags2.bits.CrcOk || RegIrqFlags2.bits.PayloadReady) { + if (fsk.RegRxConfig.bits.AfcAutoOn) { + fsk.RegAfcValue = radio.read_s16(REG_FSK_AFCMSB); + printf("%dHz ", (int)(FREQ_STEP_HZ * fsk.RegAfcValue)); + if (rssi != 0) { + printf("pkt:-%.1fdBm ", rssi / 2.0); + rssi = 0; + } + } + if (fsk.RegPktConfig1.bits.PacketFormatVariable) { + fsk.rx_buf_length = radio.read_reg(REG_FIFO); + } else { + fsk.rx_buf_length = fsk.RegPktConfig2.bits.PayloadLength; + } + + radio.m_cs = 0; + radio.m_spi.write(REG_FIFO); // bit7 is low for reading from radio + for (int i = 0; i < fsk.rx_buf_length; i++) { + radio.rx_buf[i] = radio.m_spi.write(0); + } + radio.m_cs = 1; + /****/ + if (per_en) { + if (!per_parse_rx(fsk.rx_buf_length)) { + PacketNormalCnt++; + print_rx_buf(fsk.rx_buf_length); + } + } else { + print_rx_buf(fsk.rx_buf_length); + } + fflush(stdout); + } // ..if CrcOk or PayloadReady + } // ..if RegIrqFlags2 changed + } // ...fsk } void cadper_service() @@ -1200,6 +1389,26 @@ } +void cmd_restart_rx(uint8_t); +Timeout timeout_syncAddress; +int preamble_to_sync_us; +bool get_syncAddress; +float preamble_detect_at; + +void callback_sa_timeout() +{ + printf("syncAddress timeout "); + if (dio2.read() == 0) { + //cmd_restart_rx(0); + rx_start_timer.reset(); + radio.set_opmode(RF_OPMODE_STANDBY); + printf("(false preamble detect at %f, secs:%u)\r\n", preamble_detect_at, time(NULL) - secs_rx_start); + secs_rx_start = time(NULL); + radio.set_opmode(RF_OPMODE_RECEIVER); + } else + printf("\r\n"); +} + void service_radio() { @@ -1300,16 +1509,43 @@ case SERVICE_ERROR: case SERVICE_NONE: break; - } // ...switch (act) + } // ...switch (act) - /* fsk sync address */ - if (dio2 && radio.RegDioMapping1.bits.Dio2Mapping == 3) { - // syncAdrs when in RX mode - if (rssi == 0) { + /* FSK receiver handling of preamble detection */ + if (radio.RegDioMapping2.bits.MapPreambleDetect && radio.RegDioMapping2.bits.Dio4Mapping == 3) { + if (saved_dio4 != dio4.read()) { + //printf("predet-dio4:%d\r\n", dio4.read()); + /* FSK: preamble detect state change */ + if (dio4.read()) { + if (radio.RegDioMapping1.bits.Dio2Mapping == 3) { // if we can see SyncAddress + get_syncAddress = true; + timeout_syncAddress.attach_us(callback_sa_timeout, preamble_to_sync_us); + } + /* how long after RX start is preamble detection occuring? */ + //printf("preamble detect at %f\r\n", rx_start_timer.read()); + preamble_detect_at = rx_start_timer.read(); + } else { + get_syncAddress = false; + //printf("preamble detect clear\r\n"); + } + saved_dio4 = dio4.read(); + } + } // ..if dio4 is + + if (radio.RegDioMapping1.bits.Dio2Mapping == 3) { + if (dio2.read()) { + if (get_syncAddress) { + timeout_syncAddress.detach(); + get_syncAddress = false; + } rssi = radio.read_reg(REG_FSK_RSSIVALUE); } } + /*if (radio.RegDioMapping1.bits.Dio1Mapping == 1 && radio.dio1) { + = radio.read_reg(REG_FSK_RSSIVALUE); + }*/ + } // ...!radio.RegOpMode.bits.LongRangeMode } @@ -1756,7 +1992,7 @@ fsk.RegRxConfig.octet = radio.read_reg(REG_FSK_RXCONFIG); fsk.RegRxConfig.bits.AfcAutoOn = 1; fsk.RegRxConfig.bits.AgcAutoOn = 1; - fsk.RegRxConfig.bits.RxTrigger = 7; + fsk.RegRxConfig.bits.RxTrigger = 7; // both radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet); fsk.RegPreambleDetect.bits.PreambleDetectorOn = 1; @@ -1806,14 +2042,54 @@ fsk.set_rx_dcc_bw_hz(5208, 0); // rxbw fsk.set_rx_dcc_bw_hz(10417, 1); // afcbw radio.write_u16(REG_FSK_PREAMBLEMSB, 8); - break; + break; + case '6': + fsk.set_bitrate(65536); + fsk.set_tx_fdev_hz(16384); + fsk.set_rx_dcc_bw_hz(62500, 0); // rxbw + fsk.set_rx_dcc_bw_hz(100000, 1); // afcbw + radio.write_u16(REG_FSK_PREAMBLEMSB, 5); + fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG); + fsk.RegSyncConfig.bits.SyncSize = 2; + radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet); + radio.write_reg(REG_FSK_SYNCVALUE3, 0x33); + radio.write_reg(REG_FSK_SYNCVALUE2, 0xcb); + radio.write_reg(REG_FSK_SYNCVALUE1, 0x82); + + fsk.RegRxConfig.bits.RxTrigger = 6; // preamble + radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet); + radio.RegDioMapping2.bits.Dio4Mapping = 3; + radio.RegDioMapping2.bits.MapPreambleDetect = 1; // dio4 to preambleDetect in RX + radio.write_reg(REG_DIOMAPPING2, radio.RegDioMapping2.octet); + radio.RegDioMapping1.bits.Dio2Mapping = 3; // dio2 to SyncAddress in RX + radio.RegDioMapping1.bits.Dio1Mapping = 1; // to FifoEmpty + radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet); + break; } // ...switch (pcbuf[idx]) printf("%" PRIu32 "bps fdev:%" PRIu32 "hz ", fsk.get_bitrate(), fsk.get_tx_fdev_hz()); printf("rxbw:%" PRIu32 "Hz ", fsk.get_rx_bw_hz(REG_FSK_RXBW)); - printf("afcbw:%" PRIu32 "Hz preambleLen:%" PRIu16 "\r\n", fsk.get_rx_bw_hz(REG_FSK_AFCBW), radio.read_u16(REG_FSK_PREAMBLEMSB)); + printf("afcbw:%" PRIu32 "Hz preambleLen:%" PRIu16 "\r\n", fsk.get_rx_bw_hz(REG_FSK_AFCBW), radio.read_u16(REG_FSK_PREAMBLEMSB)); + + /* time between preamble occurring and syncAddress occuring + * = bitrate in microseconds * 8 * (preamble bytes + sync bytes) + */ + preamble_to_sync_us = (1.0 / fsk.get_bitrate())*1e6 * 8 * (radio.read_u16(REG_FSK_PREAMBLEMSB)+1 + fsk.RegSyncConfig.bits.SyncSize+2); + //printf("bitrate:%d, %f\r\n", fsk.get_bitrate(), 1.0 / fsk.get_bitrate()*1e6); + printf("preamble_to_sync_us:%d\r\n", preamble_to_sync_us); } } +void cmd_restart_rx(uint8_t idx) +{ + fsk.RegRxConfig.octet = radio.read_reg(REG_FSK_RXCONFIG); + fsk.RegRxConfig.bits.RestartRxWithoutPllLock = 1; + radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet); + rx_start_timer.reset(); + secs_rx_start = time(NULL); + fsk.RegRxConfig.bits.RestartRxWithoutPllLock = 0; + printf("RestartRxWithoutPllLock\r\n"); +} + void cmd_toggle_modem(uint8_t idx) { ook_test_en = false; @@ -1955,7 +2231,7 @@ set_per_en(true); PacketNormalCnt = 0; - PacketRxSequencePrev = -1; + PacketRxSequencePrev = 0; // transmitter side PacketTxCnt is 1 at first TX PacketPerKoCnt = 0; PacketPerOkCnt = 0; @@ -2062,6 +2338,13 @@ if (radio.RegOpMode.bits.LongRangeMode) lora.start_rx(RF_OPMODE_RECEIVER); else { + if (poll_irq_en) { + fsk_RegIrqFlags2_prev.octet = 0; + fsk_RegIrqFlags1_prev.octet = 0; + } + + rx_start_timer.start(); + secs_rx_start = time(NULL); fsk.start_rx(); radio.RegDioMapping1.bits.Dio2Mapping = 3; // dio2 to syncadrs radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet); @@ -2727,9 +3010,11 @@ { poll_irq_en ^= 1; printf("poll_irq_en:"); - if (poll_irq_en) + if (poll_irq_en) { printf("irqFlags register\r\n"); - else + fsk_RegIrqFlags1_prev.octet = 0; + fsk_RegIrqFlags2_prev.octet = 0; + } else printf("DIO pin interrupt\r\n"); } @@ -2762,7 +3047,7 @@ set_per_en(true); PacketNormalCnt = 0; - PacketRxSequencePrev = -1; + PacketRxSequencePrev = 0; // transmitter side PacketTxCnt is 1 at first TX PacketPerKoCnt = 0; PacketPerOkCnt = 0; //dio3.rise(&dio3_cb); @@ -3180,6 +3465,7 @@ { MODEM_FSK, "ar", cmd_fsk_AutoRestartRxMode, "","(RX) increment AutoRestartRxMode"}, { MODEM_FSK, "alc", cmd_fsk_AfcAutoClearOn, "","(RX) toggle AfcAutoClearOn"}, { MODEM_FSK, "mp", cmd_MapPreambleDetect, "","(RX) toggle MapPreambleDetect"}, + { MODEM_FSK, "rrx", cmd_restart_rx, "","restart RX"}, { MODEM_BOTH, "op", cmd_op, "<dBm>","(TX) get/set TX power"}, #ifdef LORA_TX_TEST @@ -3457,7 +3743,7 @@ toggle_per_en(); PacketNormalCnt = 0; - PacketRxSequencePrev = -1; + PacketRxSequencePrev = 0; PacketPerKoCnt = 0; PacketPerOkCnt = 0; @@ -3489,6 +3775,9 @@ (void)radio.get_frf_MHz(); radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG); +#ifdef TARGET_MTS_MDOT_F411RE + radio.RegPaConfig.bits.PaSelect = 1; // mDot uses PA_BOOST +#else if (shield_type == SHIELD_TYPE_LAS) { // LAS HF=PA_BOOST LF=RFO if (radio.HF) @@ -3498,7 +3787,8 @@ } else if (shield_type == SHIELD_TYPE_MAS) { // MAS HF=RFO LF=RFO radio.RegPaConfig.bits.PaSelect = 0; - } + } +#endif radio.RegPaConfig.bits.OutputPower = 15; radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);