3D Low Frequency Wakeup Receiver

Revision:
4:10d482ca4eb1
Parent:
3:2de552c4ffbc
--- a/AS3933.cpp	Wed Mar 07 16:43:51 2018 +0000
+++ b/AS3933.cpp	Tue Mar 13 15:08:21 2018 +0000
@@ -11,7 +11,7 @@
  * @version     7/March/2018    The ORIGIN
  * @pre         N/A.
  * @warning     N/A
- * @pre         This code belongs to Nimbus Centre ( http://unbarquero.blogspot.com ).
+ * @pre         This code belongs to Nimbus Centre ( http://www.nimbus.cit.ie ).
  */
 
 #include "AS3933.h"
@@ -71,7 +71,9 @@
 
     // Read R0 register
     cmd[0]           =   ( AS3933_READ | AS3933_R0 );
+    _cs              =   1;
     mySPI_status     =   _spi.write ( &cmd[0], 1, &cmd[0], 2 );
+    _cs              =   0;
 
     // Mask Channels 1:3
     cmd[1] &=   ~( EN_A1_MASK | EN_A2_MASK | EN_A3_MASK );
@@ -82,76 +84,73 @@
 
 
     // Set the channels enabled
-    switch ( myEnabledChannels )
-    {
-    case AS3933_CH1_OFF_CH2_OFF_CH3_OFF:
-        cmd[1] &=   ( EN_A1_DISABLED | EN_A2_DISABLED | EN_A3_DISABLED );
-        break;
+    switch ( myEnabledChannels ) {
+        case AS3933_CH1_OFF_CH2_OFF_CH3_OFF:
+            cmd[1] &=   ( EN_A1_DISABLED | EN_A2_DISABLED | EN_A3_DISABLED );
+            break;
 
-    case AS3933_CH1_ON_CH2_OFF_CH3_OFF:
-        cmd[1] |=   ( EN_A1_ENABLED );
-        break;
+        case AS3933_CH1_ON_CH2_OFF_CH3_OFF:
+            cmd[1] |=   ( EN_A1_ENABLED );
+            break;
 
-    case AS3933_CH1_OFF_CH2_ON_CH3_OFF:
-        cmd[1] |=   ( EN_A2_ENABLED );
-        break;
+        case AS3933_CH1_OFF_CH2_ON_CH3_OFF:
+            cmd[1] |=   ( EN_A2_ENABLED );
+            break;
+
+        case AS3933_CH1_ON_CH2_ON_CH3_OFF:
+            cmd[1] |=   ( EN_A1_ENABLED | EN_A2_ENABLED );
+            break;
 
-    case AS3933_CH1_ON_CH2_ON_CH3_OFF:
-        cmd[1] |=   ( EN_A1_ENABLED | EN_A2_ENABLED );
-        break;
+        case AS3933_CH1_OFF_CH2_OFF_CH3_ON:
+            cmd[1] |=   ( EN_A3_ENABLED );
+            break;
 
-    case AS3933_CH1_OFF_CH2_OFF_CH3_ON:
-        cmd[1] |=   ( EN_A3_ENABLED );
-        break;
+        case AS3933_CH1_ON_CH2_OFF_CH3_ON:
+            cmd[1] |=   ( EN_A1_ENABLED | EN_A3_ENABLED );
+            break;
 
-    case AS3933_CH1_ON_CH2_OFF_CH3_ON:
-        cmd[1] |=   ( EN_A1_ENABLED | EN_A3_ENABLED );
-        break;
+        case AS3933_CH1_OFF_CH2_ON_CH3_ON:
+            cmd[1] |=   ( EN_A2_ENABLED | EN_A3_ENABLED );
+            break;
 
-    case AS3933_CH1_OFF_CH2_ON_CH3_ON:
-        cmd[1] |=   ( EN_A2_ENABLED | EN_A3_ENABLED );
-        break;
-
-    default:
-    case AS3933_CH1_ON_CH2_ON_CH3_ON:
-        cmd[1] |=   ( EN_A1_ENABLED | EN_A2_ENABLED | EN_A3_ENABLED );
-        break;
+        default:
+        case AS3933_CH1_ON_CH2_ON_CH3_ON:
+            cmd[1] |=   ( EN_A1_ENABLED | EN_A2_ENABLED | EN_A3_ENABLED );
+            break;
     }
 
 
     // Set Scanning mode
-    switch ( myLowPowerMode )
-    {
-    default:
-    case AS3933_STANDARD_LISTENING_MODE:
-        break;
+    switch ( myLowPowerMode ) {
+        default:
+        case AS3933_STANDARD_LISTENING_MODE:
+            break;
 
-    case AS3933_SCANNING_MODE:
-        if ( ( myEnabledChannels == AS3933_CH1_ON_CH2_OFF_CH3_ON )  || ( myEnabledChannels == AS3933_CH1_ON_CH2_ON_CH3_ON )  || ( myEnabledChannels == AS3933_CH1_ON_CH2_OFF_CH3_OFF ) ||
-             ( myEnabledChannels == AS3933_CH1_OFF_CH2_ON_CH3_OFF ) || ( myEnabledChannels == AS3933_CH1_OFF_CH2_OFF_CH3_ON ) )
-            cmd[1] |=   ( MUX_123_ENABLED );
-        else
-            return   AS3933_FAILURE;
+        case AS3933_SCANNING_MODE:
+            if ( ( myEnabledChannels == AS3933_CH1_ON_CH2_OFF_CH3_ON )  || ( myEnabledChannels == AS3933_CH1_ON_CH2_ON_CH3_ON )  || ( myEnabledChannels == AS3933_CH1_ON_CH2_OFF_CH3_OFF ) ||
+                    ( myEnabledChannels == AS3933_CH1_OFF_CH2_ON_CH3_OFF ) || ( myEnabledChannels == AS3933_CH1_OFF_CH2_OFF_CH3_ON ) )
+                cmd[1] |=   ( MUX_123_ENABLED );
+            else
+                return   AS3933_FAILURE;
 
-        break;
+            break;
 
-    case AS3933_ON_OFF_MODE:
-        if ( ( myEnabledChannels == AS3933_CH1_ON_CH2_OFF_CH3_ON ) || ( myEnabledChannels == AS3933_CH1_ON_CH2_ON_CH3_ON ) || ( myEnabledChannels == AS3933_CH1_ON_CH2_OFF_CH3_OFF ) )
-            cmd[1] |=   ( ON_OFF_ENABLED );
-        else
-            return   AS3933_FAILURE;
-        break;
+        case AS3933_ON_OFF_MODE:
+            if ( ( myEnabledChannels == AS3933_CH1_ON_CH2_OFF_CH3_ON ) || ( myEnabledChannels == AS3933_CH1_ON_CH2_ON_CH3_ON ) || ( myEnabledChannels == AS3933_CH1_ON_CH2_OFF_CH3_OFF ) )
+                cmd[1] |=   ( ON_OFF_ENABLED );
+            else
+                return   AS3933_FAILURE;
+            break;
     }
 
     // Update power mode and active channels
     cmd[0]           =   ( AS3933_WRITE | AS3933_R0 );
     _cs              =   1;
-    mySPI_status     =   _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =   _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
-    if ( myLowPowerMode == AS3933_ON_OFF_MODE )
-    {
+    if ( myLowPowerMode == AS3933_ON_OFF_MODE ) {
         // Read R4 register
         cmd[0]           =    ( AS3933_READ | AS3933_R4 );
         _cs              =   1;
@@ -166,7 +165,7 @@
 
         cmd[0]           =    ( AS3933_WRITE | AS3933_R4 );
         _cs              =   1;
-        mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+        mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
         _cs              =   0;
     }
 
@@ -220,7 +219,7 @@
     // Update artificial wakeup
     cmd[0]           =   ( AS3933_WRITE | AS3933_R8 );
     _cs              =   1;
-    mySPI_status     =   _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =   _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -262,8 +261,8 @@
     _cs              =   1;
     mySPI_status     =   _spi.write ( &cmd[0], 1, &cmd[0], 2 );
     _cs              =   0;
-    
-    
+
+
     myF_WAKE->f_wake     =   cmd[1];
 
 
@@ -318,7 +317,7 @@
     // Update Crystal oscillator
     cmd[0]           =   ( AS3933_WRITE | AS3933_R1 );
     _cs              =   1;
-    mySPI_status     =   _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =   _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -339,7 +338,7 @@
     // Update Clock Generator output signal
     cmd[0]           =   ( AS3933_WRITE | AS3933_R16 );
     _cs              =   1;
-    mySPI_status     =   _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =   _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -367,38 +366,37 @@
  *
  * @author      Manuel Caballero
  * @date        7/March/2018
- * @version     7/March/2018   The ORIGIN
+ * @version     12/March/2018       The timeout was removed, the bits for calibration are checked instead.
+ *              7/March/2018        The ORIGIN
  * @pre         RC-Oscillator: Self Calibration is ONLY available.
+ * @pre         There is NO need to calibrate the RC oscillator if the crystal oscillator is enabled.
  * @warning     In case the pattern detection and the Manchester decoder are not enabled ( R1<1>=0 and R1<3>=1 ) the calibration on the RC-oscillator
  *              is not needed. Should this not be the case, the RC-oscillator has to be calibrated.
  */
 AS3933::AS3933_status_t  AS3933::AS3933_CalibrateRC_Oscillator ( void )
 {
     char        cmd[]       =    { 0, 0 };
-    uint32_t    myTimeout   =    0;
     int         mySPI_status;
 
 
     // Start the calibration
     cmd[0]           =   ( AS3933_DIRECT_COMMAND | CALIB_RCO_LC );
     _cs              =   1;
-    mySPI_status     =   _spi.write ( &cmd[0], 1, &cmd[0], 0 );
+    mySPI_status     =   _spi.write ( &cmd[0], 1, &cmd[0], 2 );
     _cs              =   0;
 
 
     // RC oscillator will be calibrated when RC_CAL_OK = '1' ( R14<6> )
-    myTimeout        =   23232323;
-    do{
+    do {
         cmd[0]           =   ( AS3933_READ | AS3933_R14 );
         _cs              =   1;
         mySPI_status     =   _spi.write ( &cmd[0], 1, &cmd[0], 2 );
         _cs              =   0;
-        myTimeout--;
-    } while ( ( ( cmd[1] & RC_CAL_OK_MASK ) != RC_CAL_OK_HIGH ) && ( myTimeout > 0 ) );
+    } while ( ( ( cmd[1] & RC_CAL_OK_MASK ) != RC_CAL_OK_HIGH ) && ( ( cmd[1] & RC_CAL_KO_MASK ) != RC_CAL_KO_HIGH ) );
 
 
 
-    if ( ( mySPI_status == SPI_SUCCESS ) && ( myTimeout > 0 ) )
+    if ( ( mySPI_status == SPI_SUCCESS ) && ( ( cmd[1] & RC_CAL_KO_MASK ) != RC_CAL_KO_HIGH ) )
         return   AS3933_SUCCESS;
     else
         return   AS3933_FAILURE;
@@ -445,7 +443,7 @@
     cmd[0]           =   ( AS3933_WRITE | AS3933_R1 );
     cmd[1]          |=   ( myAntennaDamperMode );
     _cs              =   1;
-    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -463,7 +461,7 @@
     cmd[0]           =   ( AS3933_WRITE | AS3933_R4 );
     cmd[1]          |=   ( myShuntResistor );
     _cs              =   1;
-    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -514,7 +512,7 @@
     cmd[0]           =   ( AS3933_WRITE | AS3933_R3 );
     cmd[1]          |=   ( mySymbolRates );
     _cs              =   1;
-    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -568,7 +566,7 @@
     cmd[0]           =   ( AS3933_WRITE | AS3933_R1 );
     cmd[1]          |=   ( myAbsoluteThresholdMode );
     _cs              =   1;
-    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -586,7 +584,7 @@
     cmd[0]           =   ( AS3933_WRITE | AS3933_R3 );
     cmd[1]          |=   ( myMinimumPreambleLength );
     _cs              =   1;
-    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -638,7 +636,7 @@
     cmd[0]           =   ( AS3933_WRITE | AS3933_R3 );
     cmd[1]          |=   ( myHysteresisMode | myHysteresisRange );
     _cs              =   1;
-    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -689,7 +687,7 @@
     cmd[0]           =   ( AS3933_WRITE | AS3933_R4 );
     cmd[1]          |=   ( myGainReductionValue );
     _cs              =   1;
-    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -740,7 +738,7 @@
     cmd[0]           =   ( AS3933_WRITE | AS3933_R8 );
     cmd[1]          |=   ( myOperatingFrequencyRange );
     _cs              =   1;
-    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -791,7 +789,7 @@
     cmd[0]           =   ( AS3933_WRITE | AS3933_R2 );
     cmd[1]          |=   ( myTolerance );
     _cs              =   1;
-    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -842,7 +840,7 @@
     cmd[0]           =   ( AS3933_WRITE | AS3933_R2 );
     cmd[1]          |=   ( myGainBoostMode );
     _cs              =   1;
-    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -894,7 +892,7 @@
     cmd[0]           =   ( AS3933_WRITE | AS3933_R1 );
     cmd[1]          |=   ( myAGC_CarrierBurstMode | myAGC_OperatingDirection );
     _cs              =   1;
-    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -945,7 +943,7 @@
     cmd[0]           =   ( AS3933_WRITE | AS3933_R0 );
     cmd[1]          |=   ( myDataMaskMode );
     _cs              =   1;
-    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -981,7 +979,7 @@
  * @warning     N/A.
  */
 AS3933::AS3933_status_t  AS3933::AS3933_SetCorrelator ( AS3933_r1_en_wpat_value_t myCorrelatorMode, AS3933_r0_patt32_value_t mySymbolPattern, AS3933_r7_t_hbit_value_t myRate,
-                                                        AS3933_r1_en_manch_value_t myManchesterDecoderMode )
+        AS3933_r1_en_manch_value_t myManchesterDecoderMode )
 {
     char    cmd[]       =    { 0, 0 };
     int     mySPI_status;
@@ -1001,7 +999,7 @@
     cmd[0]           =   ( AS3933_WRITE | AS3933_R1 );
     cmd[1]          |=   ( myCorrelatorMode | myManchesterDecoderMode );
     _cs              =   1;
-    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -1009,7 +1007,7 @@
     // Read R0 register
     cmd[0]           =   ( AS3933_READ | AS3933_R0 );
     _cs              =   1;
-    mySPI_status     =   _spi.write ( &cmd[0], 1, &cmd[1], 1 );
+    mySPI_status     =   _spi.write ( &cmd[0], 1, &cmd[0], 2 );
     _cs              =   0;
 
     // Mask Pattern extended
@@ -1019,7 +1017,7 @@
     cmd[0]           =   ( AS3933_WRITE | AS3933_R0 );
     cmd[1]          |=   ( mySymbolPattern );
     _cs              =   1;
-    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -1037,7 +1035,7 @@
     cmd[0]           =   ( AS3933_WRITE | AS3933_R7 );
     cmd[1]          |=   ( myRate );
     _cs              =   1;
-    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -1080,14 +1078,14 @@
     cmd[0]           =   ( AS3933_WRITE | AS3933_R5 );
     cmd[1]           =   ( myWakeUpPattern.patt2b );
     _cs              =   1;
-    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 1 );
+    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
     // Update PATT1B
     cmd[0]           =   ( AS3933_WRITE | AS3933_R6 );
     cmd[1]           =   ( myWakeUpPattern.patt1b );
     _cs              =   1;
-    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 1 );
+    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -1130,9 +1128,9 @@
     _cs              =   1;
     mySPI_status     =    _spi.write ( &cmd[0], 1, &cmd[0], 2 );
     _cs              =   0;
-    
+
     myWakeUpPattern->patt2b  =   cmd[1];
-    
+
     // Read R6 register
     cmd[0]           =   ( AS3933_READ | AS3933_R6 );
     _cs              =   1;
@@ -1187,7 +1185,7 @@
     cmd[0]           =   ( AS3933_WRITE | AS3933_R7 );
     cmd[1]          |=   ( myAutomaticTimeOut );
     _cs              =   1;
-    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -1229,18 +1227,18 @@
 
 
     // Select the channel
-    switch ( myChannel ){
+    switch ( myChannel ) {
         default:
         case AS3933_CHANNEL_LF1P:
             myAuxRegister    =   AS3933_R17;
             break;
 
-       case AS3933_CHANNEL_LF2P:
-           myAuxRegister    =   AS3933_R18;
+        case AS3933_CHANNEL_LF2P:
+            myAuxRegister    =   AS3933_R18;
             break;
 
-       case AS3933_CHANNEL_LF3P:
-           myAuxRegister    =   AS3933_R19;
+        case AS3933_CHANNEL_LF3P:
+            myAuxRegister    =   AS3933_R19;
             break;
     }
 
@@ -1258,7 +1256,7 @@
     cmd[0]           =   ( AS3933_WRITE | myAuxRegister );
     cmd[1]          |=   ( myAddedCapacitance );
     _cs              =   1;
-    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
+    mySPI_status     =    _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 2 );
     _cs              =   0;
 
 
@@ -1287,7 +1285,8 @@
  *
  * @author      Manuel Caballero
  * @date        7/March/2018
- * @version     7/March/2018   The ORIGIN
+ * @version     12/March/2018  Auto-increment does NOT work when the registers are read
+ *              7/March/2018   The ORIGIN
  * @pre         N/A.
  * @warning     N/A.
  */
@@ -1297,18 +1296,37 @@
     int     mySPI_status;
 
 
-    // Get All RSSIs
-    // Read R10 register ( auto-increment )
+    // Get RSSI1
+    // Read R10 register
     cmd[0]           =   ( AS3933_READ | AS3933_R10 );
     _cs              =   1;
-    mySPI_status     =    _spi.write ( &cmd[0], 1, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
+    mySPI_status     =    _spi.write ( &cmd[0], 1, &cmd[0], 2 );
     _cs              =   0;
 
     // Parse the data
-    myChannelRSSI->rssi1     =   ( cmd[0] & RSSI1_MASK );       // Channel1: RSSI1
-    myChannelRSSI->rssi3     =   ( cmd[1] & RSSI3_MASK );       // Channel3: RSSI3
-    myChannelRSSI->rssi2     =   ( cmd[2] & RSSI2_MASK );       // Channel2: RSSI2
+    myChannelRSSI->rssi1     =   ( cmd[1] & RSSI1_MASK );                       // Channel1: RSSI1
+
+
+    // Get RSSI3
+    // Read R11 register
+    cmd[0]           =   ( AS3933_READ | AS3933_R11 );
+    _cs              =   1;
+    mySPI_status     =    _spi.write ( &cmd[0], 1, &cmd[0], 2 );
+    _cs              =   0;
 
+    // Parse the data
+    myChannelRSSI->rssi3     =   ( cmd[1] & RSSI3_MASK );                       // Channel1: RSSI1
+
+
+    // Get RSSI2
+    // Read R12 register
+    cmd[0]           =   ( AS3933_READ | AS3933_R12 );
+    _cs              =   1;
+    mySPI_status     =    _spi.write ( &cmd[0], 1, &cmd[0], 2 );
+    _cs              =   0;
+
+    // Parse the data
+    myChannelRSSI->rssi2     =   ( cmd[1] & RSSI2_MASK );                       // Channel1: RSSI1
 
 
 
@@ -1349,7 +1367,7 @@
     // Send a direct command
     cmd              =   ( AS3933_DIRECT_COMMAND | myDirectCommand );
     _cs              =   1;
-    mySPI_status     =   _spi.write ( &cmd, 1, &cmd, 0 );
+    mySPI_status     =   _spi.write ( &cmd, 1, &cmd, 1 );
     _cs              =   0;