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.
Fork of LMiC by
Diff: radio.cpp
- Revision:
- 5:464c1f2d6cbb
- Parent:
- 4:85b2b647cb64
- Child:
- 6:eed5fd627a2b
--- a/radio.cpp Thu Nov 26 17:17:08 2015 +0000 +++ b/radio.cpp Tue Feb 23 15:34:27 2016 +0000 @@ -16,9 +16,10 @@ *******************************************************************************/ #include "lmic.h" +#include "debug.h" #if USE_SMTC_RADIO_DRIVER -#include "sx1276-hal.h" +#include "sx1272-hal.h" /*! * Syncword for lora networks @@ -71,7 +72,8 @@ /* * Radio object declraration */ -SX1276MB1xAS Radio( NULL ); +//SX1272MB1xAS Radio( NULL ); +SX1272MB1xAS *Radio; static const u2_t LORA_RXDONE_FIXUP[] = { [FSK] = us2osticks(0), // ( 0 ticks) @@ -85,18 +87,20 @@ void OnTxDone( void ) { + debug("OnTxDone enter\r\n"); ostime_t now = os_getTime( ); // save exact tx time LMIC.txend = now - us2osticks( RADIO_WAKEUP_TIME ); // TXDONE FIXUP // go from stanby to sleep - Radio.Sleep( ); + Radio->Sleep( ); // run os job (use preset func ptr) os_setCallback( &LMIC.osjob, LMIC.osjob.func ); } void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ) { + debug("OnRxDone enter\r\n"); ostime_t now = os_getTime( ); // save exact rx time if( getBw( LMIC.rps ) == BW125 ) @@ -113,45 +117,48 @@ LMIC.rssi = rssi; // RSSI [dBm] (-196...+63) // go from stanby to sleep - Radio.Sleep( ); + Radio->Sleep( ); // run os job (use preset func ptr) os_setCallback( &LMIC.osjob, LMIC.osjob.func ); } void OnTxTimeout( void ) { - ostime_t now = os_getTime( ); + debug("OnTxTimeout enter\r\n"); + ostime_t now = os_getTime( ); // indicate error LMIC.dataLen = 0; // go from stanby to sleep - Radio.Sleep( ); + Radio->Sleep( ); // run os job (use preset func ptr) os_setCallback( &LMIC.osjob, LMIC.osjob.func ); } void OnRxTimeout( void ) { - ostime_t now = os_getTime( ); + debug("OnRxTimeout enter\r\n"); + ostime_t now = os_getTime( ); // indicate timeout LMIC.dataLen = 0; // go from stanby to sleep - Radio.Sleep( ); + Radio->Sleep( ); // run os job (use preset func ptr) os_setCallback( &LMIC.osjob, LMIC.osjob.func ); } void OnRxError( void ) { + debug("OnRxError enter\r\n"); ostime_t now = os_getTime( ); // indicate error LMIC.dataLen = 0; // go from stanby to sleep - Radio.Sleep( ); + Radio->Sleep( ); // run os job (use preset func ptr) os_setCallback( &LMIC.osjob, LMIC.osjob.func ); } @@ -166,6 +173,8 @@ // get random seed from wideband noise rssi void radio_init( void ) { + debug("radio_init1 enter\r\n"); + Radio = new SX1272MB1xAS(NULL); hal_disableIRQs( ); // Initialize Radio driver @@ -174,13 +183,13 @@ RadioEvents.RxError = OnRxError; RadioEvents.TxTimeout = OnTxTimeout; RadioEvents.RxTimeout = OnRxTimeout; - Radio.Init( &RadioEvents ); + Radio->Init( &RadioEvents ); // seed 15-byte randomness via noise rssi // Set LoRa modem ON - Radio.SetModem( MODEM_LORA ); + Radio->SetModem( MODEM_LORA ); // Disable LoRa modem interrupts - Radio.Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT | + Radio->Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT | RFLR_IRQFLAGS_RXDONE | RFLR_IRQFLAGS_PAYLOADCRCERROR | RFLR_IRQFLAGS_VALIDHEADER | @@ -190,31 +199,33 @@ RFLR_IRQFLAGS_CADDETECTED ); // Set radio in continuous reception - Radio.Rx( 0 ); + Radio->Rx( 0 ); for( int i = 1; i < 16; i++ ) { for( int j = 0; j < 8; j++ ) { u1_t b; // wait for two non-identical subsequent least-significant bits - while( ( b = Radio.Read( REG_LR_RSSIWIDEBAND ) & 0x01 ) == ( Radio.Read( REG_LR_RSSIWIDEBAND ) & 0x01 ) ); + while( ( b = Radio->Read( REG_LR_RSSIWIDEBAND ) & 0x01 ) == ( Radio->Read( REG_LR_RSSIWIDEBAND ) & 0x01 ) ); randbuf[i] = ( randbuf[i] << 1 ) | b; } } randbuf[0] = 16; // set initial index // Change LoRa modem SyncWord - Radio.Write( REG_LR_SYNCWORD, LORA_MAC_SYNCWORD ); + Radio->Write( REG_LR_SYNCWORD, LORA_MAC_SYNCWORD ); - Radio.Sleep( ); + Radio->Sleep( ); hal_enableIRQs( ); + debug("radio_init exit\r\n"); } // return next random byte derived from seed buffer // (buf[0] holds index of next byte to be returned) u1_t radio_rand1( void ) { + debug("radio_rand1 enter\r\n"); u1_t i = randbuf[0]; ASSERT( i != 0 ); if( i == 16 ) @@ -229,52 +240,53 @@ void os_radio( u1_t mode ) { +debug("os_radio enter\r\n"); hal_disableIRQs( ); switch( mode ) { case RADIO_RST: // put radio to sleep - Radio.Sleep( ); + Radio->Sleep( ); break; case RADIO_TX: // transmit frame now //ASSERT( Radio.GetState( ) == IDLE ); - Radio.SetChannel( LMIC.freq ); + Radio->SetChannel( LMIC.freq ); if( getSf( LMIC.rps ) == FSK ) { // FSK modem - Radio.SetTxConfig( MODEM_FSK, LMIC.txpow, 25e3, 0, 50e3, 0, 5, false, true, 0, 0, false, 3e6 ); + Radio->SetTxConfig( MODEM_FSK, LMIC.txpow, 25e3, 0, 50e3, 0, 5, false, true, 0, 0, false, 3e6 ); } 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 - Radio.Send( LMIC.frame, LMIC.dataLen ); + Radio->Send( LMIC.frame, LMIC.dataLen ); break; case RADIO_RX: // receive frame now (exactly at rxtime) //ASSERT( Radio.GetState( ) == IDLE ); - Radio.SetChannel( LMIC.freq ); + Radio->SetChannel( LMIC.freq ); if( getSf( LMIC.rps ) == FSK ) { // FSK modem //Radio.SetRxConfig( MODEM_FSK, 50e3, 50e3, 0, 83.333e3, 5, 0, false, 0, true, 0, 0, false, false ); - Radio.SetRxConfig( MODEM_FSK, 50e3, 50e3, 0, 83.333e3, 5, 0, false, 0, true, 0, 0, false, true ); + Radio->SetRxConfig( MODEM_FSK, 50e3, 50e3, 0, 83.333e3, 5, 0, false, 0, true, 0, 0, false, true ); } else { // LoRa modem 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 ); + 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 ); + 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 ); } } @@ -284,11 +296,11 @@ //startrx( RXMODE_SINGLE ); // buf = LMIC.frame, time = LMIC.rxtime, timeout=LMIC.rxsyms if( getSf( LMIC.rps ) == FSK ) { // FSK modem - Radio.Rx( 50e3 ); // Max Rx window 50 ms + Radio->Rx( 50e3 ); // Max Rx window 50 ms } else { // LoRa modem - Radio.Rx( 3e6 ); // Max Rx window 3 seconds + Radio->Rx( 3e6 ); // Max Rx window 3 seconds } break; @@ -297,18 +309,18 @@ //ASSERT( Radio.GetState( ) == IDLE ); - Radio.SetChannel( LMIC.freq ); + Radio->SetChannel( LMIC.freq ); if( getSf( LMIC.rps ) == FSK ) { // FSK modem - Radio.SetRxConfig( MODEM_FSK, 50e3, 50e3, 0, 83.333e3, 5, 0, false, 0, true, 0, 0, false, true ); + Radio->SetRxConfig( MODEM_FSK, 50e3, 50e3, 0, 83.333e3, 5, 0, false, 0, true, 0, 0, false, true ); } 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 - Radio.Rx( 0 ); + Radio->Rx( 0 ); break; } hal_enableIRQs( ); @@ -570,52 +582,71 @@ DigitalOut rxStateIo( PB_9 ); #endif -static void writeReg (u1_t addr, u1_t data ) { +static void writeReg (u1_t addr, u1_t data ) +{ +debug("writeReg enter 0x%02X 0x%02X\r\n",addr,data); hal_pin_nss(0); hal_spi(addr | 0x80); hal_spi(data); hal_pin_nss(1); } -static u1_t readReg (u1_t addr) { +static u1_t readReg (u1_t addr) +{ hal_pin_nss(0); hal_spi(addr & 0x7F); u1_t val = hal_spi(0x00); hal_pin_nss(1); +debug("readReg exit 0x%02X 0x%02X\r\n",addr,val); return val; } -static void writeBuf (u1_t addr, xref2u1_t buf, u1_t len) { +static void writeBuf (u1_t addr, xref2u1_t buf, u1_t len) +{ +debug("writeBuf enter 0x%02X\r\n",addr); hal_pin_nss(0); hal_spi(addr | 0x80); - for (u1_t i=0; i<len; i++) { + for (u1_t i=0; i<len; i++) + { +debug(" 0x%02X\r\n",buf[i]); hal_spi(buf[i]); } hal_pin_nss(1); + debug("\r\n"); } -static void readBuf (u1_t addr, xref2u1_t buf, u1_t len) { +static void readBuf (u1_t addr, xref2u1_t buf, u1_t len) +{ +debug("readBuf enter 0x%02X\r\n",addr); hal_pin_nss(0); hal_spi(addr & 0x7F); for (u1_t i=0; i<len; i++) { buf[i] = hal_spi(0x00); +debug(" 0x%02X\r\n",buf[i]); } hal_pin_nss(1); + debug("\r\n"); } -static void opmode (u1_t mode) { +static void opmode (u1_t mode) +{ +debug("opmode enter %d\r\n",mode); writeReg(RegOpMode, (readReg(RegOpMode) & ~OPMODE_MASK) | mode); } -static void opmodeLora() { - u1_t u = OPMODE_LORA; +static void opmodeLora() +{ + debug("opmodeLora enter\r\n"); + u1_t u = OPMODE_LORA; #ifdef CFG_sx1276_radio u |= 0x8; // TBD: sx1276 high freq #endif writeReg(RegOpMode, u); } -static void opmodeFSK() { +static void opmodeFSK() +{ + debug("opmodeFSK enter\r\n"); u1_t u = 0; #ifdef CFG_sx1276_radio u |= 0x8; // TBD: sx1276 high freq @@ -624,7 +655,9 @@ } // configure LoRa modem (cfg1, cfg2) -static void configLoraModem () { +static void configLoraModem () +{ + debug("configLoraModem enter\r\n"); sf_t sf = getSf(LMIC.rps); #ifdef CFG_sx1276_radio @@ -696,9 +729,11 @@ #endif /* CFG_sx1272_radio */ } -static void configChannel () { +static void configChannel () +{ // set frequency: FQ = (FRF * 32 Mhz) / (2 ^ 19) u8_t frf = ((u8_t)LMIC.freq << 19) / 32000000; +debug("configChannel enter %d %lld\r\n",LMIC.freq, frf); writeReg(RegFrfMsb, (u1_t)(frf>>16)); writeReg(RegFrfMid, (u1_t)(frf>> 8)); writeReg(RegFrfLsb, (u1_t)(frf>> 0)); @@ -706,7 +741,9 @@ -static void configPower () { +static void configPower () +{ +debug("configPower enter\r\n"); #ifdef CFG_sx1276_radio // no boost used for now s1_t pw = (s1_t)LMIC.txpow; @@ -733,7 +770,9 @@ #endif /* CFG_sx1272_radio */ } -static void txfsk () { +static void txfsk () +{ +debug("txfsk enter\r\n"); // select FSK modem (from sleep mode) writeReg(RegOpMode, 0x10); // FSK, BT=0.5 ASSERT(readReg(RegOpMode) == 0x10); @@ -783,7 +822,9 @@ #endif } -static void txlora () { +static void txlora () +{ +debug("txlora enter\r\n"); // select LoRa modem (from sleep mode) //writeReg(RegOpMode, OPMODE_LORA); opmodeLora(); @@ -828,7 +869,9 @@ } // start transmitter (buf=LMIC.frame, len=LMIC.dataLen) -static void starttx () { +static void starttx () +{ +debug("starttx enter\r\n"); ASSERT( (readReg(RegOpMode) & OPMODE_MASK) == OPMODE_SLEEP ); if(getSf(LMIC.rps) == FSK) { // FSK modem txfsk(); @@ -848,7 +891,9 @@ }; // start LoRa receiver (time=LMIC.rxtime, timeout=LMIC.rxsyms, result=LMIC.frame[LMIC.dataLen]) -static void rxlora (u1_t rxmode) { +static void rxlora (u1_t rxmode) +{ +debug("rxlora enter\r\n"); // select LoRa modem (from sleep mode) opmodeLora(); ASSERT((readReg(RegOpMode) & OPMODE_LORA) != 0); @@ -904,7 +949,9 @@ } } -static void rxfsk (u1_t rxmode) { +static void rxfsk (u1_t rxmode) +{ +debug("rxfsk enter\r\n"); // only single rx (no continuous scanning, no noise sampling) ASSERT( rxmode == RXMODE_SINGLE ); // select FSK modem (from sleep mode) @@ -962,7 +1009,9 @@ #endif } -static void startrx (u1_t rxmode) { +static void startrx (u1_t rxmode) +{ +debug("startrx enter\r\n"); ASSERT( (readReg(RegOpMode) & OPMODE_MASK) == OPMODE_SLEEP ); if(getSf(LMIC.rps) == FSK) { // FSK modem rxfsk(rxmode); @@ -974,7 +1023,10 @@ } // get random seed from wideband noise rssi -void radio_init () { +void radio_init () +{ +debug("radio_init2 enter\r\n"); + Radio = new SX1272MB1xAS(NULL); hal_disableIRQs(); // manually reset radio @@ -1042,7 +1094,9 @@ // return next random byte derived from seed buffer // (buf[0] holds index of next byte to be returned) -u1_t radio_rand1 () { +u1_t radio_rand1 () +{ +debug("radio_rand1 enter\r\n"); u1_t i = randbuf[0]; ASSERT( i != 0 ); if( i==16 ) { @@ -1054,7 +1108,9 @@ return v; } -u1_t radio_rssi () { +u1_t radio_rssi () +{ +debug("radio_rssi enter\r\n"); hal_disableIRQs(); u1_t r = readReg(LORARegRssiValue); hal_enableIRQs(); @@ -1073,7 +1129,9 @@ // called by hal ext IRQ handler // (radio goes to stanby mode after tx/rx operations) -void radio_irq_handler (u1_t dio) { +void radio_irq_handler (u1_t dio) +{ +debug("radio_irq_handler enter %d\r\n",dio); ostime_t now = os_getTime(); if( (readReg(RegOpMode) & OPMODE_LORA) != 0) { // LORA modem u1_t flags = readReg(LORARegIrqFlags); @@ -1137,7 +1195,9 @@ os_setCallback(&LMIC.osjob, LMIC.osjob.func); } -void os_radio (u1_t mode) { +void os_radio (u1_t mode) +{ +debug("os_radio enter\r\n"); hal_disableIRQs(); switch (mode) { case RADIO_RST: