1/27/16 updated JJ
Embed:
(wiki syntax)
Show/hide line numbers
vl6180x.cpp
00001 #include "vl6180x.h" 00002 #include "mbed.h" 00003 00004 VL6180x::VL6180x(I2C &_i2c, char _address): i2c(_i2c), address(_address) 00005 { 00006 address = I2C_SLAVE_DEFAULT_ADDRESS; 00007 } 00008 00009 VL6180x::VL6180x(PinName sda, PinName scl, char _address): i2c(sda, scl), address(_address) 00010 { 00011 i2c.frequency(400000); 00012 address = I2C_SLAVE_DEFAULT_ADDRESS; 00013 } 00014 00015 void VL6180x::initialize() 00016 { 00017 00018 // Mandatory : private registers 00019 setRegister(0x0207, 0x01); 00020 setRegister(0x0208, 0x01); 00021 setRegister(0x0096, 0x00); 00022 setRegister(0x0097, 0xfd); 00023 setRegister(0x00e3, 0x00); 00024 setRegister(0x00e4, 0x04); 00025 setRegister(0x00e5, 0x02); 00026 setRegister(0x00e6, 0x01); 00027 setRegister(0x00e7, 0x03); 00028 setRegister(0x00f5, 0x02); 00029 setRegister(0x00d9, 0x05); 00030 setRegister(0x00db, 0xce); 00031 setRegister(0x00dc, 0x03); 00032 setRegister(0x00dd, 0xf8); 00033 setRegister(0x009f, 0x00); 00034 setRegister(0x00a3, 0x3c); 00035 setRegister(0x00b7, 0x00); 00036 setRegister(0x00bb, 0x3c); 00037 setRegister(0x00b2, 0x09); 00038 setRegister(0x00ca, 0x09); 00039 setRegister(0x0198, 0x01); 00040 setRegister(0x01b0, 0x17); 00041 setRegister(0x01ad, 0x00); 00042 setRegister(0x00ff, 0x05); 00043 setRegister(0x0100, 0x05); 00044 setRegister(0x0199, 0x05); 00045 setRegister(0x01a6, 0x1b); 00046 setRegister(0x01ac, 0x3e); 00047 setRegister(0x01a7, 0x1f); 00048 setRegister(0x0030, 0x00); 00049 00050 // Recommended : Public registers - See data sheet for more detail 00051 setRegister(SYSTEM_MODE_GPIO1, 0x10); // Enables polling for ‘New Sample ready’ 00052 // when measurement completes 00053 setRegister(READOUT_AVERAGING_SAMPLE_PERIOD, 0x30); // Set the averaging sample period 00054 // (compromise between lower noise and 00055 // increased execution time) 00056 setRegister(SYSALS_ANALOGUE_GAIN, 0x46); // Sets the light and dark gain (upper 00057 // nibble). Dark gain should not be 00058 // changed. 00059 setRegister(SYSRANGE_VHV_REPEAT_RATE, 0xFF); // sets the # of range measurements after 00060 // which auto calibration of system is 00061 // performed 00062 setRegister(SYSALS_INTEGRATION_PERIOD, 0x63); // Set ALS integration time to 100ms 00063 setRegister(SYSRANGE_VHV_RECALIBRATE, 0x01); // perform a single temperature calibration 00064 // of the ranging sensor 00065 00066 00067 setRegister(SYSRANGE_INTERMEASUREMENT_PERIOD, 0x09); // Set default ranging inter-measurement 00068 // period to 100ms 00069 setRegister(SYSALS_INTERMEASUREMENT_PERIOD, 0x31); // Set default ALS inter-measurement period 00070 // to 500ms 00071 setRegister(SYSTEM_INTERRUPT_CONFIG_GPIO, 0x24); // Configures interrupt on ‘New Sample 00072 // Ready threshold event’ 00073 } 00074 00075 void VL6180x::startContinuousOperation() 00076 { 00077 setRegister(SYSRANGE_START, 0x03); 00078 00079 } 00080 00081 int VL6180x::getDistance() 00082 { 00083 int distance = 0; 00084 // should test bit 2 of RESULT_INTERRUPT_STATUS_GPIO ? 00085 distance = getRegister(RESULT_RANGE_VAL); 00086 // should clear interrupt ? 00087 return distance; 00088 } 00089 00090 int VL6180x::getSingleDistance() 00091 { 00092 int distance = 0; 00093 while(getRegister(RESULT_RANGE_STATUS) & 0x01 != 0x01); 00094 setRegister(SYSRANGE_START, 0x01); // start measurement 00095 while(getRegister(RESULT_INTERRUPT_STATUS_GPIO) & 0x04 != 0x04); 00096 distance = getRegister(RESULT_RANGE_VAL); 00097 setRegister(SYSTEM_INTERRUPT_CLEAR, 0x07); 00098 return distance; 00099 } 00100 00101 float VL6180x::getAmbientLight() 00102 { 00103 return 0.0f; 00104 } 00105 00106 void VL6180x::setRegister(int reg, int value) 00107 { 00108 char data_write[3]; 00109 data_write[0] = ((reg &0xff00 ) >> 8); 00110 data_write[1] = (reg &0x00ff ); 00111 data_write[2] = value; 00112 i2c.write(address, data_write, 3); 00113 } 00114 00115 int VL6180x::getRegister(int reg) 00116 { 00117 char data_write[2]; 00118 char data_read[1]; 00119 data_write[0] = ((reg &0xff00 ) >> 8); 00120 data_write[1] = (reg &0x00ff ) ; 00121 00122 i2c.write(address, data_write, 2, 1); //no stop 00123 i2c.read(address, data_read, 1, 0); 00124 00125 return data_read[0]; 00126 } 00127 00128 VL6180x::Identification VL6180x::getIdentification() 00129 { 00130 00131 char data_write[2]; 00132 char data_read[10]; 00133 data_write[0] = ( (0x00 &0xff00 ) >> 8); 00134 data_write[1] = (0x00 &0x00ff ) ; 00135 00136 i2c.write(address, data_write, 2, 1); //no stop 00137 i2c.read(address, data_read, 10, 0); 00138 00139 Identification id; 00140 id.model = data_read[0]; 00141 id.modelRevMajor = data_read[1]; 00142 id.modelRevMinor = data_read[2]; 00143 id.moduleRevMajor = data_read[3]; 00144 id.moduleRevMinor = data_read[4]; 00145 id.date = data_read[6] << 8 | data_read[7]; 00146 id.time = data_read[8] << 8 | data_read[9]; 00147 return id; 00148 } 00149 00150 void VL6180x::printIdentification(VL6180x::Identification id) 00151 { 00152 printf("VL6180x Identification:\r\n"); 00153 printf("Model id: 0x%02X\r\n", id.model); 00154 printf("Model rev: %d.%d\r\n", id.modelRevMajor, id.modelRevMinor); 00155 printf("Module rev: %d.%d\r\n", id.moduleRevMajor, id.modelRevMajor); 00156 printf("Date: %04d-%02d-%02d (%d)\r\n", ((id.date >> 12) & 0x0F) + 2010, (id.date >> 8) & 0x0F, (id.date >> 3) & 0x1F, id.date & 0x07); 00157 printf("Time: %02d:%02d:%02d\r\n", (id.time / 60*60) % 24, (id.time / 60) % 60, id.time % 60); 00158 } 00159 00160 void VL6180x::setAddress(int address) 00161 { 00162 char data[3]; 00163 data[0] = I2C_SLAVE_DEVICE_ADDRESS / 256; 00164 data[1] = I2C_SLAVE_DEVICE_ADDRESS % 256; 00165 data[2] = address >> 1; 00166 i2c.write(address, data, 3); //no stop 00167 }
Generated on Sun Jul 17 2022 12:11:35 by 1.7.2