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.
Dependents: LoRaWAN-lmic-app_tjm
Fork of LMiC by
Diff: radio.cpp
- Revision:
- 1:d3b7bde3995c
- Parent:
- 0:62d1edcc13d1
- Child:
- 2:974cafbfb159
- Child:
- 3:519c71d29a06
--- a/radio.cpp Thu Jan 22 12:50:49 2015 +0000
+++ b/radio.cpp Tue Mar 31 13:36:56 2015 +0000
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2014 IBM Corporation.
+ * Copyright (c) 2014-2015 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -14,15 +14,16 @@
* USE_SMTC_RADIO_DRIVER preprocessing directive
* in lmic.h
*******************************************************************************/
+
#include "lmic.h"
#if USE_SMTC_RADIO_DRIVER
#include "sx1276-hal.h"
/*!
- * Syncword for lora networks (nibbles swapped)
+ * Syncword for lora networks
*/
-#define LORA_MAC_SYNCWORD 0x34
+#define LORA_MAC_SYNCWORD 0x34
/*
* Callback functions prototypes
@@ -81,7 +82,7 @@
{
ostime_t now = os_getTime( );
// save exact tx time
- LMIC.txend = now - us2osticks( 43 ); // TXDONE FIXUP
+ LMIC.txend = now - us2osticks( RADIO_WAKEUP_TIME ); // TXDONE FIXUP
// go from stanby to sleep
Radio.Sleep( );
@@ -93,14 +94,18 @@
{
ostime_t now = os_getTime( );
// save exact rx time
- LMIC.rxtime = now - LORA_RXDONE_FIXUP[getSf( LMIC.rps )];
+ if( getBw( LMIC.rps ) == BW125 )
+ {
+ now -= LORA_RXDONE_FIXUP[getSf( LMIC.rps )];
+ }
+ LMIC.rxtime = now;
// read the PDU and inform the MAC that we received something
LMIC.dataLen = size;
// now read the FIFO
memcpy( LMIC.frame, payload, size );
// read rx quality parameters
- LMIC.rxq.snr = snr; // SNR [dB] * 4
- LMIC.rxq.rssi = rssi; // RSSI [dBm] (-196...+63)
+ LMIC.snr = snr; // SNR [dB] * 4
+ LMIC.rssi = rssi; // RSSI [dBm] (-196...+63)
// go from stanby to sleep
Radio.Sleep( );
@@ -113,7 +118,8 @@
ostime_t now = os_getTime( );
// indicate error
-
+ LMIC.dataLen = 0;
+
// go from stanby to sleep
Radio.Sleep( );
// run os job (use preset func ptr)
@@ -230,7 +236,7 @@
else
{ // LoRa modem
- Radio.SetTxConfig( MODEM_LORA, LMIC.txpow, 0, getBw( LMIC.rps ), getSf( LMIC.rps ) + 6, getCr( LMIC.rps ) + 1, 8, getIh( LMIC.rps ) ? true : false, ( getNocrc(LMIC.rps) == 0 ) ? true : false, 0, 0, false, 3e6 );
+ Radio.SetTxConfig( MODEM_LORA, LMIC.txpow, 0, getBw( LMIC.rps ), getSf( LMIC.rps ) + 6, getCr( LMIC.rps ) + 1, 8, getIh( LMIC.rps ) ? true : false, ( getNocrc( LMIC.rps ) == 0 ) ? true : false, 0, 0, false, 3e6 );
}
//starttx( ); // buf=LMIC.frame, len=LMIC.dataLen
@@ -249,8 +255,14 @@
}
else
{ // LoRa modem
-
- Radio.SetRxConfig( MODEM_LORA, getBw( LMIC.rps ), getSf( LMIC.rps ) + 6, getCr( LMIC.rps ) + 1, 0, 8, LMIC.rxsyms, getIh( LMIC.rps ) ? true : false, getIh(LMIC.rps), ( getNocrc(LMIC.rps) == 0 ) ? true : false, 0, 0, true, false );
+ if( ( getSf( LMIC.rps ) <= SF9 ) && ( LMIC.rxsyms < 8 ) )
+ {
+ Radio.SetRxConfig( MODEM_LORA, getBw( LMIC.rps ), getSf( LMIC.rps ) + 6, getCr( LMIC.rps ) + 1, 0, 8, LMIC.rxsyms + 3, getIh( LMIC.rps ) ? true : false, getIh( LMIC.rps ), ( getNocrc( LMIC.rps ) == 0 ) ? true : false, 0, 0, true, false );
+ }
+ else
+ {
+ Radio.SetRxConfig( MODEM_LORA, getBw( LMIC.rps ), getSf( LMIC.rps ) + 6, getCr( LMIC.rps ) + 1, 0, 8, LMIC.rxsyms, getIh( LMIC.rps ) ? true : false, getIh( LMIC.rps ), ( getNocrc( LMIC.rps ) == 0 ) ? true : false, 0, 0, true, false );
+ }
}
// now instruct the radio to receive
@@ -279,10 +291,10 @@
}
else
{ // LoRa modem
- Radio.SetRxConfig( MODEM_LORA, getBw( LMIC.rps ), getSf( LMIC.rps ) + 6, getCr( LMIC.rps ) + 1, 0, 8, LMIC.rxsyms, getIh( LMIC.rps ) ? true : false, getIh(LMIC.rps), ( getNocrc(LMIC.rps) == 0 ) ? true : false, 0, 0, true, true );
+ Radio.SetRxConfig( MODEM_LORA, getBw( LMIC.rps ), getSf( LMIC.rps ) + 6, getCr( LMIC.rps ) + 1, 0, 8, LMIC.rxsyms, getIh( LMIC.rps ) ? true : false, getIh( LMIC.rps ), ( getNocrc( LMIC.rps ) == 0 ) ? true : false, 0, 0, true, true );
}
- //startrx( RXMODE_SCAN) ; // buf = LMIC.frame
+ //startrx( RXMODE_SCAN ); // buf = LMIC.frame
Radio.Rx( 0 );
break;
}
@@ -448,7 +460,7 @@
#define SX1276_MC3_AGCAUTO 0x04
// preamble for lora networks (nibbles swapped)
-#define LORA_MAC_PREAMBLE 0x34
+#define LORA_MAC_PREAMBLE 0x34
#define RXLORA_RXMODE_RSSI_REG_MODEM_CONFIG1 0x0A
#ifdef CFG_sx1276_radio
@@ -539,6 +551,12 @@
#error Missing CFG_sx1272_radio/CFG_sx1276_radio
#endif
+#define RADIO_DBG
+#if defined(RADIO_DBG)
+DigitalOut txStateIo( PB_8 );
+DigitalOut rxStateIo( PB_9 );
+#endif
+
static void writeReg (u1_t addr, u1_t data ) {
hal_pin_nss(0);
hal_spi(addr | 0x80);
@@ -576,7 +594,7 @@
writeReg(RegOpMode, (readReg(RegOpMode) & ~OPMODE_MASK) | mode);
}
-static void opmodeLora(void) {
+static void opmodeLora() {
u1_t u = OPMODE_LORA;
#ifdef CFG_sx1276_radio
u |= 0x8; // TBD: sx1276 high freq
@@ -584,7 +602,7 @@
writeReg(RegOpMode, u);
}
-static void opmodeFSK(void) {
+static void opmodeFSK() {
u1_t u = 0;
#ifdef CFG_sx1276_radio
u |= 0x8; // TBD: sx1276 high freq
@@ -593,79 +611,79 @@
}
// configure LoRa modem (cfg1, cfg2)
-static void configLoraModem (void) {
+static void configLoraModem () {
sf_t sf = getSf(LMIC.rps);
#ifdef CFG_sx1276_radio
- u1_t mc1 = 0, mc2 = 0, mc3 = 0;
+ u1_t mc1 = 0, mc2 = 0, mc3 = 0;
- switch (getBw(LMIC.rps)) {
- case BW125: mc1 |= SX1276_MC1_BW_125; break;
- case BW250: mc1 |= SX1276_MC1_BW_250; break;
- case BW500: mc1 |= SX1276_MC1_BW_500; break;
- default:
- ASSERT(0);
- }
- switch( getCr(LMIC.rps) ) {
- case CR_4_5: mc1 |= SX1276_MC1_CR_4_5; break;
- case CR_4_6: mc1 |= SX1276_MC1_CR_4_6; break;
- case CR_4_7: mc1 |= SX1276_MC1_CR_4_7; break;
- case CR_4_8: mc1 |= SX1276_MC1_CR_4_8; break;
- default:
- ASSERT(0);
- }
+ switch (getBw(LMIC.rps)) {
+ case BW125: mc1 |= SX1276_MC1_BW_125; break;
+ case BW250: mc1 |= SX1276_MC1_BW_250; break;
+ case BW500: mc1 |= SX1276_MC1_BW_500; break;
+ default:
+ ASSERT(0);
+ }
+ switch( getCr(LMIC.rps) ) {
+ case CR_4_5: mc1 |= SX1276_MC1_CR_4_5; break;
+ case CR_4_6: mc1 |= SX1276_MC1_CR_4_6; break;
+ case CR_4_7: mc1 |= SX1276_MC1_CR_4_7; break;
+ case CR_4_8: mc1 |= SX1276_MC1_CR_4_8; break;
+ default:
+ ASSERT(0);
+ }
- if (getIh(LMIC.rps)) {
- mc1 |= SX1276_MC1_IMPLICIT_HEADER_MODE_ON;
- writeReg(LORARegPayloadLength, getIh(LMIC.rps)); // required length
- }
- // set ModemConfig1
- writeReg(LORARegModemConfig1, mc1);
+ if (getIh(LMIC.rps)) {
+ mc1 |= SX1276_MC1_IMPLICIT_HEADER_MODE_ON;
+ writeReg(LORARegPayloadLength, getIh(LMIC.rps)); // required length
+ }
+ // set ModemConfig1
+ writeReg(LORARegModemConfig1, mc1);
- mc2 = (SX1272_MC2_SF7 + ((sf-1)<<4));
- if (getNocrc(LMIC.rps) == 0) {
- mc2 |= SX1276_MC2_RX_PAYLOAD_CRCON;
- }
- writeReg(LORARegModemConfig2, mc2);
-
- mc3 = SX1276_MC3_AGCAUTO;
- if (sf == SF11 || sf == SF12) {
- mc3 |= SX1276_MC3_LOW_DATA_RATE_OPTIMIZE;
- }
- writeReg(LORARegModemConfig3, mc3);
+ mc2 = (SX1272_MC2_SF7 + ((sf-1)<<4));
+ if (getNocrc(LMIC.rps) == 0) {
+ mc2 |= SX1276_MC2_RX_PAYLOAD_CRCON;
+ }
+ writeReg(LORARegModemConfig2, mc2);
+
+ mc3 = SX1276_MC3_AGCAUTO;
+ if ((sf == SF11 || sf == SF12) && getBw(LMIC.rps) == BW125) {
+ mc3 |= SX1276_MC3_LOW_DATA_RATE_OPTIMIZE;
+ }
+ writeReg(LORARegModemConfig3, mc3);
#elif CFG_sx1272_radio
- u1_t mc1 = (getBw(LMIC.rps)<<6);
+ u1_t mc1 = (getBw(LMIC.rps)<<6);
- switch( getCr(LMIC.rps) ) {
- case CR_4_5: mc1 |= SX1272_MC1_CR_4_5; break;
- case CR_4_6: mc1 |= SX1272_MC1_CR_4_6; break;
- case CR_4_7: mc1 |= SX1272_MC1_CR_4_7; break;
- case CR_4_8: mc1 |= SX1272_MC1_CR_4_8; break;
- }
-
- if (sf == SF11 || sf == SF12) {
- mc1 |= SX1272_MC1_LOW_DATA_RATE_OPTIMIZE;
- }
-
- if (getNocrc(LMIC.rps) == 0) {
- mc1 |= SX1272_MC1_RX_PAYLOAD_CRCON;
- }
-
- if (getIh(LMIC.rps)) {
- mc1 |= SX1272_MC1_IMPLICIT_HEADER_MODE_ON;
- writeReg(LORARegPayloadLength, getIh(LMIC.rps)); // required length
- }
- // set ModemConfig1
- writeReg(LORARegModemConfig1, mc1);
-
- // set ModemConfig2 (sf, AgcAutoOn=1 SymbTimeoutHi=00)
- writeReg(LORARegModemConfig2, (SX1272_MC2_SF7 + ((sf-1)<<4)) | 0x04);
+ switch( getCr(LMIC.rps) ) {
+ case CR_4_5: mc1 |= SX1272_MC1_CR_4_5; break;
+ case CR_4_6: mc1 |= SX1272_MC1_CR_4_6; break;
+ case CR_4_7: mc1 |= SX1272_MC1_CR_4_7; break;
+ case CR_4_8: mc1 |= SX1272_MC1_CR_4_8; break;
+ }
+
+ if ((sf == SF11 || sf == SF12) && getBw(LMIC.rps) == BW125) {
+ mc1 |= SX1272_MC1_LOW_DATA_RATE_OPTIMIZE;
+ }
+
+ if (getNocrc(LMIC.rps) == 0) {
+ mc1 |= SX1272_MC1_RX_PAYLOAD_CRCON;
+ }
+
+ if (getIh(LMIC.rps)) {
+ mc1 |= SX1272_MC1_IMPLICIT_HEADER_MODE_ON;
+ writeReg(LORARegPayloadLength, getIh(LMIC.rps)); // required length
+ }
+ // set ModemConfig1
+ writeReg(LORARegModemConfig1, mc1);
+
+ // set ModemConfig2 (sf, AgcAutoOn=1 SymbTimeoutHi=00)
+ writeReg(LORARegModemConfig2, (SX1272_MC2_SF7 + ((sf-1)<<4)) | 0x04);
#else
#error Missing CFG_sx1272_radio/CFG_sx1276_radio
#endif /* CFG_sx1272_radio */
}
-static void configChannel (void) {
+static void configChannel () {
// set frequency: FQ = (FRF * 32 Mhz) / (2 ^ 19)
u8_t frf = ((u8_t)LMIC.freq << 19) / 32000000;
writeReg(RegFrfMsb, (u1_t)(frf>>16));
@@ -675,26 +693,26 @@
-static void configPower (void) {
+static void configPower () {
#ifdef CFG_sx1276_radio
// no boost used for now
s1_t pw = (s1_t)LMIC.txpow;
- if(pw > 14) {
- pw = 14;
- } else if(pw < -1) {
- pw = -1;
+ if(pw >= 17) {
+ pw = 15;
+ } else if(pw < 2) {
+ pw = 2;
}
// check board type for BOOST pin
- writeReg(RegPaConfig, (u1_t)(0x00|((pw+1)&0xf)));
+ writeReg(RegPaConfig, (u1_t)(0x80|(pw&0xf)));
writeReg(RegPaDac, readReg(RegPaDac)|0x4);
#elif CFG_sx1272_radio
// set PA config (2-17 dBm using PA_BOOST)
s1_t pw = (s1_t)LMIC.txpow;
if(pw > 17) {
- pw = 17;
+ pw = 17;
} else if(pw < 2) {
- pw = 2;
+ pw = 2;
}
writeReg(RegPaConfig, (u1_t)(0x80|(pw-2)));
#else
@@ -702,12 +720,16 @@
#endif /* CFG_sx1272_radio */
}
-static void txfsk (void) {
+static void txfsk () {
// select FSK modem (from sleep mode)
writeReg(RegOpMode, 0x10); // FSK, BT=0.5
ASSERT(readReg(RegOpMode) == 0x10);
// enter standby mode (required for FIFO loading))
opmode(OPMODE_STANDBY);
+#if defined(RADIO_DBG)
+ txStateIo = 0;
+ rxStateIo = 0;
+#endif
// set bitrate
writeReg(FSKRegBitrateMsb, 0x02); // 50kbps
writeReg(FSKRegBitrateLsb, 0x80);
@@ -743,9 +765,12 @@
// now we actually start the transmission
opmode(OPMODE_TX);
+#if defined(RADIO_DBG)
+ txStateIo = 1;
+#endif
}
-static void txlora (void) {
+static void txlora () {
// select LoRa modem (from sleep mode)
//writeReg(RegOpMode, OPMODE_LORA);
opmodeLora();
@@ -753,6 +778,10 @@
// enter standby mode (required for FIFO loading))
opmode(OPMODE_STANDBY);
+#if defined(RADIO_DBG)
+ txStateIo = 0;
+ rxStateIo = 0;
+#endif
// configure LoRa modem (cfg1, cfg2)
configLoraModem();
// configure frequency
@@ -786,7 +815,7 @@
}
// start transmitter (buf=LMIC.frame, len=LMIC.dataLen)
-static void starttx (void) {
+static void starttx () {
ASSERT( (readReg(RegOpMode) & OPMODE_MASK) == OPMODE_SLEEP );
if(getSf(LMIC.rps) == FSK) { // FSK modem
txfsk();
@@ -812,6 +841,10 @@
ASSERT((readReg(RegOpMode) & OPMODE_LORA) != 0);
// enter standby mode (warm up))
opmode(OPMODE_STANDBY);
+#if defined(RADIO_DBG)
+ txStateIo = 0;
+ rxStateIo = 0;
+#endif
// don't use MAC settings at startup
if(rxmode == RXMODE_RSSI) { // use fixed settings for rssi scan
writeReg(LORARegModemConfig1, RXLORA_RXMODE_RSSI_REG_MODEM_CONFIG1);
@@ -846,9 +879,15 @@
// now instruct the radio to receive
if (rxmode == RXMODE_SINGLE) { // single rx
hal_waitUntil(LMIC.rxtime); // busy wait until exact rx time
- opmode(OPMODE_RX_SINGLE);
+ opmode(OPMODE_RX_SINGLE);
+#if defined(RADIO_DBG)
+ rxStateIo = 1;
+#endif
} else { // continous rx (scan or rssi)
- opmode(OPMODE_RX);
+ opmode(OPMODE_RX);
+#if defined(RADIO_DBG)
+ rxStateIo = 1;
+#endif
}
}
@@ -861,6 +900,10 @@
ASSERT((readReg(RegOpMode) & OPMODE_LORA) == 0);
// enter standby mode (warm up))
opmode(OPMODE_STANDBY);
+#if defined(RADIO_DBG)
+ txStateIo = 0;
+ rxStateIo = 0;
+#endif
// configure frequency
configChannel();
// set LNA gain
@@ -901,6 +944,9 @@
// now instruct the radio to receive
hal_waitUntil(LMIC.rxtime); // busy wait until exact rx time
opmode(OPMODE_RX); // no single rx mode available in FSK
+#if defined(RADIO_DBG)
+ rxStateIo = 1;
+#endif
}
static void startrx (u1_t rxmode) {
@@ -915,7 +961,7 @@
}
// get random seed from wideband noise rssi
-void radio_init (void) {
+void radio_init () {
hal_disableIRQs();
// manually reset radio
@@ -929,6 +975,10 @@
hal_waitUntil(os_getTime()+ms2osticks(5)); // wait 5ms
opmode(OPMODE_SLEEP);
+#if defined(RADIO_DBG)
+ txStateIo = 0;
+ rxStateIo = 0;
+#endif
// some sanity checks, e.g., read version number
u1_t v = readReg(RegVersion);
#ifdef CFG_sx1276_radio
@@ -950,7 +1000,7 @@
}
randbuf[0] = 16; // set initial index
-#ifdef CFG_sx1276_radio
+#ifdef CFG_sx1276mb1_board
// chain calibration
writeReg(RegPaConfig, 0);
@@ -967,15 +1017,19 @@
// Launch Rx chain calibration for HF band
writeReg(FSKRegImageCal, (readReg(FSKRegImageCal) & RF_IMAGECAL_IMAGECAL_MASK)|RF_IMAGECAL_IMAGECAL_START);
while((readReg(FSKRegImageCal) & RF_IMAGECAL_IMAGECAL_RUNNING) == RF_IMAGECAL_IMAGECAL_RUNNING) { ; }
-#endif /* CFG_sx1276_radio */
+#endif /* CFG_sx1276mb1_board */
opmode(OPMODE_SLEEP);
+#if defined(RADIO_DBG)
+ txStateIo = 0;
+ rxStateIo = 0;
+#endif
hal_enableIRQs();
}
// return next random byte derived from seed buffer
// (buf[0] holds index of next byte to be returned)
-u1_t radio_rand1 (void) {
+u1_t radio_rand1 () {
u1_t i = randbuf[0];
ASSERT( i != 0 );
if( i==16 ) {
@@ -987,7 +1041,7 @@
return v;
}
-u1_t radio_rssi (void) {
+u1_t radio_rssi () {
hal_disableIRQs();
u1_t r = readReg(LORARegRssiValue);
hal_enableIRQs();
@@ -1009,56 +1063,63 @@
void radio_irq_handler (u1_t dio) {
ostime_t now = os_getTime();
if( (readReg(RegOpMode) & OPMODE_LORA) != 0) { // LORA modem
- u1_t flags = readReg(LORARegIrqFlags);
- if( flags & IRQ_LORA_TXDONE_MASK ) {
- // save exact tx time
- LMIC.txend = now - us2osticks(43); // TXDONE FIXUP
- } else if( flags & IRQ_LORA_RXDONE_MASK ) {
- // save exact rx time
- LMIC.rxtime = now - LORA_RXDONE_FIXUP[getSf(LMIC.rps)];
- // read the PDU and inform the MAC that we received something
- LMIC.dataLen = (readReg(LORARegModemConfig1) & SX1272_MC1_IMPLICIT_HEADER_MODE_ON) ?
- readReg(LORARegPayloadLength) : readReg(LORARegRxNbBytes);
- // set FIFO read address pointer
- writeReg(LORARegFifoAddrPtr, readReg(LORARegFifoRxCurrentAddr));
- // now read the FIFO
- readBuf(RegFifo, LMIC.frame, LMIC.dataLen);
- // read rx quality parameters
- LMIC.rxq.snr = readReg(LORARegPktSnrValue); // SNR [dB] * 4
- LMIC.rxq.rssi = readReg(LORARegPktRssiValue) - 125 + 64; // RSSI [dBm] (-196...+63)
- } else if( flags & IRQ_LORA_RXTOUT_MASK ) {
- // indicate timeout
- LMIC.dataLen = 0;
- }
+ u1_t flags = readReg(LORARegIrqFlags);
+ if( flags & IRQ_LORA_TXDONE_MASK ) {
+ // save exact tx time
+ LMIC.txend = now - us2osticks(43); // TXDONE FIXUP
+ } else if( flags & IRQ_LORA_RXDONE_MASK ) {
+ // save exact rx time
+ if(getBw(LMIC.rps) == BW125) {
+ now -= LORA_RXDONE_FIXUP[getSf(LMIC.rps)];
+ }
+ LMIC.rxtime = now;
+ // read the PDU and inform the MAC that we received something
+ LMIC.dataLen = (readReg(LORARegModemConfig1) & SX1272_MC1_IMPLICIT_HEADER_MODE_ON) ?
+ readReg(LORARegPayloadLength) : readReg(LORARegRxNbBytes);
+ // set FIFO read address pointer
+ writeReg(LORARegFifoAddrPtr, readReg(LORARegFifoRxCurrentAddr));
+ // now read the FIFO
+ readBuf(RegFifo, LMIC.frame, LMIC.dataLen);
+ // read rx quality parameters
+ LMIC.snr = readReg(LORARegPktSnrValue); // SNR [dB] * 4
+ LMIC.rssi = readReg(LORARegPktRssiValue) - 125 + 64; // RSSI [dBm] (-196...+63)
+ } else if( flags & IRQ_LORA_RXTOUT_MASK ) {
+ // indicate timeout
+ LMIC.dataLen = 0;
+ }
// mask all radio IRQs
writeReg(LORARegIrqFlagsMask, 0xFF);
// clear radio IRQ flags
writeReg(LORARegIrqFlags, 0xFF);
} else { // FSK modem
- u1_t flags1 = readReg(FSKRegIrqFlags1);
- u1_t flags2 = readReg(FSKRegIrqFlags2);
- if( flags2 & IRQ_FSK2_PACKETSENT_MASK ) {
- // save exact tx time
- LMIC.txend = now;
+ u1_t flags1 = readReg(FSKRegIrqFlags1);
+ u1_t flags2 = readReg(FSKRegIrqFlags2);
+ if( flags2 & IRQ_FSK2_PACKETSENT_MASK ) {
+ // save exact tx time
+ LMIC.txend = now;
} else if( flags2 & IRQ_FSK2_PAYLOADREADY_MASK ) {
- // save exact rx time
- LMIC.rxtime = now;
- // read the PDU and inform the MAC that we received something
- LMIC.dataLen = readReg(FSKRegPayloadLength);
- // now read the FIFO
- readBuf(RegFifo, LMIC.frame, LMIC.dataLen);
- // read rx quality parameters
- LMIC.rxq.snr = 0; // determine snr
- LMIC.rxq.rssi = 0; // determine rssi
- } else if( flags1 & IRQ_FSK1_TIMEOUT_MASK ) {
- // indicate timeout
- LMIC.dataLen = 0;
- } else {
+ // save exact rx time
+ LMIC.rxtime = now;
+ // read the PDU and inform the MAC that we received something
+ LMIC.dataLen = readReg(FSKRegPayloadLength);
+ // now read the FIFO
+ readBuf(RegFifo, LMIC.frame, LMIC.dataLen);
+ // read rx quality parameters
+ LMIC.snr = 0; // determine snr
+ LMIC.rssi = 0; // determine rssi
+ } else if( flags1 & IRQ_FSK1_TIMEOUT_MASK ) {
+ // indicate timeout
+ LMIC.dataLen = 0;
+ } else {
while(1);
}
}
// go from stanby to sleep
opmode(OPMODE_SLEEP);
+#if defined(RADIO_DBG)
+ txStateIo = 0;
+ rxStateIo = 0;
+#endif
// run os job (use preset func ptr)
os_setCallback(&LMIC.osjob, LMIC.osjob.func);
}
@@ -1069,21 +1130,34 @@
case RADIO_RST:
// put radio to sleep
opmode(OPMODE_SLEEP);
+#if defined(RADIO_DBG)
+ txStateIo = 0;
+ rxStateIo = 0;
+#endif
break;
case RADIO_TX:
- // transmit frame now
+ // transmit frame now
starttx(); // buf=LMIC.frame, len=LMIC.dataLen
+#if defined(RADIO_DBG)
+ txStateIo = 1;
+#endif
break;
case RADIO_RX:
- // receive frame now (exactly at rxtime)
+ // receive frame now (exactly at rxtime)
startrx(RXMODE_SINGLE); // buf=LMIC.frame, time=LMIC.rxtime, timeout=LMIC.rxsyms
+#if defined(RADIO_DBG)
+ rxStateIo = 1;
+#endif
break;
case RADIO_RXON:
// start scanning for beacon now
startrx(RXMODE_SCAN); // buf=LMIC.frame
+#if defined(RADIO_DBG)
+ rxStateIo = 1;
+#endif
break;
}
hal_enableIRQs();
