VEML7700 High Accuracy Ambient Light Sensor with I2C Interface

Dependents:   testVEML7700 ROS_VEML7700_test ROSSerial_MultipleSensors

Committer:
Rhyme
Date:
Fri May 19 06:18:33 2017 +0000
Revision:
3:67634e08150f
Parent:
1:b64609747bc3
comment for higher bits of config register added

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:6dabb0ddf3d9 1 #include "mbed.h"
Rhyme 0:6dabb0ddf3d9 2 #include "VEML7700.h"
Rhyme 0:6dabb0ddf3d9 3
Rhyme 0:6dabb0ddf3d9 4 /* COMMAND REGISTER FORMAT */
Rhyme 0:6dabb0ddf3d9 5 #define CMD_ALS_CONF 0x00
Rhyme 0:6dabb0ddf3d9 6 #define CMD_ALS_WH 0x01
Rhyme 0:6dabb0ddf3d9 7 #define CMD_ALS_WL 0x02
Rhyme 0:6dabb0ddf3d9 8 #define CMD_PWR_SAVINGS 0x03
Rhyme 0:6dabb0ddf3d9 9 #define CMD_ALS 0x04
Rhyme 0:6dabb0ddf3d9 10 #define CMD_WHITE 0x05
Rhyme 0:6dabb0ddf3d9 11 #define CMD_ASL_INT 0x06
Rhyme 0:6dabb0ddf3d9 12
Rhyme 0:6dabb0ddf3d9 13 /* Configuration Register #0 (REG_ALS_CONF)
Rhyme 0:6dabb0ddf3d9 14 bit[15:13] (reserved)
Rhyme 0:6dabb0ddf3d9 15 Set 000b
Rhyme 0:6dabb0ddf3d9 16
Rhyme 0:6dabb0ddf3d9 17 bit[12:11] ALS_GAIN Gain Selection
Rhyme 0:6dabb0ddf3d9 18 00 = ALS gain x 1
Rhyme 0:6dabb0ddf3d9 19 01 = ALS gain x 2
Rhyme 0:6dabb0ddf3d9 20 10 = ALS gain x (1/8)
Rhyme 0:6dabb0ddf3d9 21 11 = ALS gain x (1/4)
Rhyme 0:6dabb0ddf3d9 22
Rhyme 0:6dabb0ddf3d9 23 bit[10] (reserved)
Rhyme 0:6dabb0ddf3d9 24 set 00b
Rhyme 0:6dabb0ddf3d9 25
Rhyme 0:6dabb0ddf3d9 26 bit[9:6] ALS_IT ALS integration time settings
Rhyme 0:6dabb0ddf3d9 27 1100 = 2 5ms
Rhyme 0:6dabb0ddf3d9 28 1000 = 50 ms
Rhyme 0:6dabb0ddf3d9 29 0000 = 100 ms
Rhyme 0:6dabb0ddf3d9 30 0001 = 200 ms
Rhyme 0:6dabb0ddf3d9 31 0010 = 400 ms
Rhyme 0:6dabb0ddf3d9 32 0011 = 800 ms
Rhyme 0:6dabb0ddf3d9 33
Rhyme 0:6dabb0ddf3d9 34 bit[5:4] ALS_PERS ALS Persistence protect number setting
Rhyme 0:6dabb0ddf3d9 35 00 = 1
Rhyme 0:6dabb0ddf3d9 36 01 = 2
Rhyme 0:6dabb0ddf3d9 37 10 = 4
Rhyme 0:6dabb0ddf3d9 38 11 = 8
Rhyme 0:6dabb0ddf3d9 39
Rhyme 0:6dabb0ddf3d9 40 bit[3:2] (reserved)
Rhyme 0:6dabb0ddf3d9 41 Set 00b
Rhyme 0:6dabb0ddf3d9 42
Rhyme 0:6dabb0ddf3d9 43 bit[1] ALS_INT_EN ALS interrupt enable setting
Rhyme 0:6dabb0ddf3d9 44 0 = ALS INT disable
Rhyme 0:6dabb0ddf3d9 45 1 = ALS INT enable
Rhyme 0:6dabb0ddf3d9 46
Rhyme 0:6dabb0ddf3d9 47 bit[0] ALS_SD ALS shut down setting
Rhyme 0:6dabb0ddf3d9 48 0 = ALS power on
Rhyme 0:6dabb0ddf3d9 49 1 = ALS shut down
Rhyme 0:6dabb0ddf3d9 50 */
Rhyme 0:6dabb0ddf3d9 51
Rhyme 0:6dabb0ddf3d9 52 /* High Threshold Windows Setting #1
Rhyme 0:6dabb0ddf3d9 53 bit[15:8] ALS high threshold window setting (15:8 MSB 8 bits of whole 16 bits)
Rhyme 0:6dabb0ddf3d9 54 bit[7:0] ALS high threshold window setting (7:0 LSB 8 bits of whole 16 bits)
Rhyme 0:6dabb0ddf3d9 55 */
Rhyme 0:6dabb0ddf3d9 56
Rhyme 0:6dabb0ddf3d9 57 /* Low Threshold WIndows Setting #2
Rhyme 0:6dabb0ddf3d9 58 bit[15:8] ALS Low threshold window setting (15:8 MSB 8 bits of whole 16 bits)
Rhyme 0:6dabb0ddf3d9 59 bit[7:0] ALS Low threshold window setting (7:0 LSB 8 bits of whole 16 bits)
Rhyme 0:6dabb0ddf3d9 60 */
Rhyme 0:6dabb0ddf3d9 61
Rhyme 0:6dabb0ddf3d9 62 /* Power Saving Mode
Rhyme 0:6dabb0ddf3d9 63 bit[15:3] (reserved)
Rhyme 0:6dabb0ddf3d9 64 bit[2:1] PSM Power saving mode; see table "Refresh time"
Rhyme 0:6dabb0ddf3d9 65 */
Rhyme 0:6dabb0ddf3d9 66
Rhyme 0:6dabb0ddf3d9 67 /* ALS High Resolution Output data #4
Rhyme 0:6dabb0ddf3d9 68 bit[15:8] ALS high resolution output data (15:8 MSB 8 bits of whole 16 bits)
Rhyme 0:6dabb0ddf3d9 69 bit[7:0] ALS high resolution output data (7:0 LSB 8 bits of whole 16 bits)
Rhyme 0:6dabb0ddf3d9 70 */
Rhyme 0:6dabb0ddf3d9 71
Rhyme 0:6dabb0ddf3d9 72 /* WHITE Channel Output data #5
Rhyme 0:6dabb0ddf3d9 73 bit[15:8] WHITE output data (15:8 MSB 8 bits of whole 16 bits)
Rhyme 0:6dabb0ddf3d9 74 bit[7:0] WHITE output data (7:0 MSB 8 bits of whole 16 bits)
Rhyme 0:6dabb0ddf3d9 75 */
Rhyme 0:6dabb0ddf3d9 76
Rhyme 0:6dabb0ddf3d9 77 /* Interrupt status #6
Rhyme 0:6dabb0ddf3d9 78 bit[15] int_th_low Read bit. Indicate a low threshold exceed.
Rhyme 0:6dabb0ddf3d9 79 bit[14] int_th_high Read bit. Indicate a high threshold exceed.
Rhyme 0:6dabb0ddf3d9 80 bit[13:0] (reserved)
Rhyme 0:6dabb0ddf3d9 81 */
Rhyme 0:6dabb0ddf3d9 82
Rhyme 0:6dabb0ddf3d9 83 void VEML7700::setALSConf(uint16_t conf)
Rhyme 0:6dabb0ddf3d9 84 {
Rhyme 0:6dabb0ddf3d9 85 uint8_t data[3] ;
Rhyme 0:6dabb0ddf3d9 86 data[0] = CMD_ALS_CONF ;
Rhyme 1:b64609747bc3 87 data[1] = conf & 0xFF ;
Rhyme 1:b64609747bc3 88 data[2] = (conf >> 8) & 0xFF ;
Rhyme 0:6dabb0ddf3d9 89 writeRegs(data, 3) ;
Rhyme 0:6dabb0ddf3d9 90 }
Rhyme 0:6dabb0ddf3d9 91
Rhyme 0:6dabb0ddf3d9 92 void VEML7700::setALS_WH(uint16_t wh)
Rhyme 0:6dabb0ddf3d9 93 {
Rhyme 0:6dabb0ddf3d9 94 uint8_t data[3] ;
Rhyme 0:6dabb0ddf3d9 95 data[0] = CMD_ALS_WH ;
Rhyme 1:b64609747bc3 96 data[1] = wh & 0xFF ;
Rhyme 1:b64609747bc3 97 data[2] = (wh >> 8) & 0xFF ;
Rhyme 0:6dabb0ddf3d9 98 writeRegs(data, 3) ;
Rhyme 0:6dabb0ddf3d9 99 }
Rhyme 0:6dabb0ddf3d9 100
Rhyme 0:6dabb0ddf3d9 101 void VEML7700::setALS_WL(uint16_t wl)
Rhyme 0:6dabb0ddf3d9 102 {
Rhyme 0:6dabb0ddf3d9 103 uint8_t data[3] ;
Rhyme 0:6dabb0ddf3d9 104 data[0] = CMD_ALS_WL ;
Rhyme 1:b64609747bc3 105 data[1] = wl & 0xFF ;
Rhyme 1:b64609747bc3 106 data[2] = (wl >> 8) & 0xFF ;
Rhyme 0:6dabb0ddf3d9 107 writeRegs(data, 3) ;
Rhyme 0:6dabb0ddf3d9 108 }
Rhyme 0:6dabb0ddf3d9 109
Rhyme 0:6dabb0ddf3d9 110 void VEML7700::setPowerSaving(uint16_t ps)
Rhyme 0:6dabb0ddf3d9 111 {
Rhyme 0:6dabb0ddf3d9 112 uint8_t data[3] ;
Rhyme 0:6dabb0ddf3d9 113 data[0] = CMD_PWR_SAVINGS ;
Rhyme 1:b64609747bc3 114 data[1] = ps & 0xFF ;
Rhyme 1:b64609747bc3 115 data[2] = (ps >> 8) & 0xFF ;
Rhyme 0:6dabb0ddf3d9 116 writeRegs(data, 3) ;
Rhyme 0:6dabb0ddf3d9 117 }
Rhyme 0:6dabb0ddf3d9 118
Rhyme 0:6dabb0ddf3d9 119 uint16_t VEML7700::getALS(void)
Rhyme 0:6dabb0ddf3d9 120 {
Rhyme 0:6dabb0ddf3d9 121 uint16_t als = 0 ;
Rhyme 0:6dabb0ddf3d9 122 uint8_t cmd = CMD_ALS ;
Rhyme 0:6dabb0ddf3d9 123 uint8_t data[2] ;
Rhyme 0:6dabb0ddf3d9 124 readRegs(cmd, data, 2) ;
Rhyme 1:b64609747bc3 125 als = (data[1] << 8) | data[0] ;
Rhyme 0:6dabb0ddf3d9 126 return( als ) ;
Rhyme 0:6dabb0ddf3d9 127 }
Rhyme 0:6dabb0ddf3d9 128
Rhyme 0:6dabb0ddf3d9 129 uint16_t VEML7700::getWHITE(void)
Rhyme 0:6dabb0ddf3d9 130 {
Rhyme 0:6dabb0ddf3d9 131 uint16_t white = 0 ;
Rhyme 0:6dabb0ddf3d9 132 uint8_t cmd = CMD_WHITE ;
Rhyme 0:6dabb0ddf3d9 133 uint8_t data[2] ;
Rhyme 0:6dabb0ddf3d9 134 readRegs(cmd, data, 2) ;
Rhyme 1:b64609747bc3 135 white = (data[1] << 8) | data[0] ;
Rhyme 0:6dabb0ddf3d9 136 return( white ) ;
Rhyme 0:6dabb0ddf3d9 137 }
Rhyme 0:6dabb0ddf3d9 138
Rhyme 0:6dabb0ddf3d9 139 uint16_t VEML7700::getALS_INT(void)
Rhyme 0:6dabb0ddf3d9 140 {
Rhyme 0:6dabb0ddf3d9 141 uint16_t als_int = 0 ;
Rhyme 0:6dabb0ddf3d9 142 uint8_t cmd = CMD_ASL_INT ;
Rhyme 0:6dabb0ddf3d9 143 uint8_t data[2] ;
Rhyme 0:6dabb0ddf3d9 144 readRegs(cmd, data, 2) ;
Rhyme 1:b64609747bc3 145 als_int = (data[1] << 8) | data[0] ;
Rhyme 0:6dabb0ddf3d9 146 return( als_int ) ;
Rhyme 0:6dabb0ddf3d9 147 }
Rhyme 0:6dabb0ddf3d9 148
Rhyme 0:6dabb0ddf3d9 149 VEML7700::VEML7700(PinName sda, PinName scl, int addr) :
Rhyme 0:6dabb0ddf3d9 150 m_i2c(sda, scl), m_addr(addr<<1)
Rhyme 0:6dabb0ddf3d9 151 {
Rhyme 0:6dabb0ddf3d9 152 // activate the peripheral
Rhyme 0:6dabb0ddf3d9 153 }
Rhyme 0:6dabb0ddf3d9 154
Rhyme 0:6dabb0ddf3d9 155
Rhyme 0:6dabb0ddf3d9 156 VEML7700::~VEML7700()
Rhyme 0:6dabb0ddf3d9 157 {
Rhyme 0:6dabb0ddf3d9 158 }
Rhyme 0:6dabb0ddf3d9 159
Rhyme 0:6dabb0ddf3d9 160 void VEML7700::readRegs(int addr, uint8_t * data, int len) {
Rhyme 0:6dabb0ddf3d9 161 char t[1] = {addr};
Rhyme 0:6dabb0ddf3d9 162 m_i2c.write(m_addr, t, 1, true);
Rhyme 0:6dabb0ddf3d9 163 m_i2c.read(m_addr, (char *)data, len);
Rhyme 0:6dabb0ddf3d9 164 }
Rhyme 0:6dabb0ddf3d9 165
Rhyme 0:6dabb0ddf3d9 166 void VEML7700::writeRegs(uint8_t * data, int len) {
Rhyme 0:6dabb0ddf3d9 167 m_i2c.write(m_addr, (char *)data, len);
Rhyme 0:6dabb0ddf3d9 168 }