local for mbed5
Diff: sx126x.cpp
- Revision:
- 3:7e3595a9ebe0
- Parent:
- 2:4ff11ea92fbe
- Child:
- 4:c6ef863d0b07
diff -r 4ff11ea92fbe -r 7e3595a9ebe0 sx126x.cpp --- a/sx126x.cpp Fri Sep 23 09:38:34 2016 +0000 +++ b/sx126x.cpp Wed Oct 12 08:49:58 2016 +0000 @@ -16,6 +16,8 @@ #include "sx126x.h" #include "sx126x-hal.h" +#include "pram_c005.h" + /*! * Radio registers definition * @@ -31,9 +33,11 @@ * \brief Radio hardware registers initialization definition */ // { Address, RegValue } + #define RADIO_INIT_REGISTERS_VALUE \ { \ { 0x0722, 0x53 }, \ + { 0x0889, 0x01 }, \ } /*! @@ -46,6 +50,20 @@ Reset( ); IoIrqInit( dioIrq ); Wakeup( ); +/****************************************************/ + SetStandby( STDBY_RC ); + WriteRegister( 0x610, 0x10 ); + for( uint16_t i = 0; i < PRAM_COUNT; i++ ) + { + uint32_t val = pram[i]; + WriteRegister( 0x8000 + 4 * i, 0 ); + WriteRegister( 0x8001 + 4 * i, ( val >> 16 ) & 0xff ); + WriteRegister( 0x8002 + 4 * i, ( val >> 8 ) & 0xff ); + WriteRegister( 0x8003 + 4 * i, val & 0xff ); + } + WriteRegister( 0x610, 0x00 ); + WriteCommand( RADIO_SET_PRAMSWAPCMD, ( uint8_t[] ) { 2 } , 1 ); // RADIO_SET_PRAMSWAPCMD = 0x8D, +/****************************************************/ SetRegistersDefault( ); } @@ -225,7 +243,9 @@ void SX126x::SetModulationParams( ModulationParams_t *modulationParams ) { uint8_t n; - + uint32_t tempVal = 0; + uint8_t buf[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + // Check if required configuration corresponds to the stored packet type // If not, silently update radio packet type if( this->PacketType != modulationParams->PacketType ) @@ -236,22 +256,33 @@ switch( modulationParams->PacketType ) { case PACKET_TYPE_GFSK: - n = 8; - break; - case PACKET_TYPE_GMSK: + tempVal = ( uint32_t )( ( double )XTAL_FREQ / ( double )modulationParams->Params.Gfsk.BitRate ); + tempVal = tempVal * 32; + buf[0] = ( tempVal >> 16 ) & 0xFF; + buf[1] = ( tempVal >> 8 ) & 0xFF; + buf[2] = tempVal & 0xFF; + + buf[3] = modulationParams->Params.Gfsk.PulseShape; + buf[4] = modulationParams->Params.Gfsk.BW; + + tempVal = ( uint32_t )( ( double )FREQ_STEP * ( double )modulationParams->Params.Gfsk.Fdev ); + buf[5] = ( tempVal >> 16 ) & 0xFF; + buf[6] = ( tempVal >> 8 ) & 0xFF; + buf[7] = ( tempVal& 0xFF ); n = 8; break; - case PACKET_TYPE_BPSK: - n = 5; - break; + case PACKET_TYPE_LORA: - case PACKET_TYPE_RANGING: n = 3; + buf[0] = modulationParams->Params.LoRa.SpreadingFactor; + buf[1] = modulationParams->Params.LoRa.Bandwidth; + buf[2] = modulationParams->Params.LoRa.CodingRate; break; - case PACKET_TYPE_NONE: + + case PACKET_TYPE_RESERVED: return; } - WriteCommand( RADIO_SET_MODULATIONPARAMS, modulationParams->Params.Buffer, n ); + WriteCommand( RADIO_SET_MODULATIONPARAMS, buf, n ); } void SX126x::SetPacketParams( PacketParams_t *packetParams ) @@ -269,15 +300,11 @@ { case PACKET_TYPE_GFSK: n = 8; - break; - case PACKET_TYPE_BPSK: - n = 8; - break; + break; case PACKET_TYPE_LORA: - case PACKET_TYPE_RANGING: n = 5; break; - case PACKET_TYPE_NONE: + case PACKET_TYPE_RESERVED: return; } WriteCommand( RADIO_SET_PACKETPARAMS, packetParams->Params.Buffer, n ); @@ -310,17 +337,16 @@ break; case PACKET_TYPE_LORA: - case PACKET_TYPE_RANGING: pktStatus->LoRa.RssiPkt = -status[0] / 2; ( status[1] < 128 ) ? ( pktStatus->LoRa.SnrPkt = status[1] / 4 ) : ( pktStatus->LoRa.SnrPkt = ( ( status[1] - 256 ) /4 ) ); pktStatus->LoRa.SignalRssiPkt = -status[2] / 2; break; - case PACKET_TYPE_NONE: + case PACKET_TYPE_RESERVED: // In that specific case, we set everything in the pktStatus to zeros // and reset the packet type accordingly memset( pktStatus, 0, sizeof( PacketStatus_t ) ); - pktStatus->packetType = PACKET_TYPE_NONE; + pktStatus->packetType = PACKET_TYPE_RESERVED; break; } } @@ -435,30 +461,36 @@ uint8_t SX126x::SetSyncWord( uint8_t *syncWord ) { - uint8_t syncwordSize = 8; - - WriteRegister( REG_LR_SYNCWORDBASEADDRESS, syncWord, syncwordSize ); + WriteRegister( REG_LR_SYNCWORDBASEADDRESS, syncWord, 8 ); return 0; } -void SX126x::SetCrcSeed( uint8_t *seed ) +void SX126x::SetCrcSeed( uint16_t seed ) { + uint8_t buf[2]; + buf[0] = ( uint8_t )( ( seed >> 8 ) & 0xFF ); + buf[1] = ( uint8_t )( seed & 0xFF ); + switch( GetPacketType( ) ) { case PACKET_TYPE_GFSK: - WriteRegister( REG_LR_CRCSEEDBASEADDR, seed, 2 ); + WriteRegister( REG_LR_CRCSEEDBASEADDR, buf, 2 ); break; default: break; } } -void SX126x::SetCrcPolynomial( uint8_t *polynomial ) +void SX126x::SetCrcPolynomial( uint16_t polynomial ) { + uint8_t buf[2]; + buf[0] = ( uint8_t )( ( polynomial >> 8 ) & 0xFF ); + buf[1] = ( uint8_t )( polynomial & 0xFF ); + switch( GetPacketType( ) ) { case PACKET_TYPE_GFSK: - WriteRegister( REG_LR_CRCPOLYBASEADDR, polynomial, 2 ); + WriteRegister( REG_LR_CRCPOLYBASEADDR, buf, 2 ); break; default: break; @@ -477,64 +509,6 @@ } } -void SX126x::SetRangingIdLength( RadioRangingIdCheckLen_t length ) -{ - switch( GetPacketType( ) ) - { - case PACKET_TYPE_RANGING: - WriteRegister( REG_LR_RANGINGIDCHECKLENGTH, ( ( ( ( uint8_t )length ) & 0x03 ) << 6 ) | ( ReadRegister( REG_LR_RANGINGIDCHECKLENGTH ) & 0x3F ) ); - break; - default: - break; - } -} - -void SX126x::SetDeviceRangingAddress( uint32_t address ) -{ - uint8_t addrArray[] = { ( uint8_t )( ( address >> 24 ) & 0xFF ) , - ( uint8_t )( ( address >> 16 ) & 0xFF ), - ( uint8_t )( ( address >> 8 ) & 0xFF ), - ( uint8_t )( ( address >> 0 ) & 0xFF ) }; - - WriteRegister( REG_LR_DEVICERANGINGADDR, addrArray, 4 ); -} - -void SX126x::SetRangingRequestAddress( uint32_t address ) -{ - uint8_t addrArray[] = { ( uint8_t )( ( address >> 24 ) & 0xFF ) , - ( uint8_t )( ( address >> 16 ) & 0xFF ), - ( uint8_t )( ( address >> 8 ) & 0xFF ), - ( uint8_t )( ( address >> 0 ) & 0xFF ) }; - - WriteRegister( REG_LR_REQUESTRANGINGADDR, addrArray, 4 ); - -} - -int32_t SX126x::GetRangingResult( RadioRangingResultType_t resultType ) -{ - int32_t val = 0; - uint32_t addr = REG_LR_RANGINGRESULTRAWBASEADDR + (uint8_t)resultType; - //switch( GetPacketType( ) ) - //{ - // case PACKET_TYPE_RANGING: - val = ( ( ReadRegister( addr ) << 16 ) | ( ReadRegister( addr + 1 ) << 8 ) | ( ReadRegister( addr + 2 ) ) ); - if( ( val & 0x800000 ) == 0x800000 ) - { - val |= 0xFF000000; - } - // break; - // default: - // break; - //} - return val; -} - -void SX126x::SetRangingCalibration( uint16_t cal ) -{ - WriteRegister( REG_LR_RANGINGRERXTXDELAYCAL, ( uint8_t )( ( cal >> 8 ) & 0xFF ) ); - WriteRegister( REG_LR_RANGINGRERXTXDELAYCAL + 1, ( uint8_t )( ( cal ) & 0xFF ) ); -} - int8_t SX126x::ParseHexFileLine( char* line ) { uint16_t addr; @@ -627,14 +601,15 @@ void SX126x::OnDioIrq( void ) { - if(onCustomDioIrq != NULL) + if( onCustomDioIrq != NULL ) { onCustomDioIrq(); return; } - + uint16_t irqRegs = GetIrqStatus( ); LastIrqs = irqRegs; +// printf("0x%04x\n\r", irqRegs ); ClearIrqStatus( IRQ_RADIO_ALL ); @@ -651,9 +626,7 @@ TEST_PIN_2 = 0; #endif - - //IRQ_TX_DONE = 0x0001, - if( irqRegs & IRQ_TX_DONE ) + if( ( irqRegs & IRQ_TX_DONE ) == IRQ_TX_DONE ) { if( txDone != NULL ) { @@ -661,21 +634,48 @@ } } - //IRQ_RX_DONE = 0x0002, - if( irqRegs & IRQ_RX_DONE ) + if( ( irqRegs & IRQ_RX_DONE ) == IRQ_RX_DONE ) { - if( rxDone != NULL ) + if( ( irqRegs & IRQ_CRC_ERROR ) == IRQ_CRC_ERROR ) { - rxDone( ); + if( rxError != NULL ) + { + rxError( IRQ_CRC_ERROR_CODE ); + } + } + else + { + if( rxDone != NULL ) + { + rxDone( ); + } } } + if( ( irqRegs & IRQ_RX_TX_TIMEOUT ) == IRQ_RX_TX_TIMEOUT ) + { + if( ( rxTxTimeout != NULL ) && ( OperatingMode == MODE_TX ) ) + { + rxTxTimeout( IRQ_TX_TIMEOUT ); + } + else if( ( rxTxTimeout != NULL ) && ( OperatingMode == MODE_RX ) ) + { + rxTxTimeout( IRQ_RX_TIMEOUT ); + } + else + { + rxTxTimeout( IRQ_XYZ ); + } + } + +/* //IRQ_PREAMBLE_DETECTED = 0x0004, if( irqRegs & IRQ_PREAMBLE_DETECTED ) { if( rxPblSyncWordHeader != NULL ) { rxPblSyncWordHeader( IRQ_PBL_DETECT_CODE); + } } @@ -693,7 +693,7 @@ { if( rxPblSyncWordHeader != NULL ) { - rxPblSyncWordHeader( IRQ_hEADER_VALID_CODE ); + rxPblSyncWordHeader( IRQ_HEADER_VALID_CODE ); } } @@ -706,16 +706,6 @@ } } - //IRQ_GFSK_ERROR = 0x0040, - //IRQ_LORA_CRC_ERROR = 0x0040, //shared with IRQ_GFSK_ERROR - if( irqRegs & IRQ_GFSK_ERROR ) // same as IRQ_LORA_CRC_ERROR - { - if( rxError != NULL ) - { - rxError( IRQ_GFSK_ERROR_CODE ); - } - } - //IRQ_CAD_DONE = 0x0080, //IRQ_CAD_ACTIVITY_DETECTED = 0x0100, if( irqRegs & IRQ_CAD_DONE ) @@ -727,64 +717,7 @@ cadDone( detected ); } - } - - //IRQ_RX_TX_TIMEOUT = 0x0200, - if( ( irqRegs & IRQ_RX_TX_TIMEOUT ) == IRQ_RX_TX_TIMEOUT ) - { - if( rxTxTimeout != NULL ) - { - rxTxTimeout( ); - } - } - - - //IRQ_RANGING_SLAVE_REQUEST_VALID = 0x0400, - if( irqRegs & IRQ_RANGING_SLAVE_REQUEST_VALID) - { - if( rangingDone != NULL ) - { - rangingDone( IRQ_RANGING_SLAVE_VALID_CODE ); - } - } - - //IRQ_RANGING_SLAVE_REQUEST_DISCARDED = 0x0800, - if( irqRegs & IRQ_RANGING_SLAVE_REQUEST_DISCARDED ) - { - if( rangingDone != NULL ) - { - rangingDone( IRQ_RANGING_SLAVE_ERROR_CODE ); - } - } - - //IRQ_RANGING_SLAVE_RESPONSE_DONE = 0x1000, - if( irqRegs & IRQ_RANGING_SLAVE_RESPONSE_DONE ) - { - if( rangingDone != NULL ) - { - rangingDone( IRQ_RANGING_SLAVE_RESPONSE_DONE_CODE ); - } - } - - //IRQ_RANGING_MASTER_RESULT_VALID = 0x2000, - if( irqRegs & IRQ_RANGING_MASTER_RESULT_VALID ) - { - if( rangingDone != NULL ) - { - rangingDone( IRQ_RANGING_MASTER_VALID_CODE ); - } - } - - //IRQ_RANGING_MASTER_RESULT_TIMEOUT = 0x4000, - if( irqRegs & IRQ_RANGING_MASTER_RESULT_TIMEOUT ) - { - if( rangingDone != NULL ) - { - rangingDone( IRQ_RANGING_MASTER_TIMEOUT_CODE ); - } - } - - + }*/ }