3D Low Frequency Wakeup Receiver
Revision 4:10d482ca4eb1, committed 2018-03-13
- 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 }