SX1261 and sx1262 common library

Dependents:   SX126xDevKit SX1262PingPong SX126X_TXonly SX126X_PingPong_Demo ... more

Fork of SX126xLib by Gregory Cristian

Revision:
3:7e3595a9ebe0
Parent:
2:4ff11ea92fbe
Child:
4:c6ef863d0b07
--- 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 );
-        }
-    }
-                    
-
+    }*/
 }