/* * vl6180x.c * * Created on: 03.01.2022 * Author: Sasch */ #include "main.h" #include "i2c.h" #include "timer.h" #include "vl6180x.h" void VL6180x_init(I2C_TypeDef* I2C_Port,uint8_t Adresse) { VL6180x_writetRegister(I2C_Port,Adresse, VL6180X_SYSTEM_FRESH_OUT_OF_RESET, 0x00); delay_ms(10); // SR03 empfohlenen Einstellungen aus AN4545 VL6180x_writetRegister(I2C_Port,Adresse,0x0207, 0x01); delay_ms(10); VL6180x_writetRegister(I2C_Port,Adresse,0x0208, 0x01); delay_ms(10); VL6180x_writetRegister(I2C_Port,Adresse, 0x0096, 0x00); VL6180x_writetRegister(I2C_Port,Adresse, 0x0097, 0xfd); VL6180x_writetRegister(I2C_Port,Adresse, 0x00e3, 0x00);//0x01 VL6180x_writetRegister(I2C_Port,Adresse, 0x00e4, 0x04);//0x03 VL6180x_writetRegister(I2C_Port,Adresse, 0x00e5, 0x02); VL6180x_writetRegister(I2C_Port,Adresse, 0x00e6, 0x01); VL6180x_writetRegister(I2C_Port,Adresse, 0x00e7, 0x03); VL6180x_writetRegister(I2C_Port,Adresse, 0x00f5, 0x02); VL6180x_writetRegister(I2C_Port,Adresse, 0x00d9, 0x05); VL6180x_writetRegister(I2C_Port,Adresse, 0x00db, 0xce); VL6180x_writetRegister(I2C_Port,Adresse, 0x00dc, 0x03); VL6180x_writetRegister(I2C_Port,Adresse, 0x00dd, 0xf8); VL6180x_writetRegister(I2C_Port,Adresse, 0x009f, 0x00); VL6180x_writetRegister(I2C_Port,Adresse, 0x00a3, 0x3c); VL6180x_writetRegister(I2C_Port,Adresse, 0x00b7, 0x00); VL6180x_writetRegister(I2C_Port,Adresse, 0x00bb, 0x3c); VL6180x_writetRegister(I2C_Port,Adresse, 0x00b2, 0x09); VL6180x_writetRegister(I2C_Port,Adresse, 0x00ca, 0x09); VL6180x_writetRegister(I2C_Port,Adresse, 0x0198, 0x01); VL6180x_writetRegister(I2C_Port,Adresse, 0x01b0, 0x17); VL6180x_writetRegister(I2C_Port,Adresse, 0x01ad, 0x00); VL6180x_writetRegister(I2C_Port,Adresse, 0x00ff, 0x05); VL6180x_writetRegister(I2C_Port,Adresse, 0x0100, 0x05); VL6180x_writetRegister(I2C_Port,Adresse, 0x0199, 0x05); VL6180x_writetRegister(I2C_Port,Adresse, 0x01a6, 0x1b); VL6180x_writetRegister(I2C_Port,Adresse, 0x01ac, 0x3e); VL6180x_writetRegister(I2C_Port,Adresse, 0x01a7, 0x1f); VL6180x_writetRegister(I2C_Port,Adresse, 0x0030, 0x00); // Public Registers siehe AN4545 VL6180x_writetRegister(I2C_Port,Adresse, 0x0011, 0x10); // Aktiviert Polling für neuenMesswert bereit, wenn die Messung abgeschlossen ist VL6180x_writetRegister(I2C_Port,Adresse, 0x010a, 0x30); // Setzen der durchnschnittlichen Abtastrate (Kompromiss zwischen Rauschen und Messzeit) VL6180x_writetRegister(I2C_Port,Adresse, 0x003f, 0x46); // Stellt die Hell-/Dunkelverstärkung ein (Dunkelverstärkung laut ST nicht ändern) VL6180x_writetRegister(I2C_Port,Adresse, 0x0031, 0xFF); // legt die Anzahl der Messungen, nach denen die autom. Kalibrierung durchgeführt wird VL6180x_writetRegister(I2C_Port,Adresse, 0x0040, 0x63); // ALS Integrationszeit auf 100ms VL6180x_writetRegister(I2C_Port,Adresse, 0x002e, 0x01); // einzelne Temperaturkalibrierung durchführen // optionale Public Registers siehe AN4545 VL6180x_writetRegister(I2C_Port,Adresse, VL6180X_SYSRANGE_INTERMEASUREMENT_PERIOD, 0x09); // Standartintervall zwischen Messungen 100ms VL6180x_writetRegister(I2C_Port,Adresse, VL6180X_SYSALS_INTERMEASUREMENT_PERIOD, 0x31); // Standartintervall zwischen ALS Messungen 500ms VL6180x_writetRegister(I2C_Port,Adresse, VL6180X_SYSTEM_INTERRUPT_CONFIG_GPIO, 0x24); // Interrupt wenn neuer Messwert bereit } // 8bit Wert aus Register auslesen uint8_t VL6180x_readRegister(I2C_TypeDef* I2C_Port,uint8_t Adresse, uint16_t registerAddr) { uint8_t data_write[2]; uint8_t data_read[1]; data_write[0] = (registerAddr >> 8) & 0xFF; // MSB der Registeradresse data_write[1] = registerAddr & 0xFF; // LSB der Registeradresse i2c_communicate(I2C_Port, Adresse, data_write, 2, data_read, 1); return data_read[0]; } // 16bit Wert aus Register auslesen uint16_t VL6180x_readRegister16bit(I2C_TypeDef* I2C_Port,uint8_t Adresse, uint16_t registerAddr) { uint8_t data_low; uint8_t data_high; uint8_t data_write[2]; uint8_t data_read[2]; data_write[0] = (registerAddr >> 8) & 0xFF; // MSB der Registeradresse data_write[1] = registerAddr & 0xFF; // LSB der Registeradresse i2c_communicate(I2C_Port, Adresse, data_write, 2, data_read, 2); data_high = data_read[0]; // MSB des Wertes data_low = data_read[1]; //LSB des Wertes return (data_high << 8)|data_low; // als 16bit Wert zusammenführen } // 8bit Wert in Register schreiben void VL6180x_writetRegister(I2C_TypeDef* I2C_Port,uint8_t Adresse, uint16_t registerAddr, uint8_t data) { uint8_t data_write[3]; data_write[0] = (registerAddr >> 8) & 0xFF; // MSB der Registeradresse data_write[1] = registerAddr & 0xFF; // LSB der Registeradresse data_write[2] = data & 0xFF; i2c_communicate(I2C_Port, Adresse, data_write, 3, 0, 0); } // 16bit Wert in Register schreiben void VL6180x_writetRegister16bit(I2C_TypeDef* I2C_Port,uint8_t Adresse, uint16_t registerAddr, uint16_t data) { uint8_t data_write[4]; data_write[0] = (registerAddr >> 8) & 0xFF; // MSB der Registeradresse data_write[1] = registerAddr & 0xFF; // LSB der Registeradresse data_write[2] = (data >> 8) & 0xFF; data_write[3] = data & 0xFF; i2c_communicate(I2C_Port, Adresse, data_write, 4, 0, 0); }