first test
Dependents: LoRaWAN-lmic-app_tjm
Fork of LMiC by
Diff: radio.cpp
- Revision:
- 5:464c1f2d6cbb
- Parent:
- 4:85b2b647cb64
- Child:
- 6:eed5fd627a2b
diff -r 85b2b647cb64 -r 464c1f2d6cbb radio.cpp --- 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: