This code holds the complete demo set for the sx1280: PingPong, PER and Ranging Outdoor demo application. >>>>> This code MUST run on the mbed library release 127 or everything will be painfully slow.

Dependencies:   mbed SX1280Lib DmTftLibrary

* This code MUST run on the mbed library release 127 or everything will be painfully slow.*
Committer:
mverdy
Date:
Thu Nov 08 10:14:39 2018 +0000
Revision:
20:626b92b70bf7
Addition of missing modules to synchronize with v1.5.2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mverdy 20:626b92b70bf7 1 /*
mverdy 20:626b92b70bf7 2 ______ _
mverdy 20:626b92b70bf7 3 / _____) _ | |
mverdy 20:626b92b70bf7 4 ( (____ _____ ____ _| |_ _____ ____| |__
mverdy 20:626b92b70bf7 5 \____ \| ___ | (_ _) ___ |/ ___) _ \
mverdy 20:626b92b70bf7 6 _____) ) ____| | | || |_| ____( (___| | | |
mverdy 20:626b92b70bf7 7 (______/|_____)_|_|_| \__)_____)\____)_| |_|
mverdy 20:626b92b70bf7 8 (C)2016 Semtech
mverdy 20:626b92b70bf7 9
mverdy 20:626b92b70bf7 10 Description: SX9306 Proximity sensor
mverdy 20:626b92b70bf7 11
mverdy 20:626b92b70bf7 12 Maintainer: Gregory Cristian & Gilbert Menth
mverdy 20:626b92b70bf7 13 */
mverdy 20:626b92b70bf7 14
mverdy 20:626b92b70bf7 15 #include "mbed.h"
mverdy 20:626b92b70bf7 16 #include <stdio.h>
mverdy 20:626b92b70bf7 17 #include "DmTftBase.h"
mverdy 20:626b92b70bf7 18 #include "SX9306.h"
mverdy 20:626b92b70bf7 19 #include "Timers.h"
mverdy 20:626b92b70bf7 20 #include "Eeprom.h"
mverdy 20:626b92b70bf7 21
mverdy 20:626b92b70bf7 22 union ProximityData_t
mverdy 20:626b92b70bf7 23 {
mverdy 20:626b92b70bf7 24 ProximityStruct ThisAntenna;
mverdy 20:626b92b70bf7 25 char Buffer[sizeof( ProximityStruct )];
mverdy 20:626b92b70bf7 26 };
mverdy 20:626b92b70bf7 27
mverdy 20:626b92b70bf7 28 typedef enum
mverdy 20:626b92b70bf7 29 {
mverdy 20:626b92b70bf7 30 PROXIMITY_STATE_START_RESET,
mverdy 20:626b92b70bf7 31 PROXIMITY_STATE_WAIT_RESET,
mverdy 20:626b92b70bf7 32 PROXIMITY_STATE_INIT,
mverdy 20:626b92b70bf7 33 PROXIMITY_STATE_READ,
mverdy 20:626b92b70bf7 34 PROXIMITY_STATE_WAIT
mverdy 20:626b92b70bf7 35 }ProximityAppState_t;
mverdy 20:626b92b70bf7 36
mverdy 20:626b92b70bf7 37
mverdy 20:626b92b70bf7 38 DigitalOut ProximityIcReset( PA_1 );
mverdy 20:626b92b70bf7 39 I2C ProxI2C( I2C_SDA, I2C_SCL );
mverdy 20:626b92b70bf7 40
mverdy 20:626b92b70bf7 41 static uint32_t ProximityTimer;
mverdy 20:626b92b70bf7 42 static char ReadDataBuffer[2];
mverdy 20:626b92b70bf7 43 static char WriteDataBuffer[2];
mverdy 20:626b92b70bf7 44 static ProximityAppState_t ProximityAppState;
mverdy 20:626b92b70bf7 45 static ProximityData_t ProximityReading;
mverdy 20:626b92b70bf7 46 static ProximityStruct Antenna[2];
mverdy 20:626b92b70bf7 47
mverdy 20:626b92b70bf7 48
mverdy 20:626b92b70bf7 49 static bool SX9306ProximityReadRegister( char thisRegAddress, char *value );
mverdy 20:626b92b70bf7 50 static bool SX9306ProximityWriteRegister( char thisRegAddress, char value );
mverdy 20:626b92b70bf7 51 static bool SX9306ProximityReadAntennaValues( void );
mverdy 20:626b92b70bf7 52
mverdy 20:626b92b70bf7 53
mverdy 20:626b92b70bf7 54 void SX9306ProximityInit( void )
mverdy 20:626b92b70bf7 55 {
mverdy 20:626b92b70bf7 56 int count;
mverdy 20:626b92b70bf7 57
mverdy 20:626b92b70bf7 58 ProximityAppState = PROXIMITY_STATE_START_RESET;
mverdy 20:626b92b70bf7 59 for( count = 0; count < 2; count++ )
mverdy 20:626b92b70bf7 60 {
mverdy 20:626b92b70bf7 61 Antenna[count].Averaged = 0;
mverdy 20:626b92b70bf7 62 Antenna[count].Instantaneous = 0;
mverdy 20:626b92b70bf7 63 }
mverdy 20:626b92b70bf7 64 }
mverdy 20:626b92b70bf7 65
mverdy 20:626b92b70bf7 66 void SX9306ProximityHandle( void )
mverdy 20:626b92b70bf7 67 {
mverdy 20:626b92b70bf7 68 bool i2cResult;
mverdy 20:626b92b70bf7 69
mverdy 20:626b92b70bf7 70 switch( ProximityAppState )
mverdy 20:626b92b70bf7 71 {
mverdy 20:626b92b70bf7 72 case PROXIMITY_STATE_START_RESET:
mverdy 20:626b92b70bf7 73 ProximityIcReset = false;
mverdy 20:626b92b70bf7 74 TimersSetTimer( &ProximityTimer, 10 * TIM_MSEC );
mverdy 20:626b92b70bf7 75 ProximityAppState = PROXIMITY_STATE_WAIT_RESET;
mverdy 20:626b92b70bf7 76 break;
mverdy 20:626b92b70bf7 77
mverdy 20:626b92b70bf7 78 case PROXIMITY_STATE_WAIT_RESET:
mverdy 20:626b92b70bf7 79 if( TimersTimerHasExpired( &ProximityTimer ) )
mverdy 20:626b92b70bf7 80 {
mverdy 20:626b92b70bf7 81 ProximityIcReset = true;
mverdy 20:626b92b70bf7 82 TimersSetTimer( &ProximityTimer, 10 * TIM_MSEC );
mverdy 20:626b92b70bf7 83 ProximityAppState = PROXIMITY_STATE_INIT;
mverdy 20:626b92b70bf7 84 }
mverdy 20:626b92b70bf7 85 break;
mverdy 20:626b92b70bf7 86
mverdy 20:626b92b70bf7 87 case PROXIMITY_STATE_INIT:
mverdy 20:626b92b70bf7 88 if( TimersTimerHasExpired( &ProximityTimer ) )
mverdy 20:626b92b70bf7 89 {
mverdy 20:626b92b70bf7 90 TimersSetTimer( &ProximityTimer, 1 * TIM_SEC );
mverdy 20:626b92b70bf7 91 //Clear interrupts after power on
mverdy 20:626b92b70bf7 92 i2cResult = SX9306ProximityReadRegister( REG_IRQ_SRC, \
mverdy 20:626b92b70bf7 93 &ReadDataBuffer[0] );
mverdy 20:626b92b70bf7 94 if( !i2cResult )
mverdy 20:626b92b70bf7 95 {
mverdy 20:626b92b70bf7 96 //Enable antennas 1 & 2
mverdy 20:626b92b70bf7 97 i2cResult = SX9306ProximityWriteRegister( REG_CONTROL_0, \
mverdy 20:626b92b70bf7 98 SENSOR_ENABLE_23 );
mverdy 20:626b92b70bf7 99 if( !i2cResult )
mverdy 20:626b92b70bf7 100 {
mverdy 20:626b92b70bf7 101 //Stop doze mode
mverdy 20:626b92b70bf7 102 i2cResult = SX9306ProximityWriteRegister( REG_CONTROL_3, \
mverdy 20:626b92b70bf7 103 SENSOR_DOZE_OFF );
mverdy 20:626b92b70bf7 104 if( !i2cResult )
mverdy 20:626b92b70bf7 105 {
mverdy 20:626b92b70bf7 106 //Set max gain and granularity
mverdy 20:626b92b70bf7 107 i2cResult = SX9306ProximityWriteRegister( REG_CONTROL_2, \
mverdy 20:626b92b70bf7 108 MAX_GAIN );
mverdy 20:626b92b70bf7 109 }
mverdy 20:626b92b70bf7 110 }
mverdy 20:626b92b70bf7 111 }
mverdy 20:626b92b70bf7 112 if( !i2cResult )
mverdy 20:626b92b70bf7 113 {
mverdy 20:626b92b70bf7 114 ProximityAppState = PROXIMITY_STATE_READ;
mverdy 20:626b92b70bf7 115 }
mverdy 20:626b92b70bf7 116 else
mverdy 20:626b92b70bf7 117 {
mverdy 20:626b92b70bf7 118 ProximityAppState = PROXIMITY_STATE_START_RESET;
mverdy 20:626b92b70bf7 119 }
mverdy 20:626b92b70bf7 120 }
mverdy 20:626b92b70bf7 121 break;
mverdy 20:626b92b70bf7 122
mverdy 20:626b92b70bf7 123 case PROXIMITY_STATE_READ:
mverdy 20:626b92b70bf7 124 TimersSetTimer( &ProximityTimer, 1 * TIM_SEC );
mverdy 20:626b92b70bf7 125 //Select antenna 1
mverdy 20:626b92b70bf7 126 i2cResult = SX9306ProximityWriteRegister( REG_SENSORSEL, SENSOR_SEL_1 );
mverdy 20:626b92b70bf7 127 if( i2cResult )
mverdy 20:626b92b70bf7 128 {
mverdy 20:626b92b70bf7 129 ProximityAppState = PROXIMITY_STATE_START_RESET;
mverdy 20:626b92b70bf7 130 break;
mverdy 20:626b92b70bf7 131 }
mverdy 20:626b92b70bf7 132 i2cResult = SX9306ProximityReadAntennaValues( ); //Read values
mverdy 20:626b92b70bf7 133 if( i2cResult )
mverdy 20:626b92b70bf7 134 {
mverdy 20:626b92b70bf7 135 ProximityAppState = PROXIMITY_STATE_START_RESET;
mverdy 20:626b92b70bf7 136 break;
mverdy 20:626b92b70bf7 137 }
mverdy 20:626b92b70bf7 138 Antenna[ANTENNA_1] = ProximityReading.ThisAntenna;
mverdy 20:626b92b70bf7 139 //Select antenna 2
mverdy 20:626b92b70bf7 140 i2cResult = SX9306ProximityWriteRegister( REG_SENSORSEL, SENSOR_SEL_2 );
mverdy 20:626b92b70bf7 141 if( i2cResult )
mverdy 20:626b92b70bf7 142 {
mverdy 20:626b92b70bf7 143 ProximityAppState = PROXIMITY_STATE_START_RESET;
mverdy 20:626b92b70bf7 144 break;
mverdy 20:626b92b70bf7 145 }
mverdy 20:626b92b70bf7 146 i2cResult = SX9306ProximityReadAntennaValues( ); //Read values
mverdy 20:626b92b70bf7 147 if( i2cResult )
mverdy 20:626b92b70bf7 148 {
mverdy 20:626b92b70bf7 149 ProximityAppState = PROXIMITY_STATE_START_RESET;
mverdy 20:626b92b70bf7 150 break;
mverdy 20:626b92b70bf7 151 }
mverdy 20:626b92b70bf7 152 Antenna[ANTENNA_2] = ProximityReading.ThisAntenna;
mverdy 20:626b92b70bf7 153 ProximityAppState = PROXIMITY_STATE_WAIT;
mverdy 20:626b92b70bf7 154 break;
mverdy 20:626b92b70bf7 155
mverdy 20:626b92b70bf7 156 case PROXIMITY_STATE_WAIT:
mverdy 20:626b92b70bf7 157 if( TimersTimerHasExpired( &ProximityTimer ) )
mverdy 20:626b92b70bf7 158 {
mverdy 20:626b92b70bf7 159 ProximityAppState = PROXIMITY_STATE_READ;
mverdy 20:626b92b70bf7 160 }
mverdy 20:626b92b70bf7 161 break;
mverdy 20:626b92b70bf7 162 }
mverdy 20:626b92b70bf7 163 }
mverdy 20:626b92b70bf7 164
mverdy 20:626b92b70bf7 165 static bool SX9306ProximityReadRegister( char thisRegAddress, char *value )
mverdy 20:626b92b70bf7 166 {
mverdy 20:626b92b70bf7 167 WriteDataBuffer[0] = thisRegAddress;
mverdy 20:626b92b70bf7 168 // Write the register address
mverdy 20:626b92b70bf7 169 if( ProxI2C.write( PROXIMITY_I2C_ADDR, &WriteDataBuffer[0], 1, 0 ) )
mverdy 20:626b92b70bf7 170 {
mverdy 20:626b92b70bf7 171 return true;
mverdy 20:626b92b70bf7 172 }
mverdy 20:626b92b70bf7 173 // Read data from the address
mverdy 20:626b92b70bf7 174 if( ProxI2C.read( PROXIMITY_I2C_ADDR, value, 1, 0 ) )
mverdy 20:626b92b70bf7 175 {
mverdy 20:626b92b70bf7 176 return true;
mverdy 20:626b92b70bf7 177 }
mverdy 20:626b92b70bf7 178 return false;
mverdy 20:626b92b70bf7 179 }
mverdy 20:626b92b70bf7 180
mverdy 20:626b92b70bf7 181 static bool SX9306ProximityWriteRegister( char thisRegAddress, char value )
mverdy 20:626b92b70bf7 182 {
mverdy 20:626b92b70bf7 183 WriteDataBuffer[0] = thisRegAddress;
mverdy 20:626b92b70bf7 184 WriteDataBuffer[1] = value;
mverdy 20:626b92b70bf7 185
mverdy 20:626b92b70bf7 186 // Write the register address and data byte
mverdy 20:626b92b70bf7 187 if( ProxI2C.write( PROXIMITY_I2C_ADDR, &WriteDataBuffer[0], 2, 0 ) )
mverdy 20:626b92b70bf7 188 {
mverdy 20:626b92b70bf7 189 return true;
mverdy 20:626b92b70bf7 190 }
mverdy 20:626b92b70bf7 191 return false;
mverdy 20:626b92b70bf7 192 }
mverdy 20:626b92b70bf7 193
mverdy 20:626b92b70bf7 194 static bool SX9306ProximityReadAntennaValues( void )
mverdy 20:626b92b70bf7 195 {
mverdy 20:626b92b70bf7 196 bool i2cResult;
mverdy 20:626b92b70bf7 197
mverdy 20:626b92b70bf7 198 i2cResult = SX9306ProximityReadRegister( REG_PROXUSEFUL, \
mverdy 20:626b92b70bf7 199 &ProximityReading.Buffer[1] );
mverdy 20:626b92b70bf7 200 if( i2cResult )
mverdy 20:626b92b70bf7 201 {
mverdy 20:626b92b70bf7 202 return true;
mverdy 20:626b92b70bf7 203 }
mverdy 20:626b92b70bf7 204 i2cResult = SX9306ProximityReadRegister( REG_PROXUSEFUL + 1, \
mverdy 20:626b92b70bf7 205 &ProximityReading.Buffer[0] );
mverdy 20:626b92b70bf7 206 if( i2cResult )
mverdy 20:626b92b70bf7 207 {
mverdy 20:626b92b70bf7 208 return true;
mverdy 20:626b92b70bf7 209 }
mverdy 20:626b92b70bf7 210 i2cResult = SX9306ProximityReadRegister( REG_PROXAVG, \
mverdy 20:626b92b70bf7 211 &ProximityReading.Buffer[3] );
mverdy 20:626b92b70bf7 212 if( i2cResult )
mverdy 20:626b92b70bf7 213 {
mverdy 20:626b92b70bf7 214 return true;
mverdy 20:626b92b70bf7 215 }
mverdy 20:626b92b70bf7 216 i2cResult = SX9306ProximityReadRegister( REG_PROXAVG + 1, \
mverdy 20:626b92b70bf7 217 &ProximityReading.Buffer[2] );
mverdy 20:626b92b70bf7 218 if( i2cResult )
mverdy 20:626b92b70bf7 219 {
mverdy 20:626b92b70bf7 220 return true;
mverdy 20:626b92b70bf7 221 }
mverdy 20:626b92b70bf7 222 return false;
mverdy 20:626b92b70bf7 223 }
mverdy 20:626b92b70bf7 224
mverdy 20:626b92b70bf7 225 uint8_t SX9306proximitySerialCommand( uint8_t writeNotRead, uint8_t address, \
mverdy 20:626b92b70bf7 226 uint8_t writeValue, uint8_t *readValue )
mverdy 20:626b92b70bf7 227 {
mverdy 20:626b92b70bf7 228 char valueRead = 0;
mverdy 20:626b92b70bf7 229 bool i2cResult;
mverdy 20:626b92b70bf7 230
mverdy 20:626b92b70bf7 231 if( writeNotRead )
mverdy 20:626b92b70bf7 232 {
mverdy 20:626b92b70bf7 233 i2cResult = SX9306ProximityWriteRegister( address, writeValue );
mverdy 20:626b92b70bf7 234 }
mverdy 20:626b92b70bf7 235 else
mverdy 20:626b92b70bf7 236 {
mverdy 20:626b92b70bf7 237 i2cResult = SX9306ProximityReadRegister( address, &valueRead );
mverdy 20:626b92b70bf7 238 *readValue = ( uint8_t )valueRead;
mverdy 20:626b92b70bf7 239 }
mverdy 20:626b92b70bf7 240 if( i2cResult )
mverdy 20:626b92b70bf7 241 {
mverdy 20:626b92b70bf7 242 return 0;
mverdy 20:626b92b70bf7 243 }
mverdy 20:626b92b70bf7 244 return 1;
mverdy 20:626b92b70bf7 245 }
mverdy 20:626b92b70bf7 246
mverdy 20:626b92b70bf7 247 uint16_t SX9306proximityGetReadValue( uint32_t thisAntenna )
mverdy 20:626b92b70bf7 248 {
mverdy 20:626b92b70bf7 249 uint16_t retVal;
mverdy 20:626b92b70bf7 250
mverdy 20:626b92b70bf7 251 switch( thisAntenna )
mverdy 20:626b92b70bf7 252 {
mverdy 20:626b92b70bf7 253 case 0:
mverdy 20:626b92b70bf7 254 case 1:
mverdy 20:626b92b70bf7 255 retVal = Antenna[thisAntenna].Instantaneous;
mverdy 20:626b92b70bf7 256 break;
mverdy 20:626b92b70bf7 257
mverdy 20:626b92b70bf7 258 default:
mverdy 20:626b92b70bf7 259 retVal = Antenna[0].Instantaneous;
mverdy 20:626b92b70bf7 260 break;
mverdy 20:626b92b70bf7 261 }
mverdy 20:626b92b70bf7 262 return retVal;
mverdy 20:626b92b70bf7 263 }
mverdy 20:626b92b70bf7 264