46 #include "lib/sensors.h" 50 #define PRINTF(...) printf(__VA_ARGS__) 59 #define MAX44009_ADDRESS (0x4A) 60 #define MAX44009_NOT_FOUND (0x00) 67 #define MAX44009_INT_STATUS_ADDR (0x00) 68 #define MAX44009_INT_ENABLE_ADDR (0x01) 69 #define MAX44009_CONFIG_ADDR (0x02) 70 #define MAX44009_LUX_HIGH_ADDR (0x03) 71 #define MAX44009_LUX_LOW_ADDR (0x04) 72 #define MAX44009_THR_HIGH_ADDR (0x05) 73 #define MAX44009_THR_LOW_ADDR (0x06) 74 #define MAX44009_THR_TIMER_ADDR (0x07) 81 #define MAX44009_INT_STATUS_OFF (0x00) 82 #define MAX44009_INT_STATUS_ON (0x01) 83 #define MAX44009_INT_DISABLED (0x00) 84 #define MAX44009_INT_ENABLED (0x01) 86 #define MAX44009_CONFIG_DEFAULT (0 << 7) 87 #define MAX44009_CONFIG_CONTINUOUS (1 << 7) 88 #define MAX44009_CONFIG_AUTO (0 << 6) 89 #define MAX44009_CONFIG_MANUAL (1 << 6) 90 #define MAX44009_CONFIG_CDR_NORMAL (0 << 5) 91 #define MAX44009_CONFIG_CDR_DIVIDED (1 << 5) 92 #define MAX44009_CONFIG_INTEGRATION_800ms (0 << 0) 93 #define MAX44009_CONFIG_INTEGRATION_400ms (1 << 0) 94 #define MAX44009_CONFIG_INTEGRATION_200ms (2 << 0) 95 #define MAX44009_CONFIG_INTEGRATION_100ms (3 << 0) 96 #define MAX44009_CONFIG_INTEGRATION_50ms (4 << 0) 97 #define MAX44009_CONFIG_INTEGRATION_25ms (5 << 0) 98 #define MAX44009_CONFIG_INTEGRATION_12ms (6 << 0) 99 #define MAX44009_CONFIG_INTEGRATION_6ms (7 << 0) 101 #define MAX44009_DEFAULT_CONFIGURATION (MAX44009_CONFIG_DEFAULT | \ 102 MAX44009_CONFIG_AUTO | \ 103 MAX44009_CONFIG_CDR_NORMAL | \ 104 MAX44009_CONFIG_INTEGRATION_100ms) 106 #define MAX44009_USER_CONFIGURATION (MAX44009_CONFIG_DEFAULT | \ 107 MAX44009_CONFIG_AUTO | \ 108 MAX44009_CONFIG_CDR_NORMAL | \ 109 MAX44009_CONFIG_INTEGRATION_800ms) 113 static uint8_t enabled;
118 uint8_t max44009_address[5] = { MAX44009_INT_ENABLE_ADDR, MAX44009_CONFIG_ADDR, \
119 MAX44009_THR_HIGH_ADDR, MAX44009_THR_LOW_ADDR, \
120 MAX44009_THR_TIMER_ADDR };
121 uint8_t max44009_value[5];
122 uint8_t max44009_data[2];
125 max44009_value[0] = (MAX44009_INT_STATUS_OFF);
126 max44009_value[1] = (MAX44009_USER_CONFIGURATION);
127 max44009_value[2] = (0xFF);
128 max44009_value[3] = (0x00);
129 max44009_value[4] = (0xFF);
131 for(i = 0; i <
sizeof(max44009_address) /
sizeof(max44009_address[0]); i++) {
132 max44009_data[0] = max44009_address[i];
133 max44009_data[1] = max44009_value[i];
141 uint8_t max44009_address[5] = { MAX44009_INT_ENABLE_ADDR, MAX44009_CONFIG_ADDR, \
142 MAX44009_THR_HIGH_ADDR, MAX44009_THR_LOW_ADDR, \
143 MAX44009_THR_TIMER_ADDR };
144 uint8_t max44009_value[5] = { 0x00, 0x03, 0xFF, 0x00, 0xFF };
145 uint8_t max44009_data[2];
148 for(i = 0; i <
sizeof(max44009_address) /
sizeof(max44009_address[0]); i++) {
149 max44009_data[0] = max44009_address[i];
150 max44009_data[1] = max44009_value[i];
156 max44009_is_present(
void)
163 if(status != I2C_MASTER_ERR_NONE) {
167 return is_present != MAX44009_NOT_FOUND;
171 max44009_read_light(
void)
173 uint8_t exponent, mantissa;
174 uint8_t max44009_data[2];
182 exponent = ((max44009_data[0] >> 4) & 0x0E);
183 mantissa = ((max44009_data[0] & 0x0F) << 4) | (max44009_data[1] & 0x0F);
185 result = ((uint16_t)exponent << 8) | ((uint16_t)mantissa << 0);
191 max44009_convert_light(uint16_t lux)
193 uint8_t exponent, mantissa;
196 exponent = (lux >> 8) & 0xFF;
197 exponent = (exponent == 0x0F ? exponent & 0x0E : exponent);
198 mantissa = (lux >> 0) & 0xFF;
200 result = 45 * (2 ^ exponent * mantissa) / 10;
202 return (uint16_t)result;
222 PRINTF(
"MAX44009: sensor not started\n");
223 return MAX44009_ERROR;
226 if(type == MAX44009_READ_RAW_LIGHT) {
227 return max44009_read_light();
228 }
else if(type == MAX44009_READ_LIGHT) {
229 value = max44009_read_light();
230 return max44009_convert_light(value);
232 PRINTF(
"MAX44009: invalid value requested\n");
233 return MAX44009_ERROR;
238 configure(
int type,
int value)
240 if(type == MAX44009_ACTIVATE) {
241 if(!max44009_is_present()) {
242 return MAX44009_ERROR;
246 return MAX44009_SUCCESS;
250 if((type == MAX44009_RESET) && enabled) {
252 return MAX44009_SUCCESS;
254 PRINTF(
"MAX44009: is not enabled\n");
255 return MAX44009_ERROR;
258 return MAX44009_ERROR;
261 SENSORS_SENSOR(max44009, MAX44009_SENSOR, value, configure, status);
uint8_t i2c_burst_send(uint8_t slave_addr, uint8_t *data, uint8_t len)
Perform all operations to send multiple bytes to a slave.
Header file for the MAX44009 light sensor driver.
uint8_t i2c_single_receive(uint8_t slave_addr, uint8_t *data)
Perform all operations to receive a byte from a slave.
uint8_t i2c_single_send(uint8_t slave_addr, uint8_t data)
Perform all operations to send a byte to a slave.