Takumi Toda / myS11059

Dependents:   2018_2400ROBO

Committer:
TakumiToda
Date:
Fri Jan 11 08:01:13 2019 +0000
Revision:
0:5842d74d28fb
S11059

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TakumiToda 0:5842d74d28fb 1 /*
TakumiToda 0:5842d74d28fb 2 * HAMAMATSU Color Senosr S11059
TakumiToda 0:5842d74d28fb 3 *
TakumiToda 0:5842d74d28fb 4 */
TakumiToda 0:5842d74d28fb 5 #include "mbed.h"
TakumiToda 0:5842d74d28fb 6 #include "S11059.h"
TakumiToda 0:5842d74d28fb 7
TakumiToda 0:5842d74d28fb 8 /* S11059 Register Address */
TakumiToda 0:5842d74d28fb 9 #define REG_CONTROL 0x00
TakumiToda 0:5842d74d28fb 10 #define REG_TIMING_DATA 0x01
TakumiToda 0:5842d74d28fb 11 #define REG_TIMING_MSB 0x01
TakumiToda 0:5842d74d28fb 12 #define REG_TIMING_LSB 0x02
TakumiToda 0:5842d74d28fb 13 #define REG_R_DATA 0x03
TakumiToda 0:5842d74d28fb 14 #define REG_R_MSB 0x03
TakumiToda 0:5842d74d28fb 15 #define REG_R_LSB 0x04
TakumiToda 0:5842d74d28fb 16 #define REG_G_DATA 0x05
TakumiToda 0:5842d74d28fb 17 #define REG_G_MSB 0x05
TakumiToda 0:5842d74d28fb 18 #define REG_G_LSB 0x06
TakumiToda 0:5842d74d28fb 19 #define REG_B_DATA 0x07
TakumiToda 0:5842d74d28fb 20 #define REG_B_MSB 0x07
TakumiToda 0:5842d74d28fb 21 #define REG_B_LSB 0x08
TakumiToda 0:5842d74d28fb 22 #define REG_IR_DATA 0x09
TakumiToda 0:5842d74d28fb 23 #define REG_IR_MSB 0x09
TakumiToda 0:5842d74d28fb 24 #define REG_IR_LSB 0x0A
TakumiToda 0:5842d74d28fb 25
TakumiToda 0:5842d74d28fb 26 /* register bits */
TakumiToda 0:5842d74d28fb 27 /* REG_CONTROL (00) */
TakumiToda 0:5842d74d28fb 28 // bit[7] ADC Reset 0:normal 1:reset
TakumiToda 0:5842d74d28fb 29 #define BIT_ADC_RESET 0x80
TakumiToda 0:5842d74d28fb 30 // bit[6] Sleep function 0:normal 1:standby
TakumiToda 0:5842d74d28fb 31 #define BIT_SLEEP_MODE 0x40
TakumiToda 0:5842d74d28fb 32 // bit[5] Sleeep function monitor bit
TakumiToda 0:5842d74d28fb 33 #define BIT_SLEEP_MONITOR 0x20
TakumiToda 0:5842d74d28fb 34 // bit[4] (reserved)
TakumiToda 0:5842d74d28fb 35 // bit[3] Gain select 0:Low Gain 1:High Gain
TakumiToda 0:5842d74d28fb 36 #define BIT_HIGH_GAIN 0x08
TakumiToda 0:5842d74d28fb 37 // bit[2] Ingegration mode 0:Fixed 1:Manual
TakumiToda 0:5842d74d28fb 38 #define BIT_INT_MANUAL 0x02
TakumiToda 0:5842d74d28fb 39 // bit[1:0] Integration Time
TakumiToda 0:5842d74d28fb 40 #define BIT_INT_LEN0 0x00 /* 87.5 us */
TakumiToda 0:5842d74d28fb 41 #define BIT_INT_LEN1 0x01 /* 1.4 ms */
TakumiToda 0:5842d74d28fb 42 #define BIT_INT_LEN2 0x02 /* 22.4 ms */
TakumiToda 0:5842d74d28fb 43 #define BIT_INT_LEN3 0x03 /* 179.2 ms */
TakumiToda 0:5842d74d28fb 44
TakumiToda 0:5842d74d28fb 45 /* constructor and destructor */
TakumiToda 0:5842d74d28fb 46
TakumiToda 0:5842d74d28fb 47 S11059::S11059(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) {
TakumiToda 0:5842d74d28fb 48 // activate the peripheral
TakumiToda 0:5842d74d28fb 49 }
TakumiToda 0:5842d74d28fb 50
TakumiToda 0:5842d74d28fb 51 S11059::~S11059() { }
TakumiToda 0:5842d74d28fb 52
TakumiToda 0:5842d74d28fb 53 float S11059::getR(void) // return float value of Red
TakumiToda 0:5842d74d28fb 54 {
TakumiToda 0:5842d74d28fb 55 uint16_t r_data ;
TakumiToda 0:5842d74d28fb 56 float data ;
TakumiToda 0:5842d74d28fb 57 getRData(&r_data) ;
TakumiToda 0:5842d74d28fb 58 data = (float)r_data / 65535.0 ;
TakumiToda 0:5842d74d28fb 59 return(data) ;
TakumiToda 0:5842d74d28fb 60 }
TakumiToda 0:5842d74d28fb 61
TakumiToda 0:5842d74d28fb 62 float S11059::getG(void) // return float value of Green
TakumiToda 0:5842d74d28fb 63 {
TakumiToda 0:5842d74d28fb 64 uint16_t g_data ;
TakumiToda 0:5842d74d28fb 65 float data ;
TakumiToda 0:5842d74d28fb 66 getGData(&g_data) ;
TakumiToda 0:5842d74d28fb 67 data = (float)g_data / 65535.0 ;
TakumiToda 0:5842d74d28fb 68 return(data) ;
TakumiToda 0:5842d74d28fb 69 }
TakumiToda 0:5842d74d28fb 70
TakumiToda 0:5842d74d28fb 71 float S11059::getB(void) // return float value of Blue
TakumiToda 0:5842d74d28fb 72 {
TakumiToda 0:5842d74d28fb 73 uint16_t b_data ;
TakumiToda 0:5842d74d28fb 74 float data ;
TakumiToda 0:5842d74d28fb 75 getBData(&b_data) ;
TakumiToda 0:5842d74d28fb 76 data = (float)b_data / 65535.0 ;
TakumiToda 0:5842d74d28fb 77 return(data) ;
TakumiToda 0:5842d74d28fb 78 }
TakumiToda 0:5842d74d28fb 79
TakumiToda 0:5842d74d28fb 80 float S11059::getIR(void) // return float value of Infrared
TakumiToda 0:5842d74d28fb 81 {
TakumiToda 0:5842d74d28fb 82 uint16_t ir_data ;
TakumiToda 0:5842d74d28fb 83 float data ;
TakumiToda 0:5842d74d28fb 84 getIRData(&ir_data) ;
TakumiToda 0:5842d74d28fb 85 data = (float)ir_data / 65535.0 ;
TakumiToda 0:5842d74d28fb 86 return(data) ;
TakumiToda 0:5842d74d28fb 87 }
TakumiToda 0:5842d74d28fb 88
TakumiToda 0:5842d74d28fb 89 void S11059::getRData(uint16_t *rdata)
TakumiToda 0:5842d74d28fb 90 {
TakumiToda 0:5842d74d28fb 91 uint8_t data[2] ;
TakumiToda 0:5842d74d28fb 92 readRegs(REG_R_DATA, data, 2) ;
TakumiToda 0:5842d74d28fb 93 *rdata = (data[0]<<8) | data[1] ;
TakumiToda 0:5842d74d28fb 94 }
TakumiToda 0:5842d74d28fb 95
TakumiToda 0:5842d74d28fb 96 void S11059::getGData(uint16_t *gdata)
TakumiToda 0:5842d74d28fb 97 {
TakumiToda 0:5842d74d28fb 98 uint8_t data[2] ;
TakumiToda 0:5842d74d28fb 99 readRegs(REG_G_DATA, data, 2) ;
TakumiToda 0:5842d74d28fb 100 *gdata = (data[0]<<8) | data[1] ;
TakumiToda 0:5842d74d28fb 101 }
TakumiToda 0:5842d74d28fb 102
TakumiToda 0:5842d74d28fb 103 void S11059::getBData(uint16_t *bdata)
TakumiToda 0:5842d74d28fb 104 {
TakumiToda 0:5842d74d28fb 105 uint8_t data[2] ;
TakumiToda 0:5842d74d28fb 106 readRegs(REG_B_DATA, data, 2) ;
TakumiToda 0:5842d74d28fb 107 *bdata = (data[0]<<8) | data[1] ;
TakumiToda 0:5842d74d28fb 108 }
TakumiToda 0:5842d74d28fb 109
TakumiToda 0:5842d74d28fb 110 void S11059::getIRData(uint16_t *irdata)
TakumiToda 0:5842d74d28fb 111 {
TakumiToda 0:5842d74d28fb 112 uint8_t data[2] ;
TakumiToda 0:5842d74d28fb 113 readRegs(REG_IR_DATA, data, 2) ;
TakumiToda 0:5842d74d28fb 114 *irdata = (data[0]<<8) | data[1] ;
TakumiToda 0:5842d74d28fb 115 }
TakumiToda 0:5842d74d28fb 116
TakumiToda 0:5842d74d28fb 117 void S11059::getAllData(uint16_t *data)
TakumiToda 0:5842d74d28fb 118 {
TakumiToda 0:5842d74d28fb 119 uint8_t raw_data[8] ;
TakumiToda 0:5842d74d28fb 120 readRegs(REG_R_DATA, raw_data, 8) ;
TakumiToda 0:5842d74d28fb 121 data[0] = (raw_data[0] << 8) | raw_data[1] ;
TakumiToda 0:5842d74d28fb 122 data[1] = (raw_data[2] << 8) | raw_data[3] ;
TakumiToda 0:5842d74d28fb 123 data[2] = (raw_data[4] << 8) | raw_data[5] ;
TakumiToda 0:5842d74d28fb 124 data[3] = (raw_data[6] << 8) | raw_data[7] ;
TakumiToda 0:5842d74d28fb 125 }
TakumiToda 0:5842d74d28fb 126
TakumiToda 0:5842d74d28fb 127 uint8_t S11059::getControl(void)
TakumiToda 0:5842d74d28fb 128 {
TakumiToda 0:5842d74d28fb 129 uint8_t data[1] ;
TakumiToda 0:5842d74d28fb 130 readRegs(REG_CONTROL, data, 1) ;
TakumiToda 0:5842d74d28fb 131 return(data[0]) ;
TakumiToda 0:5842d74d28fb 132 }
TakumiToda 0:5842d74d28fb 133
TakumiToda 0:5842d74d28fb 134 void S11059::setControl(uint8_t ctrlValue)
TakumiToda 0:5842d74d28fb 135 {
TakumiToda 0:5842d74d28fb 136 uint8_t data[2] ;
TakumiToda 0:5842d74d28fb 137 data[0] = REG_CONTROL ;
TakumiToda 0:5842d74d28fb 138 data[1] = ctrlValue ;
TakumiToda 0:5842d74d28fb 139 writeRegs(data, 2) ;
TakumiToda 0:5842d74d28fb 140 }
TakumiToda 0:5842d74d28fb 141
TakumiToda 0:5842d74d28fb 142 uint16_t S11059::getTiming(void)
TakumiToda 0:5842d74d28fb 143 {
TakumiToda 0:5842d74d28fb 144 uint8_t data[2] ;
TakumiToda 0:5842d74d28fb 145 uint16_t timing ;
TakumiToda 0:5842d74d28fb 146 readRegs(REG_TIMING_DATA, data, 2) ;
TakumiToda 0:5842d74d28fb 147 timing = (data[0] << 8) | data[1] ;
TakumiToda 0:5842d74d28fb 148 return(timing) ;
TakumiToda 0:5842d74d28fb 149 }
TakumiToda 0:5842d74d28fb 150
TakumiToda 0:5842d74d28fb 151 void S11059::setTiming(uint16_t timingValue)
TakumiToda 0:5842d74d28fb 152 {
TakumiToda 0:5842d74d28fb 153 uint8_t data[3] ;
TakumiToda 0:5842d74d28fb 154 data[0] = REG_TIMING_DATA ;
TakumiToda 0:5842d74d28fb 155 data[1] = (timingValue >> 8) & 0xFF ;
TakumiToda 0:5842d74d28fb 156 data[2] = timingValue & 0xFF ;
TakumiToda 0:5842d74d28fb 157 writeRegs(data, 3) ;
TakumiToda 0:5842d74d28fb 158 }
TakumiToda 0:5842d74d28fb 159
TakumiToda 0:5842d74d28fb 160 void S11059::setADCReset(int mode)
TakumiToda 0:5842d74d28fb 161 {
TakumiToda 0:5842d74d28fb 162 uint8_t data[2] ;
TakumiToda 0:5842d74d28fb 163 data[0] = REG_CONTROL ;
TakumiToda 0:5842d74d28fb 164 readRegs(data[0], &data[1], 1) ;
TakumiToda 0:5842d74d28fb 165 if (mode == 0) {
TakumiToda 0:5842d74d28fb 166 data[1] ^= BIT_ADC_RESET ;
TakumiToda 0:5842d74d28fb 167 } else {
TakumiToda 0:5842d74d28fb 168 data[1] |= BIT_ADC_RESET ; /* 0x80 */
TakumiToda 0:5842d74d28fb 169 }
TakumiToda 0:5842d74d28fb 170 writeRegs(data, 2) ;
TakumiToda 0:5842d74d28fb 171 }
TakumiToda 0:5842d74d28fb 172
TakumiToda 0:5842d74d28fb 173 int S11059::getADCReset(void)
TakumiToda 0:5842d74d28fb 174 {
TakumiToda 0:5842d74d28fb 175 uint8_t data[1] ;
TakumiToda 0:5842d74d28fb 176 int result = 0 ;
TakumiToda 0:5842d74d28fb 177 readRegs(REG_CONTROL, data, 1) ;
TakumiToda 0:5842d74d28fb 178 if (data[0] & BIT_ADC_RESET) {
TakumiToda 0:5842d74d28fb 179 result = 1 ;
TakumiToda 0:5842d74d28fb 180 }
TakumiToda 0:5842d74d28fb 181 return(result) ;
TakumiToda 0:5842d74d28fb 182 }
TakumiToda 0:5842d74d28fb 183
TakumiToda 0:5842d74d28fb 184 void S11059::setSleepMode(int mode)
TakumiToda 0:5842d74d28fb 185 {
TakumiToda 0:5842d74d28fb 186 uint8_t data[2] ;
TakumiToda 0:5842d74d28fb 187 data[0] = REG_CONTROL ;
TakumiToda 0:5842d74d28fb 188 readRegs(data[0], &data[1], 1) ;
TakumiToda 0:5842d74d28fb 189 if (mode == 0) {
TakumiToda 0:5842d74d28fb 190 data[1] ^= BIT_SLEEP_MODE ;
TakumiToda 0:5842d74d28fb 191 } else {
TakumiToda 0:5842d74d28fb 192 data[1] |= BIT_SLEEP_MODE ;
TakumiToda 0:5842d74d28fb 193 }
TakumiToda 0:5842d74d28fb 194 writeRegs(data, 2) ;
TakumiToda 0:5842d74d28fb 195 }
TakumiToda 0:5842d74d28fb 196
TakumiToda 0:5842d74d28fb 197 int S11059::getSleepMode(void)
TakumiToda 0:5842d74d28fb 198 {
TakumiToda 0:5842d74d28fb 199 uint8_t data[1] ;
TakumiToda 0:5842d74d28fb 200 int result = 0 ;
TakumiToda 0:5842d74d28fb 201 readRegs(REG_CONTROL, data, 1) ;
TakumiToda 0:5842d74d28fb 202 if (data[0] & BIT_SLEEP_MODE) {
TakumiToda 0:5842d74d28fb 203 result = 1 ;
TakumiToda 0:5842d74d28fb 204 }
TakumiToda 0:5842d74d28fb 205 return(result) ;
TakumiToda 0:5842d74d28fb 206 }
TakumiToda 0:5842d74d28fb 207
TakumiToda 0:5842d74d28fb 208 void S11059::setGain(int mode)
TakumiToda 0:5842d74d28fb 209 {
TakumiToda 0:5842d74d28fb 210 uint8_t data[2] ;
TakumiToda 0:5842d74d28fb 211 data[0] = REG_CONTROL ;
TakumiToda 0:5842d74d28fb 212 readRegs(data[0], &data[1], 1) ;
TakumiToda 0:5842d74d28fb 213 if (mode == 0) {
TakumiToda 0:5842d74d28fb 214 data[1] ^= BIT_HIGH_GAIN ;
TakumiToda 0:5842d74d28fb 215 } else {
TakumiToda 0:5842d74d28fb 216 data[1] |= BIT_HIGH_GAIN ;
TakumiToda 0:5842d74d28fb 217 }
TakumiToda 0:5842d74d28fb 218 }
TakumiToda 0:5842d74d28fb 219
TakumiToda 0:5842d74d28fb 220 int S11059::getGain(void)
TakumiToda 0:5842d74d28fb 221 {
TakumiToda 0:5842d74d28fb 222 uint8_t data[1] ;
TakumiToda 0:5842d74d28fb 223 int result = 0 ;
TakumiToda 0:5842d74d28fb 224 readRegs(REG_CONTROL, data, 1) ;
TakumiToda 0:5842d74d28fb 225 if (data[0] & BIT_HIGH_GAIN) {
TakumiToda 0:5842d74d28fb 226 result = 1 ;
TakumiToda 0:5842d74d28fb 227 }
TakumiToda 0:5842d74d28fb 228 return(result) ;
TakumiToda 0:5842d74d28fb 229 }
TakumiToda 0:5842d74d28fb 230
TakumiToda 0:5842d74d28fb 231 void S11059::setIntegralMode(int mode)
TakumiToda 0:5842d74d28fb 232 {
TakumiToda 0:5842d74d28fb 233 uint8_t data[2] ;
TakumiToda 0:5842d74d28fb 234 data[0] = REG_CONTROL ;
TakumiToda 0:5842d74d28fb 235 readRegs(data[0], &data[1], 1) ;
TakumiToda 0:5842d74d28fb 236 if (mode == 0) {
TakumiToda 0:5842d74d28fb 237 data[1] ^= BIT_INT_MANUAL ;
TakumiToda 0:5842d74d28fb 238 } else {
TakumiToda 0:5842d74d28fb 239 data[1] |= BIT_INT_MANUAL ;
TakumiToda 0:5842d74d28fb 240 }
TakumiToda 0:5842d74d28fb 241 }
TakumiToda 0:5842d74d28fb 242
TakumiToda 0:5842d74d28fb 243 int S11059::getIntegralMode(void)
TakumiToda 0:5842d74d28fb 244 {
TakumiToda 0:5842d74d28fb 245 uint8_t data[1] ;
TakumiToda 0:5842d74d28fb 246 int result = 0 ;
TakumiToda 0:5842d74d28fb 247 readRegs(REG_CONTROL, data, 1) ;
TakumiToda 0:5842d74d28fb 248 if (data[0] & BIT_INT_MANUAL) {
TakumiToda 0:5842d74d28fb 249 result = 1 ;
TakumiToda 0:5842d74d28fb 250 }
TakumiToda 0:5842d74d28fb 251 return(result) ;
TakumiToda 0:5842d74d28fb 252 }
TakumiToda 0:5842d74d28fb 253
TakumiToda 0:5842d74d28fb 254 void S11059::readRegs(int addr, uint8_t * data, int len) {
TakumiToda 0:5842d74d28fb 255 char t[1] = {addr};
TakumiToda 0:5842d74d28fb 256 m_i2c.write(m_addr, t, 1, true);
TakumiToda 0:5842d74d28fb 257 m_i2c.read(m_addr, (char *)data, len);
TakumiToda 0:5842d74d28fb 258 }
TakumiToda 0:5842d74d28fb 259
TakumiToda 0:5842d74d28fb 260 void S11059::writeRegs(uint8_t * data, int len) {
TakumiToda 0:5842d74d28fb 261 m_i2c.write(m_addr, (char *)data, len);
TakumiToda 0:5842d74d28fb 262 }