MAX44005 RGB Color, Temperature, and Infrared Proximity Sensor

Dependents:   test_MAX44005 testSensor

Committer:
Rhyme
Date:
Fri Dec 18 00:01:14 2015 +0000
Revision:
0:81100c58ea0e
commit before publishing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:81100c58ea0e 1 /**
Rhyme 0:81100c58ea0e 2 * MAX44005 RGB Color, Temperature,
Rhyme 0:81100c58ea0e 3 * and Infrared Proximity Sensor
Rhyme 0:81100c58ea0e 4 * I2C 7bit address: 0x4A
Rhyme 0:81100c58ea0e 5 */
Rhyme 0:81100c58ea0e 6 #include "MAX44005.h"
Rhyme 0:81100c58ea0e 7
Rhyme 0:81100c58ea0e 8 /* some definitions here */
Rhyme 0:81100c58ea0e 9 #define REG_INT_STATUS 0x00
Rhyme 0:81100c58ea0e 10 #define REG_MAIN_CONFIG 0x01
Rhyme 0:81100c58ea0e 11 #define REG_AMB_CONFIG 0x02
Rhyme 0:81100c58ea0e 12 #define REG_PRX_CONFIG 0x03
Rhyme 0:81100c58ea0e 13
Rhyme 0:81100c58ea0e 14 /* AMBIENT + PROXIMITY READING */
Rhyme 0:81100c58ea0e 15 #define REG_AMB_CLR_MSB 0x04
Rhyme 0:81100c58ea0e 16 #define REG_AMB_CLR_LSB 0x05
Rhyme 0:81100c58ea0e 17 #define REG_AMB_RED_MSB 0x06
Rhyme 0:81100c58ea0e 18 #define REG_AMB_REG_LSB 0x07
Rhyme 0:81100c58ea0e 19 #define REG_AMB_GRN_MSB 0x08
Rhyme 0:81100c58ea0e 20 #define REG_AMB_GRN_LSB 0x09
Rhyme 0:81100c58ea0e 21 #define REG_AMB_BLU_MSB 0x0A
Rhyme 0:81100c58ea0e 22 #define REG_AMB_BLU_LSB 0x0B
Rhyme 0:81100c58ea0e 23 #define REG_AMB_IR_MSB 0x0C
Rhyme 0:81100c58ea0e 24 #define REG_AMB_IR_LSB 0x0D
Rhyme 0:81100c58ea0e 25 #define REG_AMB_IRCMP_MSB 0x0E
Rhyme 0:81100c58ea0e 26 #define REG_AMB_IRCMP_LSB 0x0F
Rhyme 0:81100c58ea0e 27 #define REG_PRX_MSB 0x10
Rhyme 0:81100c58ea0e 28 #define REG_PRX_LSB 0x11
Rhyme 0:81100c58ea0e 29
Rhyme 0:81100c58ea0e 30 /* TEMPERATURE SENSOR */
Rhyme 0:81100c58ea0e 31 #define REG_TMP_MSB 0x12
Rhyme 0:81100c58ea0e 32 #define REG_TMP_LSB 0x13
Rhyme 0:81100c58ea0e 33
Rhyme 0:81100c58ea0e 34 /* INTERRUPT THRESHOLDS */
Rhyme 0:81100c58ea0e 35 #define REG_AMB_UTHR_MSB 0x14
Rhyme 0:81100c58ea0e 36 #define REG_AMB_UTHR_LSB 0x15
Rhyme 0:81100c58ea0e 37 #define REG_AMB_LTHR_MSB 0x16
Rhyme 0:81100c58ea0e 38 #define REG_AMB_LTHR_LSB 0x17
Rhyme 0:81100c58ea0e 39 #define REG_THR_PST 0x18
Rhyme 0:81100c58ea0e 40 #define REG_PRX_UTHR_MSB 0x19
Rhyme 0:81100c58ea0e 41 #define REG_PRX_UTHR_LSB 0x1A
Rhyme 0:81100c58ea0e 42 #define REG_PRX_LTHR_MSB 0x1B
Rhyme 0:81100c58ea0e 43 #define REG_PRX_LTHR_LSB 0x1C
Rhyme 0:81100c58ea0e 44
Rhyme 0:81100c58ea0e 45 /* AMBIENT ADC GAINS */
Rhyme 0:81100c58ea0e 46 #define REG_TRIM_GAIN_CLR 0x1D
Rhyme 0:81100c58ea0e 47 #define REG_TRIM_GAIN_RED 0x1E
Rhyme 0:81100c58ea0e 48 #define REG_TRIM_GAIN_GRN 0x1F
Rhyme 0:81100c58ea0e 49 #define REG_TRIM_GAIN_BLU 0x20
Rhyme 0:81100c58ea0e 50 #define REG_TRIM_GAIN_IR 0x21
Rhyme 0:81100c58ea0e 51
Rhyme 0:81100c58ea0e 52 MAX44005::MAX44005(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) {
Rhyme 0:81100c58ea0e 53 // activate the peripheral
Rhyme 0:81100c58ea0e 54 }
Rhyme 0:81100c58ea0e 55
Rhyme 0:81100c58ea0e 56 MAX44005::~MAX44005() { }
Rhyme 0:81100c58ea0e 57
Rhyme 0:81100c58ea0e 58 void MAX44005::readRegs(int addr, uint8_t * data, int len) {
Rhyme 0:81100c58ea0e 59 char t[1] = {addr} ;
Rhyme 0:81100c58ea0e 60 m_i2c.write(m_addr, t, 1, true) ;
Rhyme 0:81100c58ea0e 61 m_i2c.read(m_addr, (char*)data, len) ;
Rhyme 0:81100c58ea0e 62 }
Rhyme 0:81100c58ea0e 63
Rhyme 0:81100c58ea0e 64 void MAX44005::writeRegs(uint8_t * data, int len) {
Rhyme 0:81100c58ea0e 65 m_i2c.write(m_addr, (char *)data, len) ;
Rhyme 0:81100c58ea0e 66 }
Rhyme 0:81100c58ea0e 67
Rhyme 0:81100c58ea0e 68 int16_t MAX44005::getAMB_CLEAR(void) {
Rhyme 0:81100c58ea0e 69 int16_t value;
Rhyme 0:81100c58ea0e 70 uint8_t res[2];
Rhyme 0:81100c58ea0e 71 readRegs(REG_AMB_CLR_MSB, res, 2) ;
Rhyme 0:81100c58ea0e 72 value = (res[0] << 8)+res[1] ;
Rhyme 0:81100c58ea0e 73 return( value ) ;
Rhyme 0:81100c58ea0e 74 }
Rhyme 0:81100c58ea0e 75
Rhyme 0:81100c58ea0e 76 int16_t MAX44005::getAMB_RED(void) {
Rhyme 0:81100c58ea0e 77 int16_t value;
Rhyme 0:81100c58ea0e 78 uint8_t res[2];
Rhyme 0:81100c58ea0e 79 readRegs(REG_AMB_RED_MSB, res, 2) ;
Rhyme 0:81100c58ea0e 80 value = (res[0] << 8)+res[1] ;
Rhyme 0:81100c58ea0e 81 return( value ) ;
Rhyme 0:81100c58ea0e 82 }
Rhyme 0:81100c58ea0e 83
Rhyme 0:81100c58ea0e 84 int16_t MAX44005::getAMB_GREEN(void) {
Rhyme 0:81100c58ea0e 85 int16_t value;
Rhyme 0:81100c58ea0e 86 uint8_t res[2];
Rhyme 0:81100c58ea0e 87 readRegs(REG_AMB_GRN_MSB, res, 2) ;
Rhyme 0:81100c58ea0e 88 value = (res[0] << 8)+res[1] ;
Rhyme 0:81100c58ea0e 89 return( value ) ;
Rhyme 0:81100c58ea0e 90 }
Rhyme 0:81100c58ea0e 91
Rhyme 0:81100c58ea0e 92 int16_t MAX44005::getAMB_BLUE(void) {
Rhyme 0:81100c58ea0e 93 int16_t value;
Rhyme 0:81100c58ea0e 94 uint8_t res[2];
Rhyme 0:81100c58ea0e 95 readRegs(REG_AMB_BLU_MSB, res, 2) ;
Rhyme 0:81100c58ea0e 96 value = (res[0] << 8)+res[1] ;
Rhyme 0:81100c58ea0e 97 return( value ) ;
Rhyme 0:81100c58ea0e 98 }
Rhyme 0:81100c58ea0e 99
Rhyme 0:81100c58ea0e 100 int16_t MAX44005::getIR(void) {
Rhyme 0:81100c58ea0e 101 int16_t value;
Rhyme 0:81100c58ea0e 102 uint8_t res[2];
Rhyme 0:81100c58ea0e 103 readRegs(REG_AMB_IR_MSB, res, 2) ;
Rhyme 0:81100c58ea0e 104 value = (res[0] << 8)+res[1] ;
Rhyme 0:81100c58ea0e 105 return( value ) ;
Rhyme 0:81100c58ea0e 106 }
Rhyme 0:81100c58ea0e 107
Rhyme 0:81100c58ea0e 108 int16_t MAX44005::getIRCOMP(void) {
Rhyme 0:81100c58ea0e 109 int16_t value;
Rhyme 0:81100c58ea0e 110 uint8_t res[2];
Rhyme 0:81100c58ea0e 111 readRegs(REG_AMB_IRCMP_MSB, res, 2) ;
Rhyme 0:81100c58ea0e 112 value = (res[0] << 8)+res[1] ;
Rhyme 0:81100c58ea0e 113 return( value ) ;
Rhyme 0:81100c58ea0e 114 }
Rhyme 0:81100c58ea0e 115
Rhyme 0:81100c58ea0e 116 int16_t MAX44005::getTEMP(void) {
Rhyme 0:81100c58ea0e 117 int16_t value;
Rhyme 0:81100c58ea0e 118 uint8_t res[2];
Rhyme 0:81100c58ea0e 119 readRegs(REG_TMP_MSB, res, 2) ;
Rhyme 0:81100c58ea0e 120 value = (res[0] << 8)+res[1] ;
Rhyme 0:81100c58ea0e 121 return( value ) ;
Rhyme 0:81100c58ea0e 122 }
Rhyme 0:81100c58ea0e 123
Rhyme 0:81100c58ea0e 124 void MAX44005::enableTEMP(void) {
Rhyme 0:81100c58ea0e 125 uint8_t val[2] ;
Rhyme 0:81100c58ea0e 126 val[0] = REG_AMB_CONFIG ;
Rhyme 0:81100c58ea0e 127 readRegs(REG_AMB_CONFIG, &val[1], 1) ;
Rhyme 0:81100c58ea0e 128 val[1] = val[1] | 0x20 ; // set TEMPEN
Rhyme 0:81100c58ea0e 129 writeRegs(val, 2) ;
Rhyme 0:81100c58ea0e 130 }
Rhyme 0:81100c58ea0e 131
Rhyme 0:81100c58ea0e 132 void MAX44005::disableTEMP(void) {
Rhyme 0:81100c58ea0e 133 uint8_t val[2] ;
Rhyme 0:81100c58ea0e 134 val[0] = REG_AMB_CONFIG ;
Rhyme 0:81100c58ea0e 135 readRegs(REG_AMB_CONFIG, &val[1], 1) ;
Rhyme 0:81100c58ea0e 136 val[1] = val[1] & (~0x20) ; // clear TEMPEN
Rhyme 0:81100c58ea0e 137 writeRegs(val, 2) ;
Rhyme 0:81100c58ea0e 138 }
Rhyme 0:81100c58ea0e 139
Rhyme 0:81100c58ea0e 140 void MAX44005::enableAMBINT(void)
Rhyme 0:81100c58ea0e 141 {
Rhyme 0:81100c58ea0e 142 uint8_t val[2] ;
Rhyme 0:81100c58ea0e 143 val[0] = REG_MAIN_CONFIG ;
Rhyme 0:81100c58ea0e 144 readRegs(REG_MAIN_CONFIG, &val[1], 1) ;
Rhyme 0:81100c58ea0e 145 val[1] |= 0x01 ;
Rhyme 0:81100c58ea0e 146 writeRegs(val, 2) ;
Rhyme 0:81100c58ea0e 147 }
Rhyme 0:81100c58ea0e 148
Rhyme 0:81100c58ea0e 149 void MAX44005::disableAMBINT(void)
Rhyme 0:81100c58ea0e 150 {
Rhyme 0:81100c58ea0e 151 uint8_t val[2] ;
Rhyme 0:81100c58ea0e 152 val[0] = REG_MAIN_CONFIG ;
Rhyme 0:81100c58ea0e 153 readRegs(REG_MAIN_CONFIG, &val[1], 1) ;
Rhyme 0:81100c58ea0e 154 val[1] &= (~0x01) ;
Rhyme 0:81100c58ea0e 155 writeRegs(val, 2) ;
Rhyme 0:81100c58ea0e 156 }
Rhyme 0:81100c58ea0e 157
Rhyme 0:81100c58ea0e 158 void MAX44005::enablePRXINT(void)
Rhyme 0:81100c58ea0e 159 {
Rhyme 0:81100c58ea0e 160 uint8_t val[2] ;
Rhyme 0:81100c58ea0e 161 val[0] = REG_MAIN_CONFIG ;
Rhyme 0:81100c58ea0e 162 readRegs(REG_MAIN_CONFIG, &val[1], 1) ;
Rhyme 0:81100c58ea0e 163 val[1] |= 0x02 ;
Rhyme 0:81100c58ea0e 164 writeRegs(val, 2) ;
Rhyme 0:81100c58ea0e 165 }
Rhyme 0:81100c58ea0e 166
Rhyme 0:81100c58ea0e 167 void MAX44005::disablePRXINT(void)
Rhyme 0:81100c58ea0e 168 {
Rhyme 0:81100c58ea0e 169 uint8_t val[2] ;
Rhyme 0:81100c58ea0e 170 val[0] = REG_MAIN_CONFIG ;
Rhyme 0:81100c58ea0e 171 readRegs(REG_MAIN_CONFIG, &val[1], 1) ;
Rhyme 0:81100c58ea0e 172 val[1] &= (~0x02) ;
Rhyme 0:81100c58ea0e 173 writeRegs(val, 2) ;
Rhyme 0:81100c58ea0e 174 }
Rhyme 0:81100c58ea0e 175
Rhyme 0:81100c58ea0e 176 void MAX44005::setMode(uint8_t newMode)
Rhyme 0:81100c58ea0e 177 {
Rhyme 0:81100c58ea0e 178 uint8_t val[2] ;
Rhyme 0:81100c58ea0e 179 val[0] = REG_MAIN_CONFIG ;
Rhyme 0:81100c58ea0e 180 readRegs(REG_MAIN_CONFIG, &val[1], 1) ;
Rhyme 0:81100c58ea0e 181 val[1] = (0x70 & (newMode << 4)) | (val[1] & 0x0F) ;
Rhyme 0:81100c58ea0e 182 writeRegs(val, 2) ;
Rhyme 0:81100c58ea0e 183 }