3D Low Frequency Wakeup Receiver

Files at this revision

API Documentation at this revision

Comitter:
mcm
Date:
Tue Mar 13 15:08:21 2018 +0000
Parent:
3:2de552c4ffbc
Commit message:
The driver was completed and tested ( NUCLEO-L152RE ), it works as expected.

Changed in this revision

AS3933.cpp Show annotated file Show diff for this revision Revisions of this file
AS3933.h Show annotated file Show diff for this revision Revisions of this file
diff -r 2de552c4ffbc -r 10d482ca4eb1 AS3933.cpp
--- 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;
 
 
diff -r 2de552c4ffbc -r 10d482ca4eb1 AS3933.h
--- a/AS3933.h	Wed Mar 07 16:43:51 2018 +0000
+++ b/AS3933.h	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 ).
  */
 #ifndef AS3933_H
 #define AS3933_H
@@ -20,21 +20,24 @@
 /**
     Example:
 
-    #include "mbed.h"
+#include "mbed.h"
 #include "AS3933.h"
 
-AS3933 myAS3933   ( PB_5, PB_4, PB_3, PB_8, 1000000 );                              // MOSI: PB_5 | MISO: PB_4 | SCLK: PB_3 | CS: PB_8 | FREQ: 1MHz;
+AS3933 myAS3933   ( PB_5, PB_4, PB_3, PB_8, 1000000 );                          // MOSI: PB_5 | MISO: PB_4 | SCLK: PB_3 | CS: PB_8 | FREQ: 1MHz;
 Serial pc         ( USBTX, USBRX );
 
-Ticker     newReading;
-DigitalOut myled(LED1);
+DigitalOut  myled       ( LED1 );
+InterruptIn myWAKEpin   ( PA_8 );
+DigitalIn   myDATpin    ( PC_7 );
+DigitalIn   myCLDpin    ( PB_9 );
+
 
 AS3933::AS3933_status_t  aux;
 AS3933::AS3933_data_t    myAS3933Data;
 uint32_t                 myState = 0;
 
 
-void changeDATA ( void )
+void newData ( void )
 {
     myState = 1;
 }
@@ -42,6 +45,10 @@
 
 int main()
 {
+    uint32_t myCounterData      =   0;
+    uint32_t myCounterTimeout   =   0;
+
+
     pc.baud ( 115200 );
 
     myled   =   1;
@@ -49,20 +56,80 @@
     myled   =   0;
 
 
+    // AS3933 CONFIGURATION
     // Clears the wake state of the chip
     aux  =   myAS3933.AS3933_Send_DirectCommand ( AS3933::CLEAR_WAKE );
 
     // Sets all register in the default mode
     aux  =   myAS3933.AS3933_Send_DirectCommand ( AS3933::PRESET_DEFAULT );
 
-
     // Update the wakeup pattern ( default value )
-    myAS3933Data.patt1b     =   0x23;                                           // Default value: AS3933::TS1_WAKEUP_PATTERN_PATT1B;
+    myAS3933Data.patt1b     =   AS3933::TS1_WAKEUP_PATTERN_PATT1B;
     myAS3933Data.patt2b     =   AS3933::TS2_WAKEUP_PATTERN_PATT2B;
 
     aux  =   myAS3933.AS3933_SetWakeUpPattern   ( myAS3933Data );
 
-    newReading.attach( &changeDATA, 1 );                                        // the address of the function to be attached ( changeDATA ) and the interval ( 1s )
+    // Configure All channels in Listening mode
+    aux  =   myAS3933.AS3933_SetLowPowerMode ( AS3933::AS3933_CH1_ON_CH2_ON_CH3_ON, AS3933::AS3933_STANDARD_LISTENING_MODE, ( AS3933::AS3933_r4_t_off_value_t )0 );
+
+    // Configure Crystal oscillator enabled without output signal displayed on CL_DAT pin
+    aux  =   myAS3933.AS3933_SetClockGenerator ( AS3933::EN_XTAL_ENABLED, AS3933::CLOCK_GEN_DIS_DISABLED );
+
+    // Configure Antenna dumper disabled
+    aux  =   myAS3933.AS3933_SetAntennaDamper ( AS3933::ATT_ON_DISABLED, ( AS3933::AS3933_r4_d_res_value_t )0 );
+
+    // Configure Envelop detector time constant = 4096 symbol rate
+    aux  =   myAS3933.AS3933_SetEnvelopDetector ( AS3933::FS_ENV_SYMBOL_RATE_4096 );
+
+    // Configure Data slicer. Threshold disabled, 2.3ms preamble length
+    aux  =   myAS3933.AS3933_SetDataSlicer ( AS3933::ABS_HY_DISABLED, AS3933::FS_SCL_PREAMBLE_LENGTH_2_3 );
+
+    // Configure Comparator Hysteresis. Both edges, 40mV
+    aux  =   myAS3933.AS3933_SetComparatorHysteresis ( AS3933::HY_POS_HYSTERESIS_BOTH_EDGES, AS3933::HY_20M_COMPARATOR_HYSTERESIS_40MV );
+
+    // Configure Gain reduction, No gain reduction at all
+    aux  =   myAS3933.AS3933_SetGainReduction ( AS3933::GR_GAIN_REDUCTION_NO_GAIN_REDUCTION );
+
+    // Configure Operating frequency range: 95-150 kHz
+    aux  =   myAS3933.AS3933_SetOperatingFrequencyRange ( AS3933::BAND_SEL_RANGE_95_150_KHZ );
+
+    // Configure Frequency detection tolerance: Tight
+    aux  =   myAS3933.AS3933_SetFrequencyDetectionTolerance  ( AS3933::AS3933_TOLERANCE_TIGHT );
+
+    // Configure Sensitivity boost: Disabled
+    aux  =   myAS3933.AS3933_SetGainBoost ( AS3933::G_BOOST_DISABLED );
+
+    // Configure AGC: AGC acting only on the first carrier burst is disabled and AGC operating in both direction ( up-down )
+    aux  =   myAS3933.AS3933_SetAGC ( AS3933::AGC_TLIM_DISABLED, AS3933::AGC_UD_UP_DOWN_MODE );
+
+    // Configure Do mask data before wakeup
+    aux  =   myAS3933.AS3933_SetDataMask ( AS3933::DAT_MASK_ENABLED );
+
+    // Configure Clock Generator: Crystal oscillator enabled, do NOT clock signal on CL_DAT pin
+    aux  =   myAS3933.AS3933_SetClockGenerator ( AS3933::EN_XTAL_ENABLED, AS3933::CLOCK_GEN_DIS_DISABLED );
+
+    // Configure Correlator: Enabled, 16 bit pattern and Manchester decoder enabled
+    aux  =   myAS3933.AS3933_SetCorrelator ( AS3933::EN_WPAT_ENABLED, AS3933::PATT32_16_BITS, AS3933::T_HBIT_BIT_RATE_12, AS3933::EN_MANCH_ENABLED );
+
+    // Configure Automatic Timeout: 50ms
+    aux  =   myAS3933.AS3933_SetAutomaticTimeOut ( AS3933::T_OUT_50_MSEC );
+
+    // Configure Input capacitor bank: NO capacitance in any channels
+    aux  =   myAS3933.AS3933_SetParallelTuningCapacitance ( AS3933::AS3933_CHANNEL_LF1P, AS3933::AS3933_CAPACITANCE_ADDS_NONE );
+    aux  =   myAS3933.AS3933_SetParallelTuningCapacitance ( AS3933::AS3933_CHANNEL_LF2P, AS3933::AS3933_CAPACITANCE_ADDS_NONE );
+    aux  =   myAS3933.AS3933_SetParallelTuningCapacitance ( AS3933::AS3933_CHANNEL_LF3P, AS3933::AS3933_CAPACITANCE_ADDS_NONE );
+
+    // Configure Artificial wakeup: Disabled
+    aux  =   myAS3933.AS3933_SetArtificialWakeUp ( AS3933::T_AUTO_NO_ARTIFICIAL_WAKEUP );
+    // END AS3933 CONFIGURATION
+
+
+    // Read the wakeup pattern
+    aux  =   myAS3933.AS3933_GetWakeUpPattern ( &myAS3933Data );
+    pc.printf( "PATT1B: %x ( 0x96 ) | PATT2B: %x ( 0x69 )\r\n", myAS3933Data.patt1b, myAS3933Data.patt2b );
+
+
+    myWAKEpin.rise( &newData );                                                 // attach the address of the 'newData' function to the rising edge
 
     // Let the callbacks take care of everything
     while(1) {
@@ -71,9 +138,37 @@
         myled = 1;
 
         if ( myState == 1 ) {
-            // Read the wakeup pattern
-            aux  =   myAS3933.AS3933_GetWakeUpPattern ( &myAS3933Data );
-            pc.printf( "PATT1B: %x ( 0x23 ) | PATT2B: %x ( 0x69 )\r\n", myAS3933Data.patt1b, myAS3933Data.patt2b );
+
+            //  Get data ( 8-bits, Manchester ).
+            //    NOTE:   Make sure the transmitter is sending data otherwise a little delay will
+            //            be introduced by myCounterTimeout.
+            //
+            myAS3933Data.data   =   0;
+
+            for ( myCounterData = 0; myCounterData < 8; myCounterData++ ) {
+                //  Wait until rising edges on CLD pin or Timeout
+                myCounterTimeout    =   2323;
+                while ( ( myCLDpin == 0 ) && ( myCounterTimeout > 0 ) ) {
+                    myCounterTimeout--;
+                }
+
+                //  Process the data
+                myAS3933Data.data <<=   1;
+
+                if ( myDATpin == 1 ) {
+                    myAS3933Data.data  |=  1;
+                }
+
+                //  Wait until CLD pin goes low again or Timeout
+                myCounterTimeout    =   2323;
+                while ( ( myCLDpin == 1 ) && ( myCounterTimeout > 0 ) ) {
+                    myCounterTimeout--;
+                }
+            }
+
+            // Get RSSIs and send all data through the UART
+            aux  =   myAS3933.AS3933_GetRSSI ( &myAS3933Data );
+            pc.printf( "Data: %x | RSS1: %x | RSSI2: %x | RSSI3: %x\r\n", myAS3933Data.data, myAS3933Data.rssi1, myAS3933Data.rssi2, myAS3933Data.rssi3 );
 
             myState  =   0;                                                     // Reset the variable
         }