![](/media/cache/group/Semtech_stack_color_logo_highres.jpg.50x50_q85.jpg)
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.*
Peripherals/SX9306.cpp
- Committer:
- mverdy
- Date:
- 2018-11-08
- Revision:
- 20:626b92b70bf7
File content as of revision 20:626b92b70bf7:
/* ______ _ / _____) _ | | ( (____ _____ ____ _| |_ _____ ____| |__ \____ \| ___ | (_ _) ___ |/ ___) _ \ _____) ) ____| | | || |_| ____( (___| | | | (______/|_____)_|_|_| \__)_____)\____)_| |_| (C)2016 Semtech Description: SX9306 Proximity sensor Maintainer: Gregory Cristian & Gilbert Menth */ #include "mbed.h" #include <stdio.h> #include "DmTftBase.h" #include "SX9306.h" #include "Timers.h" #include "Eeprom.h" union ProximityData_t { ProximityStruct ThisAntenna; char Buffer[sizeof( ProximityStruct )]; }; typedef enum { PROXIMITY_STATE_START_RESET, PROXIMITY_STATE_WAIT_RESET, PROXIMITY_STATE_INIT, PROXIMITY_STATE_READ, PROXIMITY_STATE_WAIT }ProximityAppState_t; DigitalOut ProximityIcReset( PA_1 ); I2C ProxI2C( I2C_SDA, I2C_SCL ); static uint32_t ProximityTimer; static char ReadDataBuffer[2]; static char WriteDataBuffer[2]; static ProximityAppState_t ProximityAppState; static ProximityData_t ProximityReading; static ProximityStruct Antenna[2]; static bool SX9306ProximityReadRegister( char thisRegAddress, char *value ); static bool SX9306ProximityWriteRegister( char thisRegAddress, char value ); static bool SX9306ProximityReadAntennaValues( void ); void SX9306ProximityInit( void ) { int count; ProximityAppState = PROXIMITY_STATE_START_RESET; for( count = 0; count < 2; count++ ) { Antenna[count].Averaged = 0; Antenna[count].Instantaneous = 0; } } void SX9306ProximityHandle( void ) { bool i2cResult; switch( ProximityAppState ) { case PROXIMITY_STATE_START_RESET: ProximityIcReset = false; TimersSetTimer( &ProximityTimer, 10 * TIM_MSEC ); ProximityAppState = PROXIMITY_STATE_WAIT_RESET; break; case PROXIMITY_STATE_WAIT_RESET: if( TimersTimerHasExpired( &ProximityTimer ) ) { ProximityIcReset = true; TimersSetTimer( &ProximityTimer, 10 * TIM_MSEC ); ProximityAppState = PROXIMITY_STATE_INIT; } break; case PROXIMITY_STATE_INIT: if( TimersTimerHasExpired( &ProximityTimer ) ) { TimersSetTimer( &ProximityTimer, 1 * TIM_SEC ); //Clear interrupts after power on i2cResult = SX9306ProximityReadRegister( REG_IRQ_SRC, \ &ReadDataBuffer[0] ); if( !i2cResult ) { //Enable antennas 1 & 2 i2cResult = SX9306ProximityWriteRegister( REG_CONTROL_0, \ SENSOR_ENABLE_23 ); if( !i2cResult ) { //Stop doze mode i2cResult = SX9306ProximityWriteRegister( REG_CONTROL_3, \ SENSOR_DOZE_OFF ); if( !i2cResult ) { //Set max gain and granularity i2cResult = SX9306ProximityWriteRegister( REG_CONTROL_2, \ MAX_GAIN ); } } } if( !i2cResult ) { ProximityAppState = PROXIMITY_STATE_READ; } else { ProximityAppState = PROXIMITY_STATE_START_RESET; } } break; case PROXIMITY_STATE_READ: TimersSetTimer( &ProximityTimer, 1 * TIM_SEC ); //Select antenna 1 i2cResult = SX9306ProximityWriteRegister( REG_SENSORSEL, SENSOR_SEL_1 ); if( i2cResult ) { ProximityAppState = PROXIMITY_STATE_START_RESET; break; } i2cResult = SX9306ProximityReadAntennaValues( ); //Read values if( i2cResult ) { ProximityAppState = PROXIMITY_STATE_START_RESET; break; } Antenna[ANTENNA_1] = ProximityReading.ThisAntenna; //Select antenna 2 i2cResult = SX9306ProximityWriteRegister( REG_SENSORSEL, SENSOR_SEL_2 ); if( i2cResult ) { ProximityAppState = PROXIMITY_STATE_START_RESET; break; } i2cResult = SX9306ProximityReadAntennaValues( ); //Read values if( i2cResult ) { ProximityAppState = PROXIMITY_STATE_START_RESET; break; } Antenna[ANTENNA_2] = ProximityReading.ThisAntenna; ProximityAppState = PROXIMITY_STATE_WAIT; break; case PROXIMITY_STATE_WAIT: if( TimersTimerHasExpired( &ProximityTimer ) ) { ProximityAppState = PROXIMITY_STATE_READ; } break; } } static bool SX9306ProximityReadRegister( char thisRegAddress, char *value ) { WriteDataBuffer[0] = thisRegAddress; // Write the register address if( ProxI2C.write( PROXIMITY_I2C_ADDR, &WriteDataBuffer[0], 1, 0 ) ) { return true; } // Read data from the address if( ProxI2C.read( PROXIMITY_I2C_ADDR, value, 1, 0 ) ) { return true; } return false; } static bool SX9306ProximityWriteRegister( char thisRegAddress, char value ) { WriteDataBuffer[0] = thisRegAddress; WriteDataBuffer[1] = value; // Write the register address and data byte if( ProxI2C.write( PROXIMITY_I2C_ADDR, &WriteDataBuffer[0], 2, 0 ) ) { return true; } return false; } static bool SX9306ProximityReadAntennaValues( void ) { bool i2cResult; i2cResult = SX9306ProximityReadRegister( REG_PROXUSEFUL, \ &ProximityReading.Buffer[1] ); if( i2cResult ) { return true; } i2cResult = SX9306ProximityReadRegister( REG_PROXUSEFUL + 1, \ &ProximityReading.Buffer[0] ); if( i2cResult ) { return true; } i2cResult = SX9306ProximityReadRegister( REG_PROXAVG, \ &ProximityReading.Buffer[3] ); if( i2cResult ) { return true; } i2cResult = SX9306ProximityReadRegister( REG_PROXAVG + 1, \ &ProximityReading.Buffer[2] ); if( i2cResult ) { return true; } return false; } uint8_t SX9306proximitySerialCommand( uint8_t writeNotRead, uint8_t address, \ uint8_t writeValue, uint8_t *readValue ) { char valueRead = 0; bool i2cResult; if( writeNotRead ) { i2cResult = SX9306ProximityWriteRegister( address, writeValue ); } else { i2cResult = SX9306ProximityReadRegister( address, &valueRead ); *readValue = ( uint8_t )valueRead; } if( i2cResult ) { return 0; } return 1; } uint16_t SX9306proximityGetReadValue( uint32_t thisAntenna ) { uint16_t retVal; switch( thisAntenna ) { case 0: case 1: retVal = Antenna[thisAntenna].Instantaneous; break; default: retVal = Antenna[0].Instantaneous; break; } return retVal; }