VL6180_ATY.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. /**
  2. * @file VL6180_ATY.h
  3. *
  4. * @param Project DEVICE_GENERAL_ATY_LIB
  5. *
  6. * @author ATY
  7. *
  8. * @copyright
  9. * - Copyright 2017 - 2026 MZ-ATY
  10. * - This code follows:
  11. * - MZ-ATY Various Contents Joint Statement -
  12. * <a href="https://mengze.top/MZ-ATY_VCJS">
  13. * https://mengze.top/MZ-ATY_VCJS</a>
  14. * - CC 4.0 BY-NC-SA -
  15. * <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
  16. * https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
  17. * - Your use will be deemed to have accepted the terms of this statement.
  18. *
  19. * @brief functions of VL6180 proximity and ambient light sensor for all embedded device
  20. *
  21. * @version
  22. * - 1_00_250101 > ATY
  23. * -# Initial version, support I2C communication, range and ALS measurement
  24. ********************************************************************************
  25. */
  26. #ifndef __VL6180_ATY_H
  27. #define __VL6180_ATY_H
  28. #include "INCLUDE_ATY.h"
  29. /******************************* For user *************************************/
  30. // VL6180 I2C Default Address
  31. #define VL6180_I2C_ADDR_DEFAULT 0x29
  32. // VL6180 Status Codes
  33. #define VL6180_STATUS_OK 0x00
  34. #define VL6180_STATUS_ERROR 0x01
  35. #define VL6180_STATUS_TIMEOUT 0x02
  36. #define VL6180_STATUS_NO_DEVICE 0x03
  37. #define VL6180_STATUS_NOT_READY 0x04
  38. #define VL6180_STATUS_RANGE_ERROR 0x05
  39. #define VL6180_STATUS_ALS_ERROR 0x06
  40. // VL6180 Register Addresses
  41. #define VL6180_REG_IDENTIFICATION_MODEL_ID 0x000
  42. #define VL6180_REG_IDENTIFICATION_MODEL_REV_MAJOR 0x001
  43. #define VL6180_REG_IDENTIFICATION_MODEL_REV_MINOR 0x002
  44. #define VL6180_REG_IDENTIFICATION_MODULE_REV_MAJOR 0x003
  45. #define VL6180_REG_IDENTIFICATION_MODULE_REV_MINOR 0x004
  46. #define VL6180_REG_IDENTIFICATION_DATE_HI 0x006
  47. #define VL6180_REG_IDENTIFICATION_DATE_LO 0x007
  48. #define VL6180_REG_IDENTIFICATION_TIME 0x008
  49. #define VL6180_REG_SYSTEM_MODE_GPIO0 0x010
  50. #define VL6180_REG_SYSTEM_MODE_GPIO1 0x011
  51. #define VL6180_REG_SYSTEM_HISTORY_CTRL 0x012
  52. #define VL6180_REG_SYSTEM_INTERRUPT_CONFIG_GPIO 0x014
  53. #define VL6180_REG_SYSTEM_INTERRUPT_CLEAR 0x015
  54. #define VL6180_REG_SYSTEM_FRESH_OUT_OF_RESET 0x016
  55. #define VL6180_REG_SYSTEM_GROUPED_PARAMETER_HOLD 0x017
  56. // Range measurement registers
  57. #define VL6180_REG_SYSRANGE_START 0x018
  58. #define VL6180_REG_SYSRANGE_THRESH_HIGH 0x019
  59. #define VL6180_REG_SYSRANGE_THRESH_LOW 0x01A
  60. #define VL6180_REG_SYSRANGE_INTERMEASUREMENT_PERIOD 0x01B
  61. #define VL6180_REG_SYSRANGE_MAX_CONVERGENCE_TIME 0x01C
  62. #define VL6180_REG_SYSRANGE_CROSSTALK_COMPENSATION_RATE 0x01E
  63. #define VL6180_REG_SYSRANGE_CROSSTALK_VALID_HEIGHT 0x021
  64. #define VL6180_REG_SYSRANGE_EARLY_CONVERGENCE_ESTIMATE 0x022
  65. #define VL6180_REG_SYSRANGE_PART_TO_PART_RANGE_OFFSET 0x024
  66. #define VL6180_REG_SYSRANGE_RANGE_IGNORE_VALID_HEIGHT 0x025
  67. #define VL6180_REG_SYSRANGE_RANGE_IGNORE_THRESHOLD 0x026
  68. #define VL6180_REG_SYSRANGE_MAX_AMBIENT_LEVEL_MULT 0x02C
  69. #define VL6180_REG_SYSRANGE_RANGE_CHECK_ENABLES 0x02D
  70. #define VL6180_REG_SYSRANGE_VHV_RECALIBRATE 0x02E
  71. #define VL6180_REG_SYSRANGE_VHV_REPEAT_RATE 0x031
  72. // ALS measurement registers
  73. #define VL6180_REG_SYSALS_START 0x038
  74. #define VL6180_REG_SYSALS_THRESH_HIGH 0x03A
  75. #define VL6180_REG_SYSALS_THRESH_LOW 0x03C
  76. #define VL6180_REG_SYSALS_INTERMEASUREMENT_PERIOD 0x03E
  77. #define VL6180_REG_SYSALS_ANALOGUE_GAIN 0x03F
  78. #define VL6180_REG_SYSALS_INTEGRATION_PERIOD 0x040
  79. // Result registers
  80. #define VL6180_REG_RESULT_RANGE_STATUS 0x04D
  81. #define VL6180_REG_RESULT_ALS_STATUS 0x04E
  82. #define VL6180_REG_RESULT_INTERRUPT_STATUS_GPIO 0x04F
  83. #define VL6180_REG_RESULT_ALS_VAL 0x050
  84. #define VL6180_REG_RESULT_HISTORY_BUFFER_0 0x052
  85. #define VL6180_REG_RESULT_HISTORY_BUFFER_1 0x054
  86. #define VL6180_REG_RESULT_HISTORY_BUFFER_2 0x056
  87. #define VL6180_REG_RESULT_HISTORY_BUFFER_3 0x058
  88. #define VL6180_REG_RESULT_HISTORY_BUFFER_4 0x05A
  89. #define VL6180_REG_RESULT_HISTORY_BUFFER_5 0x05C
  90. #define VL6180_REG_RESULT_HISTORY_BUFFER_6 0x05E
  91. #define VL6180_REG_RESULT_HISTORY_BUFFER_7 0x060
  92. #define VL6180_REG_RESULT_RANGE_VAL 0x062
  93. #define VL6180_REG_RESULT_RANGE_RAW 0x064
  94. #define VL6180_REG_RESULT_RANGE_RETURN_RATE 0x066
  95. #define VL6180_REG_RESULT_RANGE_REFERENCE_RATE 0x068
  96. #define VL6180_REG_RESULT_RANGE_RETURN_SIGNAL_COUNT 0x06C
  97. #define VL6180_REG_RESULT_RANGE_REFERENCE_SIGNAL_COUNT 0x070
  98. #define VL6180_REG_RESULT_RANGE_RETURN_AMB_COUNT 0x074
  99. #define VL6180_REG_RESULT_RANGE_REFERENCE_AMB_COUNT 0x078
  100. #define VL6180_REG_RESULT_RANGE_RETURN_CONV_TIME 0x07C
  101. #define VL6180_REG_RESULT_RANGE_REFERENCE_CONV_TIME 0x080
  102. // Readout averaging sample period
  103. #define VL6180_REG_READOUT_AVERAGING_SAMPLE_PERIOD 0x10A
  104. // Firmware result scaler
  105. #define VL6180_REG_FIRMWARE_BOOTUP 0x119
  106. #define VL6180_REG_FIRMWARE_RESULT_SCALER 0x120
  107. // I2C Slave Device Address
  108. #define VL6180_REG_I2C_SLAVE_DEVICE_ADDRESS 0x212
  109. // Interleaved mode
  110. #define VL6180_REG_INTERLEAVED_MODE_ENABLE 0x2A3
  111. // VL6180 Commands
  112. #define VL6180_MODE_RANGE_SINGLE_SHOT 0x01
  113. #define VL6180_MODE_RANGE_CONTINUOUS 0x02
  114. #define VL6180_MODE_ALS_SINGLE_SHOT 0x01
  115. #define VL6180_MODE_ALS_CONTINUOUS 0x02
  116. // VL6180 ALS Gain Settings
  117. #define VL6180_ALS_GAIN_20 0x00 // Actual ALS Gain of 20
  118. #define VL6180_ALS_GAIN_10 0x01 // Actual ALS Gain of 10.32
  119. #define VL6180_ALS_GAIN_5 0x02 // Actual ALS Gain of 5.21
  120. #define VL6180_ALS_GAIN_2_5 0x03 // Actual ALS Gain of 2.60
  121. #define VL6180_ALS_GAIN_1_67 0x04 // Actual ALS Gain of 1.72
  122. #define VL6180_ALS_GAIN_1_25 0x05 // Actual ALS Gain of 1.28
  123. #define VL6180_ALS_GAIN_1 0x06 // Actual ALS Gain of 1.01
  124. #define VL6180_ALS_GAIN_40 0x07 // Actual ALS Gain of 40
  125. // VL6180 Error Codes
  126. #define VL6180_ERROR_NONE 0x00
  127. #define VL6180_ERROR_SYSERR_1 0x01
  128. #define VL6180_ERROR_SYSERR_5 0x05
  129. #define VL6180_ERROR_ECEFAIL 0x06
  130. #define VL6180_ERROR_NOCONVERGE 0x07
  131. #define VL6180_ERROR_RANGEIGNORE 0x08
  132. #define VL6180_ERROR_SNR 0x0B
  133. #define VL6180_ERROR_RAWUFLOW 0x0C
  134. #define VL6180_ERROR_RAWOFLOW 0x0D
  135. #define VL6180_ERROR_RANGEUFLOW 0x0E
  136. #define VL6180_ERROR_RANGEOFLOW 0x0F
  137. /******************************************************************************/
  138. struct VL6180_ATY_Dev
  139. {
  140. // I2C communication functions
  141. uint8_t (*i2cStart)(void); // I2C start condition
  142. uint8_t (*i2cStop)(void); // I2C stop condition
  143. uint8_t (*i2cWriteByte)(uint8_t data); // I2C write byte
  144. uint8_t (*i2cReadByte)(uint8_t ack); // I2C read byte
  145. uint8_t i2cAddress; // I2C device address
  146. // Delay function
  147. void (*delayMs)(uint32_t ms); // Millisecond delay function
  148. // Device identification
  149. uint8_t modelId; // Model ID
  150. uint8_t modelRevMajor; // Model revision major
  151. uint8_t modelRevMinor; // Model revision minor
  152. uint8_t moduleRevMajor; // Module revision major
  153. uint8_t moduleRevMinor; // Module revision minor
  154. // Range measurement data
  155. uint8_t rangeValue; // Range measurement result (mm)
  156. uint8_t rangeStatus; // Range measurement status
  157. uint16_t rangeRate; // Range return rate
  158. uint16_t rangeRaw; // Raw range measurement
  159. uint32_t rangeSignalCount; // Range signal count
  160. uint32_t rangeAmbientCount; // Range ambient count
  161. uint16_t rangeConvergenceTime; // Range convergence time
  162. // ALS measurement data
  163. uint16_t alsValue; // ALS measurement result (lux)
  164. uint8_t alsStatus; // ALS measurement status
  165. uint8_t alsGain; // ALS gain setting
  166. uint16_t alsIntegrationPeriod; // ALS integration period
  167. // Configuration parameters
  168. uint8_t rangeMaxConvergenceTime; // Range max convergence time
  169. uint16_t rangeIntermeasurementPeriod; // Range intermeasurement period
  170. uint16_t alsIntermeasurementPeriod; // ALS intermeasurement period
  171. uint8_t rangeThresholdHigh; // Range high threshold
  172. uint8_t rangeThresholdLow; // Range low threshold
  173. uint16_t alsThresholdHigh; // ALS high threshold
  174. uint16_t alsThresholdLow; // ALS low threshold
  175. // Calibration data
  176. int8_t rangeOffset; // Range offset calibration
  177. uint16_t crosstalkCompensationRate; // Crosstalk compensation rate
  178. // Status and control
  179. uint8_t devicePresent; // Device presence flag
  180. uint8_t lastStatus; // Last operation status
  181. uint8_t initialized; // Initialization flag
  182. uint8_t freshOutOfReset; // Fresh out of reset flag
  183. // Debug and logging
  184. uint8_t lock;
  185. uint8_t debugEnable;
  186. void (*LOG)(const char*, ...);
  187. };
  188. // Function prototypes
  189. uint8_t VL6180_Init(struct VL6180_ATY_Dev *dev);
  190. uint8_t VL6180_Reset(struct VL6180_ATY_Dev *dev);
  191. uint8_t VL6180_ReadDeviceID(struct VL6180_ATY_Dev *dev);
  192. uint8_t VL6180_LoadDefaultSettings(struct VL6180_ATY_Dev *dev);
  193. // Range measurement functions
  194. uint8_t VL6180_StartRangeMeasurement(struct VL6180_ATY_Dev *dev, uint8_t mode);
  195. uint8_t VL6180_ReadRangeResult(struct VL6180_ATY_Dev *dev);
  196. uint8_t VL6180_GetRangeValue(struct VL6180_ATY_Dev *dev);
  197. uint8_t VL6180_IsRangeReady(struct VL6180_ATY_Dev *dev);
  198. uint8_t VL6180_ClearRangeInterrupt(struct VL6180_ATY_Dev *dev);
  199. // ALS measurement functions
  200. uint8_t VL6180_StartALSMeasurement(struct VL6180_ATY_Dev *dev, uint8_t mode);
  201. uint8_t VL6180_ReadALSResult(struct VL6180_ATY_Dev *dev);
  202. uint16_t VL6180_GetALSValue(struct VL6180_ATY_Dev *dev);
  203. uint8_t VL6180_IsALSReady(struct VL6180_ATY_Dev *dev);
  204. uint8_t VL6180_ClearALSInterrupt(struct VL6180_ATY_Dev *dev);
  205. // Configuration functions
  206. uint8_t VL6180_SetRangeThresholds(struct VL6180_ATY_Dev *dev, uint8_t low, uint8_t high);
  207. uint8_t VL6180_SetALSThresholds(struct VL6180_ATY_Dev *dev, uint16_t low, uint16_t high);
  208. uint8_t VL6180_SetALSGain(struct VL6180_ATY_Dev *dev, uint8_t gain);
  209. uint8_t VL6180_SetALSIntegrationPeriod(struct VL6180_ATY_Dev *dev, uint16_t period);
  210. uint8_t VL6180_SetRangeOffset(struct VL6180_ATY_Dev *dev, int8_t offset);
  211. uint8_t VL6180_SetCrosstalkCompensation(struct VL6180_ATY_Dev *dev, uint16_t rate);
  212. // I2C register access functions
  213. uint8_t VL6180_WriteRegister8(struct VL6180_ATY_Dev *dev, uint16_t reg, uint8_t data);
  214. uint8_t VL6180_WriteRegister16(struct VL6180_ATY_Dev *dev, uint16_t reg, uint16_t data);
  215. uint8_t VL6180_WriteRegister32(struct VL6180_ATY_Dev *dev, uint16_t reg, uint32_t data);
  216. uint8_t VL6180_ReadRegister8(struct VL6180_ATY_Dev *dev, uint16_t reg, uint8_t *data);
  217. uint8_t VL6180_ReadRegister16(struct VL6180_ATY_Dev *dev, uint16_t reg, uint16_t *data);
  218. uint8_t VL6180_ReadRegister32(struct VL6180_ATY_Dev *dev, uint16_t reg, uint32_t *data);
  219. // Utility functions
  220. uint8_t VL6180_GetDeviceStatus(struct VL6180_ATY_Dev *dev);
  221. void VL6180_SetI2CAddress(struct VL6180_ATY_Dev *dev, uint8_t address);
  222. float VL6180_ConvertALSToLux(struct VL6180_ATY_Dev *dev, uint16_t alsValue);
  223. const char* VL6180_GetErrorString(uint8_t errorCode);
  224. #endif /* __VL6180_ATY_H */
  225. /******************************** End Of File *********************************/