Luca Antolini / Mbed 2 deprecated Stabilus322699_LA0010

Dependencies:   mbed QEI DmTftLibrary

Committer:
GregCr
Date:
Mon Mar 13 15:12:05 2017 +0000
Revision:
0:9c0917bfde97
alpha release

Who changed what in which revision?

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