tsl2561 tsl4531 update
This commit is contained in:
parent
92b18cf2fd
commit
84af4e4bb1
6 changed files with 51 additions and 47 deletions
|
|
@ -16,6 +16,7 @@
|
||||||
* Connect 3.3v from the ESP to Vin and GND to GND
|
* Connect 3.3v from the ESP to Vin and GND to GND
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define I2C_BUS (0)
|
||||||
#define SCL_PIN (2)
|
#define SCL_PIN (2)
|
||||||
#define SDA_PIN (0)
|
#define SDA_PIN (0)
|
||||||
|
|
||||||
|
|
@ -27,7 +28,8 @@ void tsl2561MeasurementTask(void *pvParameters)
|
||||||
// TSL2561_I2C_ADDR_VCC (0x49)
|
// TSL2561_I2C_ADDR_VCC (0x49)
|
||||||
// TSL2561_I2C_ADDR_GND (0x29)
|
// TSL2561_I2C_ADDR_GND (0x29)
|
||||||
// TSL2561_I2C_ADDR_FLOAT (0x39) Default
|
// TSL2561_I2C_ADDR_FLOAT (0x39) Default
|
||||||
lightSensor.i2c_addr = TSL2561_I2C_ADDR_FLOAT;
|
lightSensor.i2c_dev.bus = I2C_BUS;
|
||||||
|
lightSensor.i2c_dev.addr = TSL2561_I2C_ADDR_FLOAT;
|
||||||
|
|
||||||
tsl2561_init(&lightSensor);
|
tsl2561_init(&lightSensor);
|
||||||
|
|
||||||
|
|
@ -63,7 +65,7 @@ void tsl2561MeasurementTask(void *pvParameters)
|
||||||
void user_init(void)
|
void user_init(void)
|
||||||
{
|
{
|
||||||
uart_set_baud(0, 115200);
|
uart_set_baud(0, 115200);
|
||||||
i2c_init(SCL_PIN, SDA_PIN);
|
i2c_init(I2C_BUS, SCL_PIN, SDA_PIN, I2C_FREQ_100K);
|
||||||
|
|
||||||
xTaskCreate(tsl2561MeasurementTask, "tsl2561MeasurementTask", 256, NULL, 2, NULL);
|
xTaskCreate(tsl2561MeasurementTask, "tsl2561MeasurementTask", 256, NULL, 2, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,13 +16,15 @@
|
||||||
* Connect 3.3v from the ESP to Vin and GND to GND
|
* Connect 3.3v from the ESP to Vin and GND to GND
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define I2C_BUS (0)
|
||||||
#define SCL_PIN (2)
|
#define SCL_PIN (2)
|
||||||
#define SDA_PIN (0)
|
#define SDA_PIN (0)
|
||||||
|
|
||||||
void tsl4531MeasurementTask(void *pvParameters)
|
void tsl4531MeasurementTask(void *pvParameters)
|
||||||
{
|
{
|
||||||
tsl4531_t lightSensor;
|
tsl4531_t lightSensor;
|
||||||
lightSensor.i2c_addr = TSL4531_I2C_ADDR;
|
lightSensor.i2c_dev.bus= I2C_BUS;
|
||||||
|
lightSensor.i2c_dev.addr= TSL4531_I2C_ADDR;
|
||||||
tsl4531_init(&lightSensor);
|
tsl4531_init(&lightSensor);
|
||||||
|
|
||||||
tsl4531_set_integration_time(&lightSensor, TSL4531_INTEGRATION_400MS);
|
tsl4531_set_integration_time(&lightSensor, TSL4531_INTEGRATION_400MS);
|
||||||
|
|
@ -49,7 +51,7 @@ void tsl4531MeasurementTask(void *pvParameters)
|
||||||
void user_init(void)
|
void user_init(void)
|
||||||
{
|
{
|
||||||
uart_set_baud(0, 115200);
|
uart_set_baud(0, 115200);
|
||||||
i2c_init(SCL_PIN, SDA_PIN);
|
i2c_init(I2C_BUS, SCL_PIN, SDA_PIN, I2C_FREQ_100K);
|
||||||
|
|
||||||
xTaskCreate(tsl4531MeasurementTask, "tsl4531MeasurementTask", 256, NULL, 2, NULL);
|
xTaskCreate(tsl4531MeasurementTask, "tsl4531MeasurementTask", 256, NULL, 2, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
#include "i2c/i2c.h"
|
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
#include "tsl2561.h"
|
#include "tsl2561.h"
|
||||||
|
|
||||||
|
|
@ -96,18 +95,18 @@
|
||||||
#define B8C 0x0000 // 0.000 * 2^LUX_SCALE
|
#define B8C 0x0000 // 0.000 * 2^LUX_SCALE
|
||||||
#define M8C 0x0000 // 0.000 * 2^LUX_SCALE
|
#define M8C 0x0000 // 0.000 * 2^LUX_SCALE
|
||||||
|
|
||||||
static int write_register(uint8_t i2c_addr, uint8_t reg, uint8_t value)
|
static int write_register(i2c_dev_t* i2c_dev, uint8_t reg, uint8_t value)
|
||||||
{
|
{
|
||||||
reg = TSL2561_REG_COMMAND | reg;
|
reg = TSL2561_REG_COMMAND | reg;
|
||||||
return i2c_slave_write(i2c_addr, ®, &value, 1);
|
return i2c_slave_write(i2c_dev->bus, i2c_dev->addr, ®, &value, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t read_register(uint8_t i2c_addr, uint8_t reg)
|
static uint8_t read_register(i2c_dev_t* i2c_dev, uint8_t reg)
|
||||||
{
|
{
|
||||||
uint8_t data[1];
|
uint8_t data[1];
|
||||||
reg = TSL2561_REG_COMMAND | reg;
|
reg = TSL2561_REG_COMMAND | reg;
|
||||||
|
|
||||||
if (i2c_slave_read(i2c_addr, ®, data, 1))
|
if (i2c_slave_read(i2c_dev->bus, i2c_dev->addr, ®, data, 1))
|
||||||
{
|
{
|
||||||
printf("Error in tsl2561 read_register\n");
|
printf("Error in tsl2561 read_register\n");
|
||||||
}
|
}
|
||||||
|
|
@ -115,13 +114,13 @@ static uint8_t read_register(uint8_t i2c_addr, uint8_t reg)
|
||||||
return data[0];
|
return data[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t read_register_16(uint8_t i2c_addr, uint8_t low_register_addr)
|
static uint16_t read_register_16(i2c_dev_t* i2c_dev, uint8_t low_register_addr)
|
||||||
{
|
{
|
||||||
uint16_t value = 0;
|
uint16_t value = 0;
|
||||||
uint8_t data[2];
|
uint8_t data[2];
|
||||||
low_register_addr = TSL2561_REG_COMMAND | TSL2561_READ_WORD | low_register_addr;
|
low_register_addr = TSL2561_REG_COMMAND | TSL2561_READ_WORD | low_register_addr;
|
||||||
|
|
||||||
if (i2c_slave_read(i2c_addr, &low_register_addr, data, 2))
|
if (i2c_slave_read(i2c_dev->bus, i2c_dev->addr, &low_register_addr, data, 2))
|
||||||
{
|
{
|
||||||
printf("Error with i2c_slave_read in read_register_16\n");
|
printf("Error with i2c_slave_read in read_register_16\n");
|
||||||
}
|
}
|
||||||
|
|
@ -131,24 +130,24 @@ static uint16_t read_register_16(uint8_t i2c_addr, uint8_t low_register_addr)
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int enable(uint8_t i2c_addr)
|
static int enable(i2c_dev_t* i2c_dev)
|
||||||
{
|
{
|
||||||
return write_register(i2c_addr, TSL2561_REG_CONTROL, TSL2561_ON);
|
return write_register(i2c_dev, TSL2561_REG_CONTROL, TSL2561_ON);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int disable(uint8_t i2c_addr)
|
static int disable(i2c_dev_t* i2c_dev)
|
||||||
{
|
{
|
||||||
return write_register(i2c_addr, TSL2561_REG_CONTROL, TSL2561_OFF);
|
return write_register(i2c_dev, TSL2561_REG_CONTROL, TSL2561_OFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tsl2561_init(tsl2561_t *device)
|
void tsl2561_init(tsl2561_t *device)
|
||||||
{
|
{
|
||||||
if (enable(device->i2c_addr))
|
if (enable(&device->i2c_dev))
|
||||||
{
|
{
|
||||||
printf("Error initializing tsl2561\n");
|
printf("Error initializing tsl2561\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t control_reg = (read_register(device->i2c_addr, TSL2561_REG_CONTROL) & TSL2561_ON);
|
uint8_t control_reg = (read_register(&device->i2c_dev, TSL2561_REG_CONTROL) & TSL2561_ON);
|
||||||
|
|
||||||
if (control_reg != TSL2561_ON)
|
if (control_reg != TSL2561_ON)
|
||||||
{
|
{
|
||||||
|
|
@ -156,39 +155,39 @@ void tsl2561_init(tsl2561_t *device)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fetch the package type
|
// Fetch the package type
|
||||||
uint8_t part_reg = read_register(device->i2c_addr, TSL2561_REG_PART_ID);
|
uint8_t part_reg = read_register(&device->i2c_dev, TSL2561_REG_PART_ID);
|
||||||
uint8_t package = part_reg >> 6;
|
uint8_t package = part_reg >> 6;
|
||||||
device->package_type = package;
|
device->package_type = package;
|
||||||
|
|
||||||
// Fetch the gain and integration time
|
// Fetch the gain and integration time
|
||||||
uint8_t timing_register = read_register(device->i2c_addr, TSL2561_REG_TIMING);
|
uint8_t timing_register = read_register(&device->i2c_dev, TSL2561_REG_TIMING);
|
||||||
device->gain = timing_register & 0x10;
|
device->gain = timing_register & 0x10;
|
||||||
device->integration_time = timing_register & 0x03;
|
device->integration_time = timing_register & 0x03;
|
||||||
|
|
||||||
disable(device->i2c_addr);
|
disable(&device->i2c_dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tsl2561_set_integration_time(tsl2561_t *device, tsl2561_integration_time_t integration_time_id)
|
void tsl2561_set_integration_time(tsl2561_t *device, tsl2561_integration_time_t integration_time_id)
|
||||||
{
|
{
|
||||||
enable(device->i2c_addr);
|
enable(&device->i2c_dev);
|
||||||
write_register(device->i2c_addr, TSL2561_REG_TIMING, integration_time_id | device->gain);
|
write_register(&device->i2c_dev, TSL2561_REG_TIMING, integration_time_id | device->gain);
|
||||||
disable(device->i2c_addr);
|
disable(&device->i2c_dev);
|
||||||
|
|
||||||
device->integration_time = integration_time_id;
|
device->integration_time = integration_time_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tsl2561_set_gain(tsl2561_t *device, tsl2561_gain_t gain)
|
void tsl2561_set_gain(tsl2561_t *device, tsl2561_gain_t gain)
|
||||||
{
|
{
|
||||||
enable(device->i2c_addr);
|
enable(&device->i2c_dev);
|
||||||
write_register(device->i2c_addr, TSL2561_REG_TIMING, gain | device->integration_time);
|
write_register(&device->i2c_dev, TSL2561_REG_TIMING, gain | device->integration_time);
|
||||||
disable(device->i2c_addr);
|
disable(&device->i2c_dev);
|
||||||
|
|
||||||
device->gain = gain;
|
device->gain = gain;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void get_channel_data(tsl2561_t *device, uint16_t *channel0, uint16_t *channel1)
|
static void get_channel_data(tsl2561_t *device, uint16_t *channel0, uint16_t *channel1)
|
||||||
{
|
{
|
||||||
enable(device->i2c_addr);
|
enable(&device->i2c_dev);
|
||||||
|
|
||||||
// Since we just enabled the chip, we need to sleep
|
// Since we just enabled the chip, we need to sleep
|
||||||
// for the chip's integration time so it can gather a reading
|
// for the chip's integration time so it can gather a reading
|
||||||
|
|
@ -205,10 +204,10 @@ static void get_channel_data(tsl2561_t *device, uint16_t *channel0, uint16_t *ch
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
*channel0 = read_register_16(device->i2c_addr, TSL2561_REG_CHANNEL_0_LOW);
|
*channel0 = read_register_16(&device->i2c_dev, TSL2561_REG_CHANNEL_0_LOW);
|
||||||
*channel1 = read_register_16(device->i2c_addr, TSL2561_REG_CHANNEL_1_LOW);
|
*channel1 = read_register_16(&device->i2c_dev, TSL2561_REG_CHANNEL_1_LOW);
|
||||||
|
|
||||||
disable(device->i2c_addr);
|
disable(&device->i2c_dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tsl2561_read_lux(tsl2561_t *device, uint32_t *lux)
|
bool tsl2561_read_lux(tsl2561_t *device, uint32_t *lux)
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <i2c/i2c.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
@ -38,7 +39,7 @@ typedef enum
|
||||||
} tsl2561_gain_t;
|
} tsl2561_gain_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
tsl2561_i2c_addr_t i2c_addr;
|
i2c_dev_t i2c_dev;
|
||||||
uint8_t integration_time;
|
uint8_t integration_time;
|
||||||
uint8_t gain;
|
uint8_t gain;
|
||||||
uint8_t package_type;
|
uint8_t package_type;
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
#include "i2c/i2c.h"
|
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
#include "tsl4531.h"
|
#include "tsl4531.h"
|
||||||
|
|
||||||
|
|
@ -27,18 +26,18 @@
|
||||||
#define TSL4531_INTEGRATION_TIME_200MS 240
|
#define TSL4531_INTEGRATION_TIME_200MS 240
|
||||||
#define TSL4531_INTEGRATION_TIME_400MS 480 // Default
|
#define TSL4531_INTEGRATION_TIME_400MS 480 // Default
|
||||||
|
|
||||||
static int write_register(uint8_t i2c_addr, uint8_t reg, uint8_t value)
|
static int write_register(i2c_dev_t* i2c_dev, uint8_t reg, uint8_t value)
|
||||||
{
|
{
|
||||||
reg = TSL4531_REG_COMMAND | reg;
|
reg = TSL4531_REG_COMMAND | reg;
|
||||||
return i2c_slave_write(i2c_addr, ®, &value, 1);
|
return i2c_slave_write(i2c_dev->bus, i2c_dev->addr, ®, &value, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t read_register(uint8_t i2c_addr, uint8_t reg)
|
static uint8_t read_register(i2c_dev_t* i2c_dev, uint8_t reg)
|
||||||
{
|
{
|
||||||
uint8_t data[1];
|
uint8_t data[1];
|
||||||
reg = TSL4531_REG_COMMAND | reg;
|
reg = TSL4531_REG_COMMAND | reg;
|
||||||
|
|
||||||
if (i2c_slave_read(i2c_addr, ®, data, 1))
|
if (i2c_slave_read(i2c_dev->bus, i2c_dev->addr, ®, data, 1))
|
||||||
{
|
{
|
||||||
printf("Error in tsl4531 read_register\n");
|
printf("Error in tsl4531 read_register\n");
|
||||||
}
|
}
|
||||||
|
|
@ -46,13 +45,13 @@ static uint8_t read_register(uint8_t i2c_addr, uint8_t reg)
|
||||||
return data[0];
|
return data[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t read_register_16(uint8_t i2c_addr, uint8_t low_register_addr)
|
static uint16_t read_register_16(i2c_dev_t* i2c_dev, uint8_t low_register_addr)
|
||||||
{
|
{
|
||||||
uint16_t value = 0;
|
uint16_t value = 0;
|
||||||
uint8_t data[2];
|
uint8_t data[2];
|
||||||
low_register_addr = TSL4531_REG_COMMAND | low_register_addr;
|
low_register_addr = TSL4531_REG_COMMAND | low_register_addr;
|
||||||
|
|
||||||
if (i2c_slave_read(i2c_addr, &low_register_addr, data, 2))
|
if (i2c_slave_read(i2c_dev->bus, i2c_dev->addr, &low_register_addr, data, 2))
|
||||||
{
|
{
|
||||||
printf("Error with i2c_slave_read in read_register_16\n");
|
printf("Error with i2c_slave_read in read_register_16\n");
|
||||||
}
|
}
|
||||||
|
|
@ -64,12 +63,12 @@ static uint16_t read_register_16(uint8_t i2c_addr, uint8_t low_register_addr)
|
||||||
|
|
||||||
static int enable(tsl4531_t *device)
|
static int enable(tsl4531_t *device)
|
||||||
{
|
{
|
||||||
return write_register(device->i2c_addr, TSL4531_REG_CONTROL, TSL4531_ON);
|
return write_register(&device->i2c_dev, TSL4531_REG_CONTROL, TSL4531_ON);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int disable(tsl4531_t *device)
|
static int disable(tsl4531_t *device)
|
||||||
{
|
{
|
||||||
return write_register(device->i2c_addr, TSL4531_REG_CONTROL, TSL4531_OFF);
|
return write_register(&device->i2c_dev, TSL4531_REG_CONTROL, TSL4531_OFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tsl4531_init(tsl4531_t *device)
|
void tsl4531_init(tsl4531_t *device)
|
||||||
|
|
@ -79,13 +78,13 @@ void tsl4531_init(tsl4531_t *device)
|
||||||
printf("Error initializing tsl4531, the enable write failed\n");
|
printf("Error initializing tsl4531, the enable write failed\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t control_reg = read_register(device->i2c_addr, TSL4531_REG_CONTROL);
|
uint8_t control_reg = read_register(&device->i2c_dev, TSL4531_REG_CONTROL);
|
||||||
|
|
||||||
if (control_reg != TSL4531_ON) {
|
if (control_reg != TSL4531_ON) {
|
||||||
printf("Error initializing tsl4531, control register wasn't set to ON\n");
|
printf("Error initializing tsl4531, control register wasn't set to ON\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t idRegister = read_register(device->i2c_addr, TSL4531_REG_DEVICE_ID);
|
uint8_t idRegister = read_register(&device->i2c_dev, TSL4531_REG_DEVICE_ID);
|
||||||
uint8_t id = (idRegister & 0xF0) >> 4;
|
uint8_t id = (idRegister & 0xF0) >> 4;
|
||||||
|
|
||||||
if (id == TSL4531_PART_TSL45317) {
|
if (id == TSL4531_PART_TSL45317) {
|
||||||
|
|
@ -110,7 +109,7 @@ void tsl4531_set_integration_time(tsl4531_t *device, tsl4531_integration_time_t
|
||||||
uint8_t new_config_reg = power_save_bit | integration_time_bits;
|
uint8_t new_config_reg = power_save_bit | integration_time_bits;
|
||||||
|
|
||||||
enable(device);
|
enable(device);
|
||||||
write_register(device->i2c_addr, TSL4531_REG_CONFIG, new_config_reg);
|
write_register(&device->i2c_dev, TSL4531_REG_CONFIG, new_config_reg);
|
||||||
disable(device);
|
disable(device);
|
||||||
|
|
||||||
device->integration_time_id = integration_time_id;
|
device->integration_time_id = integration_time_id;
|
||||||
|
|
@ -123,7 +122,7 @@ void tsl4531_set_power_save_skip(tsl4531_t *device, bool skip_power_save)
|
||||||
uint8_t new_config_reg = power_save_bit | integration_time_bits;
|
uint8_t new_config_reg = power_save_bit | integration_time_bits;
|
||||||
|
|
||||||
enable(device);
|
enable(device);
|
||||||
write_register(device->i2c_addr, TSL4531_REG_CONFIG, new_config_reg);
|
write_register(&device->i2c_dev, TSL4531_REG_CONFIG, new_config_reg);
|
||||||
disable(device);
|
disable(device);
|
||||||
|
|
||||||
device->skip_power_save = skip_power_save;
|
device->skip_power_save = skip_power_save;
|
||||||
|
|
@ -156,8 +155,8 @@ bool tsl4531_read_lux(tsl4531_t *device, uint16_t *lux)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t lux_data = read_register_16(device->i2c_addr, TSL4531_REG_DATA_LOW);
|
uint16_t lux_data = read_register_16(&device->i2c_dev, TSL4531_REG_DATA_LOW);
|
||||||
|
|
||||||
disable(device);
|
disable(device);
|
||||||
|
|
||||||
*lux = multiplier * lux_data;
|
*lux = multiplier * lux_data;
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <i2c/i2c.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
@ -38,7 +39,7 @@ typedef enum
|
||||||
} tsl4531_part_id_t;
|
} tsl4531_part_id_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
tsl4531_i2c_addr_t i2c_addr;
|
i2c_dev_t i2c_dev;
|
||||||
uint8_t integration_time_id;
|
uint8_t integration_time_id;
|
||||||
bool skip_power_save;
|
bool skip_power_save;
|
||||||
tsl4531_part_id_t part_id;
|
tsl4531_part_id_t part_id;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue