43#define CHIP_NAME "Texas Instruments OPT300X"
44#define MANUFACTURER_NAME "Texas Instruments"
45#define SUPPLY_VOLTAGE_MIN 1.6f
46#define SUPPLY_VOLTAGE_MAX 3.6f
47#define MAX_CURRENT 0.01f
48#define TEMPERATURE_MIN -40.0f
49#define TEMPERATURE_MAX 85.0f
50#define DRIVER_VERSION 1000
55#define OPT300X_REG_RESULT 0x00
56#define OPT300X_REG_CONFIGURATION 0x01
57#define OPT300X_REG_LOW_LIMIT 0x02
58#define OPT300X_REG_HIGH_LIMIT 0x03
59#define OPT300X_REG_MANUFACTURER_ID 0x7E
60#define OPT300X_REG_DEVICE_ID 0x7F
72static uint8_t a_opt300x_iic_read(
opt300x_handle_t *handle, uint8_t reg, uint16_t *data)
76 memset(buf, 0,
sizeof(uint8_t) * 2);
81 *data = (uint16_t)(((uint16_t)buf[0] << 8) | buf[1]);
96static uint8_t a_opt300x_iic_write(
opt300x_handle_t *handle, uint8_t reg, uint16_t data)
100 buf[0] = (data >> 8) & 0xFF;
101 buf[1] = data & 0xFF;
126 handle->
type = (uint8_t)type;
168 handle->
iic_addr = (uint8_t)addr_pin;
220 handle->
debug_print(
"opt300x: iic_init is null.\n");
226 handle->
debug_print(
"opt300x: iic_deinit is null.\n");
232 handle->
debug_print(
"opt300x: iic_read is null.\n");
238 handle->
debug_print(
"opt300x: iic_write is null.\n");
244 handle->
debug_print(
"opt300x: delay_ms is null.\n");
250 handle->
debug_print(
"opt300x: receive_callback is null.\n");
257 handle->
debug_print(
"opt300x: iic init failed.\n");
271 handle->
debug_print(
"opt300x: manufacturer id is invalid.\n");
286 handle->
debug_print(
"opt300x: device id is invalid.\n");
324 handle->
debug_print(
"opt300x: read configuration failed.\n");
332 handle->
debug_print(
"opt300x: write configuration failed.\n");
338 handle->
debug_print(
"opt300x: iic deinit failed.\n");
374 handle->
debug_print(
"opt300x: read configuration failed.\n");
383 handle->
debug_print(
"opt300x: write configuration failed.\n");
418 handle->
debug_print(
"opt300x: read configuration failed.\n");
426 handle->
debug_print(
"opt300x: write configuration failed.\n");
465 handle->
debug_print(
"opt300x: opt3002 can't use this function.\n");
473 handle->
debug_print(
"opt300x: read configuration failed.\n");
477 if ((prev & (1 << 8)) != 0)
479 handle->
debug_print(
"opt300x: data is overflow.\n");
487 handle->
debug_print(
"opt300x: read result failed.\n");
491 exponent = ((*raw) >> 12) & 0xF;
492 fractional = (*raw) & 0xFFF;
495 *lux = 0.02f * powf(2.0f, (
float)exponent) * ((float)fractional);
499 *lux = 0.01f * powf(2.0f, (
float)exponent) * ((float)fractional);
536 handle->
debug_print(
"opt300x: only opt3002 can use this function.\n");
544 handle->
debug_print(
"opt300x: read configuration failed.\n");
548 if ((prev & (1 << 8)) != 0)
550 handle->
debug_print(
"opt300x: data is overflow.\n");
558 handle->
debug_print(
"opt300x: read result failed.\n");
562 exponent = ((*raw) >> 12) & 0xF;
563 fractional = (*raw) & 0xFFF;
564 *nw_cm2 = 1.2f * powf(2.0f, (
float)exponent) * ((float)fractional);
590 uint32_t timeout = 500;
602 handle->
debug_print(
"opt300x: opt3002 can't use this function.\n");
610 handle->
debug_print(
"opt300x: read configuration failed.\n");
619 handle->
debug_print(
"opt300x: write configuration failed.\n");
631 handle->
debug_print(
"opt300x: read configuration failed.\n");
635 if ((prev & (1 << 7)) != 0)
639 if ((prev & (1 << 8)) != 0)
641 handle->
debug_print(
"opt300x: data is overflow.\n");
656 handle->
debug_print(
"opt300x: read result failed.\n");
660 exponent = ((*raw) >> 12) & 0xF;
661 fractional = (*raw) & 0xFFF;
664 *lux = 0.02f * powf(2.0f, (
float)exponent) * ((float)fractional);
668 *lux = 0.01f * powf(2.0f, (
float)exponent) * ((float)fractional);
695 uint32_t timeout = 500;
707 handle->
debug_print(
"opt300x: only opt3002 can use this function.\n");
715 handle->
debug_print(
"opt300x: read configuration failed.\n");
724 handle->
debug_print(
"opt300x: write configuration failed.\n");
736 handle->
debug_print(
"opt300x: read configuration failed.\n");
740 if ((prev & (1 << 7)) != 0)
744 if ((prev & (1 << 8)) != 0)
746 handle->
debug_print(
"opt300x: data is overflow.\n");
761 handle->
debug_print(
"opt300x: read result failed.\n");
765 exponent = ((*raw) >> 12) & 0xF;
766 fractional = (*raw) & 0xFFF;
767 *nw_cm2 = 1.2f * powf(2.0f, (
float)exponent) * ((float)fractional);
799 handle->
debug_print(
"opt300x: write low limit failed.\n");
834 handle->
debug_print(
"opt300x: read low limit failed.\n");
869 handle->
debug_print(
"opt300x: write high limit failed.\n");
904 handle->
debug_print(
"opt300x: read high limit failed.\n");
941 handle->
debug_print(
"opt300x: opt3002 can't use this function.\n");
954 fraction = frexpf(f, &xp);
955 while ((xp > 0xB) || (fraction < 4095.0f))
961 if (fraction * 2.0f > 4095.0f)
968 remain = (uint16_t)fraction;
969 *reg = (((uint16_t)(xp & 0xF)) << 12) | (remain & 0xFFF);
1001 handle->
debug_print(
"opt300x: opt3002 can't use this function.\n");
1006 exponent = (reg >> 12) & 0xF;
1007 fractional = reg & 0xFFF;
1010 *lux = 0.02f * powf(2.0f, (
float)exponent) * ((float)fractional);
1014 *lux = 0.01f * powf(2.0f, (
float)exponent) * ((float)fractional);
1049 handle->
debug_print(
"opt300x: only opt3002 can use this function.\n");
1055 fraction = frexpf(f, &xp);
1056 while ((xp > 0xB) || (fraction < 4095.0f))
1062 if (fraction * 2.0f > 4095.0f)
1069 remain = (uint16_t)fraction;
1070 *reg = (((uint16_t)(xp & 0xF)) << 12) | (remain & 0xFFF);
1090 uint16_t fractional;
1102 handle->
debug_print(
"opt300x: only opt3002 can use this function.\n");
1107 exponent = (reg >> 12) & 0xF;
1108 fractional = reg & 0xFFF;
1109 *nw_cm2 = 1.2f * powf(2.0f, (
float)exponent) * ((float)fractional);
1141 handle->
debug_print(
"opt300x: opt3002 can't use this function.\n");
1147 handle->
debug_print(
"opt300x: opt3005 can't use this function.\n");
1155 handle->
debug_print(
"opt300x: read configuration failed.\n");
1159 prev &= ~(0xF << 12);
1160 prev |= range << 12;
1164 handle->
debug_print(
"opt300x: write configuration failed.\n");
1199 handle->
debug_print(
"opt300x: opt3002 can't use this function.\n");
1205 handle->
debug_print(
"opt300x: opt3005 can't use this function.\n");
1213 handle->
debug_print(
"opt300x: read configuration failed.\n");
1249 handle->
debug_print(
"opt300x: only opt3002 can use this function.\n");
1257 handle->
debug_print(
"opt300x: read configuration failed.\n");
1261 prev &= ~(0xF << 12);
1262 prev |= range << 12;
1266 handle->
debug_print(
"opt300x: write configuration failed.\n");
1301 handle->
debug_print(
"opt300x: only opt3002 can use this function.\n");
1309 handle->
debug_print(
"opt300x: read configuration failed.\n");
1345 handle->
debug_print(
"opt300x: only opt3005 can use this function.\n");
1353 handle->
debug_print(
"opt300x: read configuration failed.\n");
1357 prev &= ~(0xF << 12);
1358 prev |= range << 12;
1362 handle->
debug_print(
"opt300x: write configuration failed.\n");
1397 handle->
debug_print(
"opt300x: only opt3005 can use this function.\n");
1405 handle->
debug_print(
"opt300x: read configuration failed.\n");
1442 handle->
debug_print(
"opt300x: read configuration failed.\n");
1451 handle->
debug_print(
"opt300x: write configuration failed.\n");
1487 handle->
debug_print(
"opt300x: read configuration failed.\n");
1524 handle->
debug_print(
"opt300x: read configuration failed.\n");
1529 prev |= enable << 4;
1533 handle->
debug_print(
"opt300x: write configuration failed.\n");
1569 handle->
debug_print(
"opt300x: read configuration failed.\n");
1606 handle->
debug_print(
"opt300x: read configuration failed.\n");
1611 prev |= polarity << 3;
1615 handle->
debug_print(
"opt300x: write configuration failed.\n");
1651 handle->
debug_print(
"opt300x: read configuration failed.\n");
1688 handle->
debug_print(
"opt300x: read configuration failed.\n");
1693 prev |= enable << 2;
1697 handle->
debug_print(
"opt300x: write configuration failed.\n");
1733 handle->
debug_print(
"opt300x: read configuration failed.\n");
1770 handle->
debug_print(
"opt300x: read configuration failed.\n");
1779 handle->
debug_print(
"opt300x: write configuration failed.\n");
1815 handle->
debug_print(
"opt300x: read configuration failed.\n");
1851 handle->
debug_print(
"opt300x: read configuration failed.\n");
1856 if ((prev & (1 << 6)) != 0)
1863 if ((prev & (1 << 5)) != 0)
1897 if (a_opt300x_iic_write(handle, reg, data) != 0)
1930 if (a_opt300x_iic_read(handle, reg, data) != 0)
#define OPT300X_REG_HIGH_LIMIT
#define SUPPLY_VOLTAGE_MAX
#define MANUFACTURER_NAME
#define SUPPLY_VOLTAGE_MIN
#define OPT300X_REG_RESULT
chip register definition
#define OPT300X_REG_DEVICE_ID
#define OPT300X_REG_MANUFACTURER_ID
#define CHIP_NAME
chip information definition
#define OPT300X_REG_LOW_LIMIT
#define OPT300X_REG_CONFIGURATION
driver opt300x header file
uint8_t opt300x_get_range(opt300x_handle_t *handle, opt300x_range_t *range)
get range
uint8_t opt300x_set_fault_count(opt300x_handle_t *handle, opt300x_fault_count_t count)
set fault count
uint8_t opt300x_info(opt300x_info_t *info)
get chip's information
uint8_t opt300x_get_low_limit(opt300x_handle_t *handle, uint16_t *limit)
get low limit
uint8_t opt300x_get_high_limit(opt300x_handle_t *handle, uint16_t *limit)
get high limit
uint8_t opt3002_continuous_read(opt300x_handle_t *handle, uint16_t *raw, float *nw_cm2)
read data from the chip continuously
uint8_t opt3005_set_range(opt300x_handle_t *handle, opt3005_range_t range)
set range
uint8_t opt3002_single_read(opt300x_handle_t *handle, uint16_t *raw, float *nw_cm2)
read data from the chip
uint8_t opt300x_set_type(opt300x_handle_t *handle, opt300x_t type)
set the chip type
uint8_t opt300x_set_mask_exponent(opt300x_handle_t *handle, opt300x_bool_t enable)
enable or disable mask exponent
opt300x_address_t
opt300x address enumeration definition
uint8_t opt300x_set_high_limit(opt300x_handle_t *handle, uint16_t limit)
set high limit
opt300x_bool_t
opt300x bool enumeration definition
uint8_t opt300x_get_interrupt_pin_polarity(opt300x_handle_t *handle, opt300x_interrupt_polarity_t *polarity)
get interrupt pin polarity
opt3005_range_t
opt3005 range enumeration definition
uint8_t opt300x_get_conversion_time(opt300x_handle_t *handle, opt300x_conversion_time_t *t)
get conversion time
uint8_t opt300x_start_continuous_read(opt300x_handle_t *handle)
start the chip reading
opt300x_range_t
opt300x range enumeration definition
uint8_t opt300x_continuous_read(opt300x_handle_t *handle, uint16_t *raw, float *lux)
read data from the chip continuously
uint8_t opt300x_set_low_limit(opt300x_handle_t *handle, uint16_t limit)
set low limit
struct opt300x_info_s opt300x_info_t
opt300x information structure definition
uint8_t opt300x_limit_convert_to_register(opt300x_handle_t *handle, float lux, uint16_t *reg)
convert the limit threshold to the register raw data
uint8_t opt3005_get_range(opt300x_handle_t *handle, opt3005_range_t *range)
get range
opt300x_t
opt300x type enumeration definition
uint8_t opt3002_get_range(opt300x_handle_t *handle, opt3002_range_t *range)
get range
uint8_t opt300x_set_interrupt_pin_polarity(opt300x_handle_t *handle, opt300x_interrupt_polarity_t polarity)
set interrupt pin polarity
uint8_t opt300x_get_type(opt300x_handle_t *handle, opt300x_t *type)
get the iic chip type
uint8_t opt3002_limit_convert_to_register(opt300x_handle_t *handle, float nw_cm2, uint16_t *reg)
convert the limit threshold to the register raw data
uint8_t opt300x_set_conversion_time(opt300x_handle_t *handle, opt300x_conversion_time_t t)
set conversion time
uint8_t opt300x_get_addr_pin(opt300x_handle_t *handle, opt300x_address_t *addr_pin)
get the iic address pin
uint8_t opt300x_get_interrupt_latch(opt300x_handle_t *handle, opt300x_bool_t *enable)
get interrupt latch status
uint8_t opt3002_limit_convert_to_data(opt300x_handle_t *handle, uint16_t reg, float *nw_cm2)
convert the register raw data to the limit threshold
uint8_t opt300x_set_interrupt_latch(opt300x_handle_t *handle, opt300x_bool_t enable)
enable or disable interrupt latch
uint8_t opt300x_set_range(opt300x_handle_t *handle, opt300x_range_t range)
set range
uint8_t opt300x_deinit(opt300x_handle_t *handle)
close the chip
opt300x_conversion_time_t
opt300x conversion time enumeration definition
uint8_t opt300x_get_fault_count(opt300x_handle_t *handle, opt300x_fault_count_t *count)
get fault count
uint8_t opt300x_stop_continuous_read(opt300x_handle_t *handle)
stop the chip reading
uint8_t opt300x_limit_convert_to_data(opt300x_handle_t *handle, uint16_t reg, float *lux)
convert the register raw data to the limit threshold
opt3002_range_t
opt3002 range enumeration definition
uint8_t opt300x_set_addr_pin(opt300x_handle_t *handle, opt300x_address_t addr_pin)
set the iic address pin
uint8_t opt300x_init(opt300x_handle_t *handle)
initialize the chip
uint8_t opt300x_irq_handler(opt300x_handle_t *handle)
irq handler
opt300x_interrupt_polarity_t
opt300x interrupt polarity enumeration definition
uint8_t opt3002_set_range(opt300x_handle_t *handle, opt3002_range_t range)
set range
uint8_t opt300x_single_read(opt300x_handle_t *handle, uint16_t *raw, float *lux)
read data from the chip
opt300x_fault_count_t
opt300x fault count enumeration definition
struct opt300x_handle_s opt300x_handle_t
opt300x handle structure definition
uint8_t opt300x_get_mask_exponent(opt300x_handle_t *handle, opt300x_bool_t *enable)
get mask exponent status
@ OPT300X_INTERRUPT_HIGH_LIMIT
@ OPT300X_INTERRUPT_LOW_LIMIT
uint8_t opt300x_get_reg(opt300x_handle_t *handle, uint8_t reg, uint16_t *data)
get the chip register
uint8_t opt300x_set_reg(opt300x_handle_t *handle, uint8_t reg, uint16_t data)
set the chip register
void(* delay_ms)(uint32_t ms)
void(* receive_callback)(uint8_t type)
void(* debug_print)(const char *const fmt,...)
uint8_t(* iic_init)(void)
uint8_t(* iic_write)(uint8_t addr, uint8_t reg, uint8_t *buf, uint16_t len)
uint8_t(* iic_read)(uint8_t addr, uint8_t reg, uint8_t *buf, uint16_t len)
uint8_t(* iic_deinit)(void)
float supply_voltage_max_v
char manufacturer_name[32]
float supply_voltage_min_v