3#ifdef SENSOR_AMB_TSL2591
10#define AMBIENT_ADDR (0x29 << 1)
11#define TSL2591_COMMAND 0xA0
12#define REG_ENABLE 0x00
13#define REG_CONFIG 0x01
14#define REG_C0DATAL 0x14
15#define REG_C1DATAL 0x16
17#define THRESH_MAX 60000
23 TSL2591_GAIN_LOW = 0x00,
24 TSL2591_GAIN_MED = 0x10,
25 TSL2591_GAIN_HIGH = 0x20,
26 TSL2591_GAIN_MAX = 0x30
30static TSL2591_Gain_t _currentGain = TSL2591_GAIN_MED;
31static int8_t _isAmbientSensor = 0;
32amb_tsl2591_t _amb_tsl2591Data = { };
33amb_tsl2591_t _bck_amb_tsl2591Data = {};
35int8_t amb_tsl2591_Is(I2C_HandleTypeDef *hi2c, int8_t tryInit)
37 if (!_isAmbientSensor && tryInit)
38 amb_tsl2591_Init(hi2c);
39 return _isAmbientSensor;
42HAL_StatusTypeDef amb_tsl2591_IsOn(I2C_HandleTypeDef *hi2c, uint8_t *onOff)
45 HAL_StatusTypeDef status = HAL_ERROR;
49 status = HAL_I2C_Mem_Read(hi2c, AMBIENT_ADDR, TSL2591_COMMAND | REG_ENABLE, I2C_MEMADD_SIZE_8BIT, &data, 1, 100);
57HAL_StatusTypeDef amb_tsl2591_On(I2C_HandleTypeDef *hi2c)
59 HAL_StatusTypeDef status = HAL_ERROR;
62 _amb_tsl2591Data.IsDataValid = 0;
72 status = HAL_I2C_Mem_Write(hi2c, AMBIENT_ADDR, TSL2591_COMMAND | REG_ENABLE, I2C_MEMADD_SIZE_8BIT, &data, 1, 100);
80 _currentGain = TSL2591_GAIN_MED;
81 data = (uint8_t) _currentGain | 0x01;
83 status = HAL_I2C_Mem_Write(hi2c, AMBIENT_ADDR, TSL2591_COMMAND | REG_CONFIG, I2C_MEMADD_SIZE_8BIT, &data, 1, 100);
89 for (data = 0; data < 4; data++)
90 if (amb_tsl2591_Read(hi2c) == HAL_OK)
96 _isAmbientSensor = (status == HAL_OK);
101HAL_StatusTypeDef amb_tsl2591_Off(I2C_HandleTypeDef *hi2c)
103 HAL_StatusTypeDef status = HAL_ERROR;
106 if (_isAmbientSensor)
114 status = HAL_I2C_Mem_Write(hi2c, AMBIENT_ADDR, TSL2591_COMMAND | REG_ENABLE, I2C_MEMADD_SIZE_8BIT, &data, 1, 100);
115 if (status != HAL_OK)
121HAL_StatusTypeDef amb_tsl2591_Init(I2C_HandleTypeDef *hi2c)
124 if (status == HAL_OK)
127 _isAmbientSensor = 1;
129 if ((status = amb_tsl2591_On(hi2c)) != HAL_OK)
132 if ((status = amb_tsl2591_Off(hi2c)) != HAL_OK)
135 _isAmbientSensor = (status == HAL_OK);
142static HAL_StatusTypeDef ambient_AdjustGain(I2C_HandleTypeDef *hi2c, uint16_t rawCH0)
144 TSL2591_Gain_t newGain = _currentGain;
145 HAL_StatusTypeDef status = HAL_OK;
148 if (rawCH0 > THRESH_MAX)
150 if (_currentGain == TSL2591_GAIN_MAX)
151 newGain = TSL2591_GAIN_HIGH;
152 else if (_currentGain == TSL2591_GAIN_HIGH)
153 newGain = TSL2591_GAIN_MED;
154 else if (_currentGain == TSL2591_GAIN_MED)
155 newGain = TSL2591_GAIN_LOW;
157 else if (rawCH0 < THRESH_MIN)
159 if (_currentGain == TSL2591_GAIN_LOW)
160 newGain = TSL2591_GAIN_MED;
161 else if (_currentGain == TSL2591_GAIN_MED)
162 newGain = TSL2591_GAIN_HIGH;
163 else if (_currentGain == TSL2591_GAIN_HIGH)
164 newGain = TSL2591_GAIN_MAX;
167 if (newGain != _currentGain)
169 _currentGain = newGain;
170 uint8_t regVal = _currentGain | 0x01;
171 status = HAL_I2C_Mem_Write(hi2c, AMBIENT_ADDR, TSL2591_COMMAND | REG_CONFIG, I2C_MEMADD_SIZE_8BIT, ®Val, 1, 100);
179HAL_StatusTypeDef amb_tsl2591_Read(I2C_HandleTypeDef *hi2c)
182 HAL_StatusTypeDef status = HAL_ERROR;
184 if (_isAmbientSensor)
190 if ((status = amb_tsl2591_IsOn(hi2c, &onOff)) != HAL_OK)
195 status = HAL_TIMEOUT;
200 if ((status = HAL_I2C_Mem_Read(hi2c, AMBIENT_ADDR, TSL2591_COMMAND | REG_C0DATAL, I2C_MEMADD_SIZE_8BIT, buffer, 4, 100)) != HAL_OK)
203 uint16_t ch0 = (buffer[1] << 8) | buffer[0];
204 uint16_t ch1 = (buffer[3] << 8) | buffer[2];
207 ambient_AdjustGain(hi2c, ch0);
211 switch (_currentGain)
214 case TSL2591_GAIN_LOW:
217 case TSL2591_GAIN_MED:
220 case TSL2591_GAIN_HIGH:
223 case TSL2591_GAIN_MAX:
224 multiplier = 9876.0f;
231 float atime = 100.0f;
232 float cpl = (atime * multiplier) / 408.0f;
233 if (ch0 < THRESH_MIN || ch0 > THRESH_MAX)
239 _amb_tsl2591Data.IsDataValid = 1;
240 _amb_tsl2591Data.Lux = ((float) ch0 - (2.0f * (float) ch1)) / cpl;
241 if (_amb_tsl2591Data.Lux < 0)
242 _amb_tsl2591Data.Lux = 0.0f;
248void amb_tsl2591_LogData(
char* buf)
251 sprintf(buf,
"|ambient lux:" PRIf_02 " ",
PRIf_02D(_amb_tsl2591Data.Lux));
This file contains all the function prototypes for the i2c.c file.
HAL_StatusTypeDef I2C_IsDeviceReadyMT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout)
Wrapper around HAL_I2C_IsDeviceReady() that recovers from a busy bus. If the HAL I2C bus is in a BUSY...
#define PRIf_02D(fData)
Expands to integer and fractional arguments for use with PRIf_02. Splits a float/double into the inte...
#define PRIf_02
printf format string for printing a float/double as integer with 2 decimal places....
mems_MainBlock_t _memsMainBlock
Global instance of the main flash control block; loaded by mems_ReadMainBlock().
HAL_StatusTypeDef mems_WriteMainBlock()
writing the main block on flash. The main block is stored on address 0