MAX44000 Ambient and Infrared Proximity Sensor

Dependents:   test_MAX44000 testSensor PMK2022_Agriculture

Committer:
Rhyme
Date:
Thu Jul 07 03:57:36 2016 +0000
Revision:
2:93ed4e2fe7fd
Parent:
1:e3d11ab4c524
Some document descriptions added about registers

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:c9c9e362ec57 1 /*
Rhyme 0:c9c9e362ec57 2 * File description here
Rhyme 0:c9c9e362ec57 3 */
Rhyme 0:c9c9e362ec57 4 #include "MAX44000.h"
Rhyme 0:c9c9e362ec57 5
Rhyme 0:c9c9e362ec57 6 /* some definitions here */
Rhyme 0:c9c9e362ec57 7 #define REG_INT_STATUS 0x00
Rhyme 0:c9c9e362ec57 8 #define REG_MAIN_CONFIG 0x01
Rhyme 0:c9c9e362ec57 9 #define REG_RECV_CONFIG 0x02
Rhyme 0:c9c9e362ec57 10 #define REG_TRNS_CONFIG 0x03
Rhyme 0:c9c9e362ec57 11
Rhyme 0:c9c9e362ec57 12 /* ADC DATA */
Rhyme 0:c9c9e362ec57 13 #define REG_ADC_MSB 0x04
Rhyme 0:c9c9e362ec57 14 #define REG_ADC_LSB 0x05
Rhyme 0:c9c9e362ec57 15 #define REG_ADC_BYTE 0x16
Rhyme 0:c9c9e362ec57 16
Rhyme 0:c9c9e362ec57 17 /* THRESHOLD SET */
Rhyme 0:c9c9e362ec57 18 #define REG_ALS_UMSB 0x06
Rhyme 0:c9c9e362ec57 19 #define REG_ALS_ULSB 0x07
Rhyme 0:c9c9e362ec57 20 #define REG_ALS_LMSB 0x08
Rhyme 0:c9c9e362ec57 21 #define REG_ALS_LLSB 0x09
Rhyme 0:c9c9e362ec57 22 #define REG_THR_PT 0x0A
Rhyme 0:c9c9e362ec57 23 #define REG_PRXTHR_IND 0x0B
Rhyme 0:c9c9e362ec57 24 #define REG_PRX_THR 0x0C
Rhyme 0:c9c9e362ec57 25 #define REG_TRM_GAING 0x0F
Rhyme 0:c9c9e362ec57 26 #define REG_TRM_GAINIR 0x10
Rhyme 0:c9c9e362ec57 27
Rhyme 0:c9c9e362ec57 28 MAX44000::MAX44000(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) {
Rhyme 0:c9c9e362ec57 29 // activate the peripheral
Rhyme 1:e3d11ab4c524 30 uint8_t conf = 0 ;
Rhyme 1:e3d11ab4c524 31 conf = \
Rhyme 1:e3d11ab4c524 32 0x20 /* Use factory-programmed gains for green and IR channels. */
Rhyme 1:e3d11ab4c524 33 | 0x10 /* ALS and PROX are interleaved ontinuously. */
Rhyme 1:e3d11ab4c524 34 ;
Rhyme 1:e3d11ab4c524 35 setMainConfig(conf) ;
Rhyme 0:c9c9e362ec57 36 }
Rhyme 0:c9c9e362ec57 37
Rhyme 0:c9c9e362ec57 38 MAX44000::~MAX44000() { }
Rhyme 0:c9c9e362ec57 39
Rhyme 0:c9c9e362ec57 40 void MAX44000::readRegs(int addr, uint8_t * data, int len) {
Rhyme 0:c9c9e362ec57 41 char t[1] = {addr} ;
Rhyme 0:c9c9e362ec57 42 m_i2c.write(m_addr, t, 1, true) ;
Rhyme 0:c9c9e362ec57 43 m_i2c.read(m_addr, (char*)data, len) ;
Rhyme 0:c9c9e362ec57 44 }
Rhyme 0:c9c9e362ec57 45
Rhyme 0:c9c9e362ec57 46 void MAX44000::writeRegs(uint8_t * data, int len) {
Rhyme 0:c9c9e362ec57 47 m_i2c.write(m_addr, (char *)data, len) ;
Rhyme 0:c9c9e362ec57 48 }
Rhyme 0:c9c9e362ec57 49
Rhyme 0:c9c9e362ec57 50 void MAX44000::getIntStatus(uint8_t *data)
Rhyme 0:c9c9e362ec57 51 {
Rhyme 0:c9c9e362ec57 52 readRegs(REG_INT_STATUS, data, 1) ;
Rhyme 0:c9c9e362ec57 53 }
Rhyme 0:c9c9e362ec57 54
Rhyme 0:c9c9e362ec57 55 void MAX44000::getMainConfig(uint8_t *conf)
Rhyme 0:c9c9e362ec57 56 {
Rhyme 0:c9c9e362ec57 57 readRegs(REG_MAIN_CONFIG, conf, 1) ;
Rhyme 0:c9c9e362ec57 58 }
Rhyme 0:c9c9e362ec57 59
Rhyme 0:c9c9e362ec57 60 void MAX44000::setMainConfig(uint8_t newConf)
Rhyme 0:c9c9e362ec57 61 {
Rhyme 0:c9c9e362ec57 62 uint8_t data[2] ;
Rhyme 0:c9c9e362ec57 63 data[0] = REG_MAIN_CONFIG ;
Rhyme 0:c9c9e362ec57 64 data[1] = newConf ;
Rhyme 0:c9c9e362ec57 65 writeRegs(data, 2) ;
Rhyme 0:c9c9e362ec57 66 }
Rhyme 0:c9c9e362ec57 67
Rhyme 0:c9c9e362ec57 68 void MAX44000::getRxConfig(uint8_t *conf)
Rhyme 0:c9c9e362ec57 69 {
Rhyme 0:c9c9e362ec57 70 readRegs(REG_RECV_CONFIG, conf, 1) ;
Rhyme 0:c9c9e362ec57 71 }
Rhyme 0:c9c9e362ec57 72
Rhyme 0:c9c9e362ec57 73 void MAX44000::setRxConfig(uint8_t newConf)
Rhyme 0:c9c9e362ec57 74 {
Rhyme 0:c9c9e362ec57 75 uint8_t data[2] ;
Rhyme 0:c9c9e362ec57 76 data[0] = REG_RECV_CONFIG ;
Rhyme 0:c9c9e362ec57 77 data[1] = newConf ;
Rhyme 0:c9c9e362ec57 78 writeRegs(data, 2) ;
Rhyme 0:c9c9e362ec57 79 }
Rhyme 0:c9c9e362ec57 80
Rhyme 0:c9c9e362ec57 81 void MAX44000::getTxConfig(uint8_t *conf)
Rhyme 0:c9c9e362ec57 82 {
Rhyme 0:c9c9e362ec57 83 readRegs(REG_TRNS_CONFIG, conf, 1) ;
Rhyme 0:c9c9e362ec57 84 }
Rhyme 0:c9c9e362ec57 85
Rhyme 0:c9c9e362ec57 86 void MAX44000::setTxConfig(uint8_t newConf)
Rhyme 0:c9c9e362ec57 87 {
Rhyme 0:c9c9e362ec57 88 uint8_t data[2] ;
Rhyme 0:c9c9e362ec57 89 data[0] = REG_TRNS_CONFIG ;
Rhyme 0:c9c9e362ec57 90 data[1] = newConf ;
Rhyme 0:c9c9e362ec57 91 writeRegs(data, 2) ;
Rhyme 0:c9c9e362ec57 92 }
Rhyme 0:c9c9e362ec57 93
Rhyme 0:c9c9e362ec57 94 void MAX44000::getALS(uint8_t *ofl, uint16_t *value)
Rhyme 0:c9c9e362ec57 95 {
Rhyme 0:c9c9e362ec57 96 uint8_t data[2] ;
Rhyme 1:e3d11ab4c524 97 // readRegs(REG_ADC_MSB, data, 2) ;
Rhyme 1:e3d11ab4c524 98 readRegs(REG_ADC_MSB, data, 1) ;
Rhyme 1:e3d11ab4c524 99 readRegs(REG_ADC_LSB, &data[1], 1) ;
Rhyme 0:c9c9e362ec57 100 *value = ((data[0] & 0x3F)<<8) | data[1] ;
Rhyme 0:c9c9e362ec57 101 *ofl = (data[0] >> 6) & 0x01 ; // overflow
Rhyme 0:c9c9e362ec57 102 }
Rhyme 0:c9c9e362ec57 103
Rhyme 0:c9c9e362ec57 104 void MAX44000::getProx(uint8_t *value)
Rhyme 0:c9c9e362ec57 105 {
Rhyme 0:c9c9e362ec57 106 readRegs(REG_ADC_BYTE, value, 1) ;
Rhyme 0:c9c9e362ec57 107 }
Rhyme 0:c9c9e362ec57 108
Rhyme 0:c9c9e362ec57 109 void MAX44000::getADC(uint8_t *ofl, uint16_t *als, uint8_t *prox)
Rhyme 0:c9c9e362ec57 110 {
Rhyme 0:c9c9e362ec57 111 getALS(ofl, als) ;
Rhyme 0:c9c9e362ec57 112 getProx(prox) ;
Rhyme 0:c9c9e362ec57 113 }
Rhyme 0:c9c9e362ec57 114
Rhyme 0:c9c9e362ec57 115 void MAX44000::getUPTHR(uint16_t *thr)
Rhyme 0:c9c9e362ec57 116 {
Rhyme 0:c9c9e362ec57 117 readRegs(REG_ALS_UMSB, (uint8_t*)thr, 2) ;
Rhyme 0:c9c9e362ec57 118 *thr &= 0x3FFF ;
Rhyme 0:c9c9e362ec57 119 }
Rhyme 0:c9c9e362ec57 120
Rhyme 0:c9c9e362ec57 121 void MAX44000::setUPTHR(uint16_t newThr)
Rhyme 0:c9c9e362ec57 122 {
Rhyme 0:c9c9e362ec57 123 uint8_t data[3] ;
Rhyme 0:c9c9e362ec57 124 data[0] = REG_ALS_UMSB ;
Rhyme 0:c9c9e362ec57 125 data[1] = (newThr >> 8) & 0x3F ;
Rhyme 0:c9c9e362ec57 126 data[2] = (newThr & 0xFF) ;
Rhyme 0:c9c9e362ec57 127 writeRegs(data, 3) ;
Rhyme 0:c9c9e362ec57 128 }
Rhyme 0:c9c9e362ec57 129
Rhyme 0:c9c9e362ec57 130 void MAX44000::getLOTHR(uint16_t *thr)
Rhyme 0:c9c9e362ec57 131 {
Rhyme 0:c9c9e362ec57 132 readRegs(REG_ALS_LMSB, (uint8_t*)thr, 2) ;
Rhyme 0:c9c9e362ec57 133 *thr &= 0x3FFF ;
Rhyme 0:c9c9e362ec57 134 }
Rhyme 0:c9c9e362ec57 135
Rhyme 0:c9c9e362ec57 136 void MAX44000::setLOTHR(uint16_t newThr)
Rhyme 0:c9c9e362ec57 137 {
Rhyme 0:c9c9e362ec57 138 uint8_t data[3] ;
Rhyme 0:c9c9e362ec57 139 data[0] = REG_ALS_LMSB ;
Rhyme 0:c9c9e362ec57 140 data[1] = (newThr >> 8) & 0x3F ;
Rhyme 0:c9c9e362ec57 141 data[2] = (newThr & 0xFF) ;
Rhyme 0:c9c9e362ec57 142 writeRegs(data, 3) ;
Rhyme 0:c9c9e362ec57 143 }
Rhyme 0:c9c9e362ec57 144
Rhyme 0:c9c9e362ec57 145 void MAX44000::getTHRPT(uint8_t *data)
Rhyme 0:c9c9e362ec57 146 {
Rhyme 0:c9c9e362ec57 147 readRegs(REG_THR_PT, data, 1) ;
Rhyme 0:c9c9e362ec57 148 }
Rhyme 0:c9c9e362ec57 149
Rhyme 0:c9c9e362ec57 150 void MAX44000::setTHRPT(uint8_t newData)
Rhyme 0:c9c9e362ec57 151 {
Rhyme 0:c9c9e362ec57 152 uint8_t data[2] ;
Rhyme 0:c9c9e362ec57 153 data[0] = REG_THR_PT ;
Rhyme 0:c9c9e362ec57 154 data[1] = newData ;
Rhyme 0:c9c9e362ec57 155 writeRegs(data, 2) ;
Rhyme 0:c9c9e362ec57 156 }
Rhyme 0:c9c9e362ec57 157
Rhyme 0:c9c9e362ec57 158 void MAX44000::getPRXTHR_IND(uint8_t *value)
Rhyme 0:c9c9e362ec57 159 {
Rhyme 0:c9c9e362ec57 160 uint8_t data ;
Rhyme 0:c9c9e362ec57 161 readRegs(REG_PRXTHR_IND, &data, 1) ;
Rhyme 0:c9c9e362ec57 162 *value = (data >> 6) & 0x01 ;
Rhyme 0:c9c9e362ec57 163 }
Rhyme 0:c9c9e362ec57 164
Rhyme 0:c9c9e362ec57 165 void MAX44000::setPRXTHR_IND(uint8_t newValue)
Rhyme 0:c9c9e362ec57 166 {
Rhyme 0:c9c9e362ec57 167 uint8_t data[2] ;
Rhyme 0:c9c9e362ec57 168 data[0] = REG_PRXTHR_IND ;
Rhyme 0:c9c9e362ec57 169 data[1] = (newValue & 0x01) << 6 ;
Rhyme 0:c9c9e362ec57 170 writeRegs(data, 2) ;
Rhyme 0:c9c9e362ec57 171 }
Rhyme 0:c9c9e362ec57 172
Rhyme 0:c9c9e362ec57 173 void MAX44000::getPRX_THR(uint8_t *data)
Rhyme 0:c9c9e362ec57 174 {
Rhyme 0:c9c9e362ec57 175 readRegs(REG_PRX_THR, data, 1) ;
Rhyme 0:c9c9e362ec57 176 }
Rhyme 0:c9c9e362ec57 177
Rhyme 0:c9c9e362ec57 178 void MAX44000::setPRX_THR(uint8_t newValue)
Rhyme 0:c9c9e362ec57 179 {
Rhyme 0:c9c9e362ec57 180 uint8_t data[2] ;
Rhyme 0:c9c9e362ec57 181 data[0] = REG_PRX_THR ;
Rhyme 0:c9c9e362ec57 182 data[1] = newValue ;
Rhyme 0:c9c9e362ec57 183 writeRegs(data, 2) ;
Rhyme 0:c9c9e362ec57 184 }
Rhyme 0:c9c9e362ec57 185
Rhyme 0:c9c9e362ec57 186 void MAX44000::getTRM_GAING(uint8_t *data)
Rhyme 0:c9c9e362ec57 187 {
Rhyme 0:c9c9e362ec57 188 readRegs(REG_TRM_GAING, data, 1) ;
Rhyme 0:c9c9e362ec57 189 }
Rhyme 0:c9c9e362ec57 190
Rhyme 0:c9c9e362ec57 191 void MAX44000::setTRM_GAING(uint8_t newValue)
Rhyme 0:c9c9e362ec57 192 {
Rhyme 0:c9c9e362ec57 193 uint8_t data[2] ;
Rhyme 0:c9c9e362ec57 194 data[0] = REG_TRM_GAING ;
Rhyme 0:c9c9e362ec57 195 data[1] = newValue ;
Rhyme 0:c9c9e362ec57 196 writeRegs(data, 2) ;
Rhyme 0:c9c9e362ec57 197 }
Rhyme 0:c9c9e362ec57 198
Rhyme 0:c9c9e362ec57 199 void MAX44000::getTRM_GAINIR(uint8_t *data)
Rhyme 0:c9c9e362ec57 200 {
Rhyme 0:c9c9e362ec57 201 readRegs(REG_TRM_GAINIR, data, 1) ;
Rhyme 0:c9c9e362ec57 202 }
Rhyme 0:c9c9e362ec57 203
Rhyme 0:c9c9e362ec57 204 void MAX44000::setTRM_GAINIR(uint8_t newValue)
Rhyme 0:c9c9e362ec57 205 {
Rhyme 0:c9c9e362ec57 206 uint8_t data[2] ;
Rhyme 0:c9c9e362ec57 207 data[0] = REG_TRM_GAINIR ;
Rhyme 0:c9c9e362ec57 208 data[1] = newValue ;
Rhyme 0:c9c9e362ec57 209 writeRegs(data, 2) ;
Rhyme 0:c9c9e362ec57 210 }