Première lecture avec le capteur VL53L8X
This commit is contained in:
		
							parent
							
								
									16a45b620d
								
							
						
					
					
						commit
						3ebac86f82
					
				
							
								
								
									
										4
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							| @ -4,6 +4,8 @@ | |||||||
|         "geometrie_robot.h": "c", |         "geometrie_robot.h": "c", | ||||||
|         "commande_vitesse.h": "c", |         "commande_vitesse.h": "c", | ||||||
|         "asser_moteurs.h": "c", |         "asser_moteurs.h": "c", | ||||||
|         "localisation.h": "c" |         "localisation.h": "c", | ||||||
|  |         "vl53l8_2024.h": "c", | ||||||
|  |         "trajet.h": "c" | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -15,21 +15,28 @@ add_executable(Mon_Projet | |||||||
|   Asser_Moteurs.c |   Asser_Moteurs.c | ||||||
|   Commande_vitesse.c |   Commande_vitesse.c | ||||||
|   Geometrie.c |   Geometrie.c | ||||||
|  |   i2c_maitre.c | ||||||
|   Moteurs.c |   Moteurs.c | ||||||
|   Localisation.c |   Localisation.c | ||||||
|   main.c |   main.c | ||||||
|  |   QEI.c | ||||||
|   Temps.c |   Temps.c | ||||||
|   Trajectoire_bezier.c |   Trajectoire_bezier.c | ||||||
|   Trajectoire_circulaire.c |   Trajectoire_circulaire.c | ||||||
|   Trajectoire_droite.c |   Trajectoire_droite.c | ||||||
|   Trajectoire.c |   Trajectoire.c | ||||||
|   Trajet.c |   Trajet.c | ||||||
|   QEI.c |   VL53L8CX_ULD_API/src/vl53l8cx_api.c | ||||||
|  |   VL53L8CX_ULD_API/src/vl53l8cx_plugin_detection_thresholds.c | ||||||
|  |   VL53L8CX_ULD_API/src/vl53l8cx_plugin_motion_indicator.c | ||||||
|  |   VL53L8CX_ULD_API/src/vl53l8cx_plugin_xtalk.c | ||||||
|  |   VL53L8_2024.c | ||||||
|  |   Platform/platform.c | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| pico_generate_pio_header(Mon_Projet ${CMAKE_CURRENT_LIST_DIR}/quadrature_encoder.pio) | pico_generate_pio_header(Mon_Projet ${CMAKE_CURRENT_LIST_DIR}/quadrature_encoder.pio) | ||||||
| 
 | 
 | ||||||
| target_include_directories(Mon_Projet PRIVATE Mon_Projet_ULD_API/inc/) | target_include_directories(Mon_Projet PRIVATE VL53L8CX_ULD_API/inc/) | ||||||
| 
 | 
 | ||||||
| target_link_libraries(Mon_Projet | target_link_libraries(Mon_Projet | ||||||
|   hardware_adc  |   hardware_adc  | ||||||
|  | |||||||
							
								
								
									
										6
									
								
								Platform/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								Platform/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | This software component is provided to you as part of a software package and | ||||||
|  | applicable license terms are in the  Package_license file. If you received this | ||||||
|  | software component outside of a package or without applicable license terms, | ||||||
|  | the terms of the BSD-3-Clause license shall apply.  | ||||||
|  | You may obtain a copy of the BSD-3-Clause at: | ||||||
|  | https://opensource.org/licenses/BSD-3-Clause | ||||||
							
								
								
									
										198
									
								
								Platform/platform.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										198
									
								
								Platform/platform.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,198 @@ | |||||||
|  | /**
 | ||||||
|  |   * | ||||||
|  |   * Copyright (c) 2021 STMicroelectronics. | ||||||
|  |   * All rights reserved. | ||||||
|  |   * | ||||||
|  |   * This software is licensed under terms that can be found in the LICENSE file | ||||||
|  |   * in the root directory of this software component. | ||||||
|  |   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||||
|  |   * | ||||||
|  |   ****************************************************************************** | ||||||
|  |   */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #include "platform.h" | ||||||
|  | #include "pico/stdlib.h" | ||||||
|  | #include "hardware/i2c.h" | ||||||
|  | #include "hardware/gpio.h" | ||||||
|  | #include <stdio.h> | ||||||
|  | 
 | ||||||
|  | #define I2C_SUCCESS 0 | ||||||
|  | #define I2C_FAILED 1 | ||||||
|  | #define I2C_BUFFER_EXCEEDED 2 | ||||||
|  | 
 | ||||||
|  | #define I2C_DEVICE i2c1 | ||||||
|  | 
 | ||||||
|  | #define MAX_I2C_BUFFER 0x8100 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// @brief Blocking function allowing to write a register on an I2C device
 | ||||||
|  | /// @param address_7_bits 
 | ||||||
|  | /// @param index : register to write
 | ||||||
|  | /// @param values : values to write
 | ||||||
|  | /// @param count : number of byte to send
 | ||||||
|  | /// @return 0: Success, -1 or -2: Failed 
 | ||||||
|  | int8_t i2c_write_register(char adresse_7_bits, uint16_t index, uint8_t * values, uint32_t count){ | ||||||
|  |     int statu; | ||||||
|  | 	uint8_t buffer[MAX_I2C_BUFFER]; | ||||||
|  |     uint8_t index_to_unint8[2]; | ||||||
|  | 	absolute_time_t timeout_time; | ||||||
|  | 
 | ||||||
|  | 	if(count > MAX_I2C_BUFFER - 2){ | ||||||
|  | 		return I2C_BUFFER_EXCEEDED; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	index_to_unint8[0] =  (index >> 8) & 0xFF; | ||||||
|  | 	index_to_unint8[1] =  index & 0xFF; | ||||||
|  | 
 | ||||||
|  | 	buffer[0] = index_to_unint8[0]; | ||||||
|  | 	buffer[1] = index_to_unint8[1]; | ||||||
|  | 	 | ||||||
|  | 	for(uint32_t i=0; i<count; i++){ | ||||||
|  | 		buffer[2+i] = values[i]; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Define timeout - now + 1s.
 | ||||||
|  | 	timeout_time = time_us_64() + 5000000; | ||||||
|  |     statu = i2c_write_blocking_until (I2C_DEVICE, adresse_7_bits, buffer, count + 2, 0, timeout_time); | ||||||
|  | 	//statu = i2c_write_blocking (I2C_DEVICE, adresse_7_bits, buffer, count + 2, 0);
 | ||||||
|  |     if(statu == PICO_ERROR_GENERIC){ | ||||||
|  |         printf("I2C - Write - Envoi registre Echec %x\n", adresse_7_bits); | ||||||
|  |         return I2C_FAILED; | ||||||
|  |     }else if(statu == PICO_ERROR_TIMEOUT){ | ||||||
|  | 		printf("Erreur ecrire registre: timeout\n"); | ||||||
|  | 		printf("Adresse : %x\n",adresse_7_bits << 1 ); | ||||||
|  | 		return I2C_FAILED; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  |     return I2C_SUCCESS; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// @brief Blocking function allowing to write a register on an I2C device
 | ||||||
|  | /// @param address_7_bits 
 | ||||||
|  | /// @param index : register to write
 | ||||||
|  | /// @param values : values to write
 | ||||||
|  | /// @param count : number of byte to send
 | ||||||
|  | /// @return 0: Success, -1 or -2: Failed 
 | ||||||
|  | int8_t i2c_read_register(char adresse_7_bits, uint16_t index, uint8_t *pdata, uint32_t count){ | ||||||
|  |     int statu; | ||||||
|  | 	uint8_t buffer[MAX_I2C_BUFFER]; | ||||||
|  |     uint8_t index_to_unint8[2]; | ||||||
|  | 
 | ||||||
|  | 	index_to_unint8[0] =  (index >> 8) & 0xFF; | ||||||
|  | 	index_to_unint8[1] =  index & 0xFF; | ||||||
|  | 
 | ||||||
|  |     statu = i2c_write_blocking (I2C_DEVICE, adresse_7_bits, index_to_unint8, 2, 0); | ||||||
|  |     if(statu == PICO_ERROR_GENERIC){ | ||||||
|  |         printf("I2C - Write - Envoi registre Echec %x\n", adresse_7_bits); | ||||||
|  |         return I2C_FAILED; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     statu = i2c_read_blocking (I2C_DEVICE, adresse_7_bits, pdata, count, 0); | ||||||
|  |     if(statu == PICO_ERROR_GENERIC){ | ||||||
|  |         printf("I2C - Lecture registre Echec\n"); | ||||||
|  |         return I2C_FAILED; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return I2C_SUCCESS; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | uint8_t RdByte( | ||||||
|  | 		VL53L8CX_Platform *p_platform, | ||||||
|  | 		uint16_t RegisterAdress, | ||||||
|  | 		uint8_t *p_value) | ||||||
|  | { | ||||||
|  | 	uint8_t status = 255; | ||||||
|  | 	 | ||||||
|  | 	/* Need to be implemented by customer. This function returns 0 if OK */ | ||||||
|  | 	return i2c_read_register(p_platform->address >> 1, RegisterAdress, p_value, 1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint8_t WrByte( | ||||||
|  | 		VL53L8CX_Platform *p_platform, | ||||||
|  | 		uint16_t RegisterAdress, | ||||||
|  | 		uint8_t value) | ||||||
|  | { | ||||||
|  | 	uint8_t status = 255; | ||||||
|  | 
 | ||||||
|  | 	/* Need to be implemented by customer. This function returns 0 if OK */ | ||||||
|  | 	return i2c_write_register(p_platform->address >> 1, RegisterAdress, &value, 1); | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint8_t WrMulti( | ||||||
|  | 		VL53L8CX_Platform *p_platform, | ||||||
|  | 		uint16_t RegisterAdress, | ||||||
|  | 		uint8_t *p_values, | ||||||
|  | 		uint32_t size) | ||||||
|  | { | ||||||
|  | 	uint8_t status = 255; | ||||||
|  | 	 | ||||||
|  | 	return i2c_write_register(p_platform->address >> 1, RegisterAdress, p_values, size); | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint8_t RdMulti( | ||||||
|  | 		VL53L8CX_Platform *p_platform, | ||||||
|  | 		uint16_t RegisterAdress, | ||||||
|  | 		uint8_t *p_values, | ||||||
|  | 		uint32_t size) | ||||||
|  | { | ||||||
|  | 	uint8_t status = 255; | ||||||
|  | 	 | ||||||
|  | 	return i2c_read_register(p_platform->address >> 1, RegisterAdress, p_values, size); | ||||||
|  | 	 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint8_t Reset_Sensor( | ||||||
|  | 		VL53L8CX_Platform *p_platform) | ||||||
|  | { | ||||||
|  | 	uint8_t status = 0; | ||||||
|  | 	 | ||||||
|  | 	/* (Optional) Need to be implemented by customer. This function returns 0 if OK */ | ||||||
|  | 	 | ||||||
|  | 	/* Set pin LPN to LOW */ | ||||||
|  | 	/* Set pin AVDD to LOW */ | ||||||
|  | 	/* Set pin VDDIO  to LOW */ | ||||||
|  | 	/* Set pin CORE_1V8 to LOW */ | ||||||
|  | 	WaitMs(p_platform, 100); | ||||||
|  | 
 | ||||||
|  | 	/* Set pin LPN to HIGH */ | ||||||
|  | 	/* Set pin AVDD to HIGH */ | ||||||
|  | 	/* Set pin VDDIO to HIGH */ | ||||||
|  | 	/* Set pin CORE_1V8 to HIGH */ | ||||||
|  | 	WaitMs(p_platform, 100); | ||||||
|  | 
 | ||||||
|  | 	return status; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void SwapBuffer( | ||||||
|  | 		uint8_t 		*buffer, | ||||||
|  | 		uint16_t 	 	 size) | ||||||
|  | { | ||||||
|  | 	uint32_t i, tmp; | ||||||
|  | 	 | ||||||
|  | 	/* Example of possible implementation using <string.h> */ | ||||||
|  | 	for(i = 0; i < size; i = i + 4)  | ||||||
|  | 	{ | ||||||
|  | 		tmp = ( | ||||||
|  | 		  buffer[i]<<24) | ||||||
|  | 		|(buffer[i+1]<<16) | ||||||
|  | 		|(buffer[i+2]<<8) | ||||||
|  | 		|(buffer[i+3]); | ||||||
|  | 		 | ||||||
|  | 		memcpy(&(buffer[i]), &tmp, 4); | ||||||
|  | 	} | ||||||
|  | }	 | ||||||
|  | 
 | ||||||
|  | uint8_t WaitMs( | ||||||
|  | 		VL53L8CX_Platform *p_platform, | ||||||
|  | 		uint32_t TimeMs) | ||||||
|  | { | ||||||
|  | 	/* Need to be implemented by customer. This function returns 0 if OK */ | ||||||
|  | 	sleep_ms(TimeMs); | ||||||
|  | 	 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
							
								
								
									
										166
									
								
								Platform/platform.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								Platform/platform.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,166 @@ | |||||||
|  | /**
 | ||||||
|  |   * | ||||||
|  |   * Copyright (c) 2021 STMicroelectronics. | ||||||
|  |   * All rights reserved. | ||||||
|  |   * | ||||||
|  |   * This software is licensed under terms that can be found in the LICENSE file | ||||||
|  |   * in the root directory of this software component. | ||||||
|  |   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||||
|  |   * | ||||||
|  |   ****************************************************************************** | ||||||
|  |   */ | ||||||
|  | 
 | ||||||
|  | #ifndef _PLATFORM_H_ | ||||||
|  | #define _PLATFORM_H_ | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <stdint.h> | ||||||
|  | #include <string.h> | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Structure VL53L8CX_Platform needs to be filled by the customer, | ||||||
|  |  * depending on his platform. At least, it contains the VL53L8CX I2C address. | ||||||
|  |  * Some additional fields can be added, as descriptors, or platform | ||||||
|  |  * dependencies. Anything added into this structure is visible into the platform | ||||||
|  |  * layer. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  | 	/* To be filled with customer's platform. At least an I2C address/descriptor
 | ||||||
|  | 	 * needs to be added */ | ||||||
|  | 	/* Example for most standard platform : I2C address of sensor */ | ||||||
|  |     uint16_t  			address; | ||||||
|  | 
 | ||||||
|  | } VL53L8CX_Platform; | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * @brief The macro below is used to define the number of target per zone sent | ||||||
|  |  * through I2C. This value can be changed by user, in order to tune I2C | ||||||
|  |  * transaction, and also the total memory size (a lower number of target per | ||||||
|  |  * zone means a lower RAM). The value must be between 1 and 4. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define 	VL53L8CX_NB_TARGET_PER_ZONE		1U | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * @brief The macro below can be used to avoid data conversion into the driver. | ||||||
|  |  * By default there is a conversion between firmware and user data. Using this macro | ||||||
|  |  * allows to use the firmware format instead of user format. The firmware format allows | ||||||
|  |  * an increased precision. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | // #define 	VL53L8CX_USE_RAW_FORMAT
 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * @brief All macro below are used to configure the sensor output. User can | ||||||
|  |  * define some macros if he wants to disable selected output, in order to reduce | ||||||
|  |  * I2C access. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | // #define VL53L8CX_DISABLE_AMBIENT_PER_SPAD
 | ||||||
|  | // #define VL53L8CX_DISABLE_NB_SPADS_ENABLED
 | ||||||
|  | // #define VL53L8CX_DISABLE_NB_TARGET_DETECTED
 | ||||||
|  | // #define VL53L8CX_DISABLE_SIGNAL_PER_SPAD
 | ||||||
|  | // #define VL53L8CX_DISABLE_RANGE_SIGMA_MM
 | ||||||
|  | // #define VL53L8CX_DISABLE_DISTANCE_MM
 | ||||||
|  | // #define VL53L8CX_DISABLE_REFLECTANCE_PERCENT
 | ||||||
|  | // #define VL53L8CX_DISABLE_TARGET_STATUS
 | ||||||
|  | // #define VL53L8CX_DISABLE_MOTION_INDICATOR
 | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @param (VL53L8CX_Platform*) p_platform : Pointer of VL53L8CX platform | ||||||
|  |  * structure. | ||||||
|  |  * @param (uint16_t) Address : I2C location of value to read. | ||||||
|  |  * @param (uint8_t) *p_values : Pointer of value to read. | ||||||
|  |  * @return (uint8_t) status : 0 if OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t RdByte( | ||||||
|  | 		VL53L8CX_Platform *p_platform, | ||||||
|  | 		uint16_t RegisterAdress, | ||||||
|  | 		uint8_t *p_value); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Mandatory function used to write one single byte. | ||||||
|  |  * @param (VL53L8CX_Platform*) p_platform : Pointer of VL53L8CX platform | ||||||
|  |  * structure. | ||||||
|  |  * @param (uint16_t) Address : I2C location of value to read. | ||||||
|  |  * @param (uint8_t) value : Pointer of value to write. | ||||||
|  |  * @return (uint8_t) status : 0 if OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t WrByte( | ||||||
|  | 		VL53L8CX_Platform *p_platform, | ||||||
|  | 		uint16_t RegisterAdress, | ||||||
|  | 		uint8_t value); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Mandatory function used to read multiples bytes. | ||||||
|  |  * @param (VL53L8CX_Platform*) p_platform : Pointer of VL53L8CX platform | ||||||
|  |  * structure. | ||||||
|  |  * @param (uint16_t) Address : I2C location of values to read. | ||||||
|  |  * @param (uint8_t) *p_values : Buffer of bytes to read. | ||||||
|  |  * @param (uint32_t) size : Size of *p_values buffer. | ||||||
|  |  * @return (uint8_t) status : 0 if OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t RdMulti( | ||||||
|  | 		VL53L8CX_Platform *p_platform, | ||||||
|  | 		uint16_t RegisterAdress, | ||||||
|  | 		uint8_t *p_values, | ||||||
|  | 		uint32_t size); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Mandatory function used to write multiples bytes. | ||||||
|  |  * @param (VL53L8CX_Platform*) p_platform : Pointer of VL53L8CX platform | ||||||
|  |  * structure. | ||||||
|  |  * @param (uint16_t) Address : I2C location of values to write. | ||||||
|  |  * @param (uint8_t) *p_values : Buffer of bytes to write. | ||||||
|  |  * @param (uint32_t) size : Size of *p_values buffer. | ||||||
|  |  * @return (uint8_t) status : 0 if OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t WrMulti( | ||||||
|  | 		VL53L8CX_Platform *p_platform, | ||||||
|  | 		uint16_t RegisterAdress, | ||||||
|  | 		uint8_t *p_values, | ||||||
|  | 		uint32_t size); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Optional function, only used to perform an hardware reset of the | ||||||
|  |  * sensor. This function is not used in the API, but it can be used by the host. | ||||||
|  |  * This function is not mandatory to fill if user don't want to reset the | ||||||
|  |  * sensor. | ||||||
|  |  * @param (VL53L8CX_Platform*) p_platform : Pointer of VL53L8CX platform | ||||||
|  |  * structure. | ||||||
|  |  * @return (uint8_t) status : 0 if OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t Reset_Sensor( | ||||||
|  | 		VL53L8CX_Platform *p_platform); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Mandatory function, used to swap a buffer. The buffer size is always a | ||||||
|  |  * multiple of 4 (4, 8, 12, 16, ...). | ||||||
|  |  * @param (uint8_t*) buffer : Buffer to swap, generally uint32_t | ||||||
|  |  * @param (uint16_t) size : Buffer size to swap | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | void SwapBuffer( | ||||||
|  | 		uint8_t 		*buffer, | ||||||
|  | 		uint16_t 	 	 size); | ||||||
|  | /**
 | ||||||
|  |  * @brief Mandatory function, used to wait during an amount of time. It must be | ||||||
|  |  * filled as it's used into the API. | ||||||
|  |  * @param (VL53L8CX_Platform*) p_platform : Pointer of VL53L8CX platform | ||||||
|  |  * structure. | ||||||
|  |  * @param (uint32_t) TimeMs : Time to wait in ms. | ||||||
|  |  * @return (uint8_t) status : 0 if wait is finished. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t WaitMs( | ||||||
|  | 		VL53L8CX_Platform *p_platform, | ||||||
|  | 		uint32_t TimeMs); | ||||||
|  | 
 | ||||||
|  | #endif	// _PLATFORM_H_
 | ||||||
							
								
								
									
										6
									
								
								VL53L8CX_ULD_API/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								VL53L8CX_ULD_API/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | This software component is provided to you as part of a software package and | ||||||
|  | applicable license terms are in the  Package_license file. If you received this | ||||||
|  | software component outside of a package or without applicable license terms, | ||||||
|  | the terms of the BSD-3-Clause license shall apply.  | ||||||
|  | You may obtain a copy of the BSD-3-Clause at: | ||||||
|  | https://opensource.org/licenses/BSD-3-Clause | ||||||
							
								
								
									
										730
									
								
								VL53L8CX_ULD_API/inc/vl53l8cx_api.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										730
									
								
								VL53L8CX_ULD_API/inc/vl53l8cx_api.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,730 @@ | |||||||
|  | /**
 | ||||||
|  |   * | ||||||
|  |   * Copyright (c) 2021 STMicroelectronics. | ||||||
|  |   * All rights reserved. | ||||||
|  |   * | ||||||
|  |   * This software is licensed under terms that can be found in the LICENSE file | ||||||
|  |   * in the root directory of this software component. | ||||||
|  |   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||||
|  |   * | ||||||
|  |   ****************************************************************************** | ||||||
|  |   */ | ||||||
|  | 
 | ||||||
|  | #ifndef VL53L8CX_API_H_ | ||||||
|  | #define VL53L8CX_API_H_ | ||||||
|  | 
 | ||||||
|  | #if defined (__ARMCC_VERSION) && (__ARMCC_VERSION < 6010050) | ||||||
|  | #pragma anon_unions | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #include "../../Platform/platform.h" | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Current driver version. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_API_REVISION			"VL53L8CX_1.1.0" | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Default I2C address of VL53L8CX sensor. Can be changed using function | ||||||
|  |  * vl53l8cx_set_i2c_address() function is called. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_DEFAULT_I2C_ADDRESS	        ((uint16_t)0x52) | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Macro VL53L8CX_RESOLUTION_4X4 or VL53L8CX_RESOLUTION_8X8 allows | ||||||
|  |  * setting sensor in 4x4 mode or 8x8 mode, using function | ||||||
|  |  * vl53l8cx_set_resolution(). | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_RESOLUTION_4X4			((uint8_t) 16U) | ||||||
|  | #define VL53L8CX_RESOLUTION_8X8			((uint8_t) 64U) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Macro VL53L8CX_TARGET_ORDER_STRONGEST or VL53L8CX_TARGET_ORDER_CLOSEST | ||||||
|  |  *	are used to select the target order for data output. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_TARGET_ORDER_CLOSEST		((uint8_t) 1U) | ||||||
|  | #define VL53L8CX_TARGET_ORDER_STRONGEST		((uint8_t) 2U) | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Macro VL53L8CX_RANGING_MODE_CONTINUOUS and | ||||||
|  |  * VL53L8CX_RANGING_MODE_AUTONOMOUS are used to change the ranging mode. | ||||||
|  |  * Autonomous mode can be used to set a precise integration time, whereas | ||||||
|  |  * continuous is always maximum. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_RANGING_MODE_CONTINUOUS	((uint8_t) 1U) | ||||||
|  | #define VL53L8CX_RANGING_MODE_AUTONOMOUS	((uint8_t) 3U) | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief The default power mode is VL53L8CX_POWER_MODE_WAKEUP. User can choose | ||||||
|  |  * the mode VL53L8CX_POWER_MODE_SLEEP to save power consumption is the device | ||||||
|  |  * is not used. The low power mode retains the firmware and the configuration. | ||||||
|  |  * Both modes can be changed using function vl53l8cx_set_power_mode(). | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_POWER_MODE_SLEEP		((uint8_t) 0U) | ||||||
|  | #define VL53L8CX_POWER_MODE_WAKEUP		((uint8_t) 1U) | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Macro VL53L8CX_STATUS_OK indicates that VL53L5 sensor has no error. | ||||||
|  |  * Macro VL53L8CX_STATUS_ERROR indicates that something is wrong (value, | ||||||
|  |  * I2C access, ...). Macro VL53L8CX_MCU_ERROR is used to indicate a MCU issue. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_STATUS_OK					((uint8_t) 0U) | ||||||
|  | #define VL53L8CX_STATUS_TIMEOUT_ERROR		((uint8_t) 1U) | ||||||
|  | #define VL53L8CX_STATUS_CORRUPTED_FRAME		((uint8_t) 2U) | ||||||
|  | #define VL53L8CX_STATUS_LASER_SAFETY		((uint8_t) 3U) | ||||||
|  | #define VL53L8CX_STATUS_XTALK_FAILED		((uint8_t) 4U) | ||||||
|  | #define VL53L8CX_STATUS_FW_CHECKSUM_FAIL	((uint8_t) 5U) | ||||||
|  | #define VL53L8CX_MCU_ERROR					((uint8_t) 66U) | ||||||
|  | #define VL53L8CX_STATUS_INVALID_PARAM		((uint8_t) 127U) | ||||||
|  | #define VL53L8CX_STATUS_ERROR				((uint8_t) 255U) | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Definitions for Range results block headers | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #if VL53L8CX_NB_TARGET_PER_ZONE == 1 | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_START_BH				((uint32_t)0x0000000DU) | ||||||
|  | #define VL53L8CX_METADATA_BH			((uint32_t)0x54B400C0U) | ||||||
|  | #define VL53L8CX_COMMONDATA_BH			((uint32_t)0x54C00040U) | ||||||
|  | #define VL53L8CX_AMBIENT_RATE_BH		((uint32_t)0x54D00104U) | ||||||
|  | #define VL53L8CX_SPAD_COUNT_BH			((uint32_t)0x55D00404U) | ||||||
|  | #define VL53L8CX_NB_TARGET_DETECTED_BH	((uint32_t)0xDB840401U) | ||||||
|  | #define VL53L8CX_SIGNAL_RATE_BH			((uint32_t)0xDBC40404U) | ||||||
|  | #define VL53L8CX_RANGE_SIGMA_MM_BH		((uint32_t)0xDEC40402U) | ||||||
|  | #define VL53L8CX_DISTANCE_BH			((uint32_t)0xDF440402U) | ||||||
|  | #define VL53L8CX_REFLECTANCE_BH			((uint32_t)0xE0440401U) | ||||||
|  | #define VL53L8CX_TARGET_STATUS_BH		((uint32_t)0xE0840401U) | ||||||
|  | #define VL53L8CX_MOTION_DETECT_BH		((uint32_t)0xD85808C0U) | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_METADATA_IDX			((uint16_t)0x54B4U) | ||||||
|  | #define VL53L8CX_SPAD_COUNT_IDX			((uint16_t)0x55D0U) | ||||||
|  | #define VL53L8CX_AMBIENT_RATE_IDX		((uint16_t)0x54D0U) | ||||||
|  | #define VL53L8CX_NB_TARGET_DETECTED_IDX	((uint16_t)0xDB84U) | ||||||
|  | #define VL53L8CX_SIGNAL_RATE_IDX		((uint16_t)0xDBC4U) | ||||||
|  | #define VL53L8CX_RANGE_SIGMA_MM_IDX		((uint16_t)0xDEC4U) | ||||||
|  | #define VL53L8CX_DISTANCE_IDX			((uint16_t)0xDF44U) | ||||||
|  | #define VL53L8CX_REFLECTANCE_EST_PC_IDX	((uint16_t)0xE044U) | ||||||
|  | #define VL53L8CX_TARGET_STATUS_IDX		((uint16_t)0xE084U) | ||||||
|  | #define VL53L8CX_MOTION_DETEC_IDX		((uint16_t)0xD858U) | ||||||
|  | 
 | ||||||
|  | #else | ||||||
|  | #define VL53L8CX_START_BH				((uint32_t)0x0000000DU) | ||||||
|  | #define VL53L8CX_METADATA_BH			((uint32_t)0x54B400C0U) | ||||||
|  | #define VL53L8CX_COMMONDATA_BH			((uint32_t)0x54C00040U) | ||||||
|  | #define VL53L8CX_AMBIENT_RATE_BH		((uint32_t)0x54D00104U) | ||||||
|  | #define VL53L8CX_NB_TARGET_DETECTED_BH	((uint32_t)0x57D00401U) | ||||||
|  | #define VL53L8CX_SPAD_COUNT_BH			((uint32_t)0x55D00404U) | ||||||
|  | #define VL53L8CX_SIGNAL_RATE_BH			((uint32_t)0x58900404U) | ||||||
|  | #define VL53L8CX_RANGE_SIGMA_MM_BH		((uint32_t)0x64900402U) | ||||||
|  | #define VL53L8CX_DISTANCE_BH			((uint32_t)0x66900402U) | ||||||
|  | #define VL53L8CX_REFLECTANCE_BH			((uint32_t)0x6A900401U) | ||||||
|  | #define VL53L8CX_TARGET_STATUS_BH		((uint32_t)0x6B900401U) | ||||||
|  | #define VL53L8CX_MOTION_DETECT_BH		((uint32_t)0xCC5008C0U) | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_METADATA_IDX			((uint16_t)0x54B4U) | ||||||
|  | #define VL53L8CX_SPAD_COUNT_IDX			((uint16_t)0x55D0U) | ||||||
|  | #define VL53L8CX_AMBIENT_RATE_IDX		((uint16_t)0x54D0U) | ||||||
|  | #define VL53L8CX_NB_TARGET_DETECTED_IDX	((uint16_t)0x57D0U) | ||||||
|  | #define VL53L8CX_SIGNAL_RATE_IDX		((uint16_t)0x5890U) | ||||||
|  | #define VL53L8CX_RANGE_SIGMA_MM_IDX		((uint16_t)0x6490U) | ||||||
|  | #define VL53L8CX_DISTANCE_IDX			((uint16_t)0x6690U) | ||||||
|  | #define VL53L8CX_REFLECTANCE_EST_PC_IDX	((uint16_t)0x6A90U) | ||||||
|  | #define VL53L8CX_TARGET_STATUS_IDX		((uint16_t)0x6B90U) | ||||||
|  | #define VL53L8CX_MOTION_DETEC_IDX		((uint16_t)0xCC50U) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Inner Macro for API. Not for user, only for development. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_NVM_DATA_SIZE			((uint16_t)492U) | ||||||
|  | #define VL53L8CX_CONFIGURATION_SIZE		((uint16_t)972U) | ||||||
|  | #define VL53L8CX_OFFSET_BUFFER_SIZE		((uint16_t)488U) | ||||||
|  | #define VL53L8CX_XTALK_BUFFER_SIZE		((uint16_t)776U) | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_DCI_ZONE_CONFIG		((uint16_t)0x5450U) | ||||||
|  | #define VL53L8CX_DCI_FREQ_HZ			((uint16_t)0x5458U) | ||||||
|  | #define VL53L8CX_DCI_INT_TIME			((uint16_t)0x545CU) | ||||||
|  | #define VL53L8CX_DCI_FW_NB_TARGET		((uint16_t)0x5478) | ||||||
|  | #define VL53L8CX_DCI_RANGING_MODE		((uint16_t)0xAD30U) | ||||||
|  | #define VL53L8CX_DCI_DSS_CONFIG			((uint16_t)0xAD38U) | ||||||
|  | #define VL53L8CX_DCI_TARGET_ORDER		((uint16_t)0xAE64U) | ||||||
|  | #define VL53L8CX_DCI_SHARPENER			((uint16_t)0xAED8U) | ||||||
|  | #define VL53L8CX_DCI_INTERNAL_CP		((uint16_t)0xB39CU) | ||||||
|  | #define VL53L8CX_DCI_SYNC_PIN			((uint16_t)0xB5F0U) | ||||||
|  | #define VL53L8CX_DCI_MOTION_DETECTOR_CFG ((uint16_t)0xBFACU) | ||||||
|  | #define VL53L8CX_DCI_SINGLE_RANGE		((uint16_t)0xD964U) | ||||||
|  | #define VL53L8CX_DCI_OUTPUT_CONFIG		((uint16_t)0xD968U) | ||||||
|  | #define VL53L8CX_DCI_OUTPUT_ENABLES		((uint16_t)0xD970U) | ||||||
|  | #define VL53L8CX_DCI_OUTPUT_LIST		((uint16_t)0xD980U) | ||||||
|  | #define VL53L8CX_DCI_PIPE_CONTROL		((uint16_t)0xDB80U) | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_UI_CMD_STATUS			((uint16_t)0x2C00U) | ||||||
|  | #define VL53L8CX_UI_CMD_START			((uint16_t)0x2C04U) | ||||||
|  | #define VL53L8CX_UI_CMD_END				((uint16_t)0x2FFFU) | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Inner values for API. Max buffer size depends of the selected output. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef VL53L8CX_DISABLE_AMBIENT_PER_SPAD | ||||||
|  | #define L5CX_AMB_SIZE	260U | ||||||
|  | #else | ||||||
|  | #define L5CX_AMB_SIZE	0U | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifndef VL53L8CX_DISABLE_NB_SPADS_ENABLED | ||||||
|  | #define L5CX_SPAD_SIZE	260U | ||||||
|  | #else | ||||||
|  | #define L5CX_SPAD_SIZE	0U | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifndef VL53L8CX_DISABLE_NB_TARGET_DETECTED | ||||||
|  | #define L5CX_NTAR_SIZE	68U | ||||||
|  | #else | ||||||
|  | #define L5CX_NTAR_SIZE	0U | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifndef VL53L8CX_DISABLE_SIGNAL_PER_SPAD | ||||||
|  | #define L5CX_SPS_SIZE ((256U * VL53L8CX_NB_TARGET_PER_ZONE) + 4U) | ||||||
|  | #else | ||||||
|  | #define L5CX_SPS_SIZE	0U | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifndef VL53L8CX_DISABLE_RANGE_SIGMA_MM | ||||||
|  | #define L5CX_SIGR_SIZE ((128U * VL53L8CX_NB_TARGET_PER_ZONE) + 4U) | ||||||
|  | #else | ||||||
|  | #define L5CX_SIGR_SIZE	0U | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifndef VL53L8CX_DISABLE_DISTANCE_MM | ||||||
|  | #define L5CX_DIST_SIZE ((128U * VL53L8CX_NB_TARGET_PER_ZONE) + 4U) | ||||||
|  | #else | ||||||
|  | #define L5CX_DIST_SIZE	0U | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifndef VL53L8CX_DISABLE_REFLECTANCE_PERCENT | ||||||
|  | #define L5CX_RFLEST_SIZE ((64U *VL53L8CX_NB_TARGET_PER_ZONE) + 4U) | ||||||
|  | #else | ||||||
|  | #define L5CX_RFLEST_SIZE	0U | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifndef VL53L8CX_DISABLE_TARGET_STATUS | ||||||
|  | #define L5CX_STA_SIZE ((64U  *VL53L8CX_NB_TARGET_PER_ZONE) + 4U) | ||||||
|  | #else | ||||||
|  | #define L5CX_STA_SIZE	0U | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifndef VL53L8CX_DISABLE_MOTION_INDICATOR | ||||||
|  | #define L5CX_MOT_SIZE	144U | ||||||
|  | #else | ||||||
|  | #define L5CX_MOT_SIZE	0U | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Macro VL53L8CX_MAX_RESULTS_SIZE indicates the maximum size used by | ||||||
|  |  * output through I2C. Value 40 corresponds to headers + meta-data + common-data | ||||||
|  |  * and 20 corresponds to the footer. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_MAX_RESULTS_SIZE ( 40U \ | ||||||
|  | 	+ L5CX_AMB_SIZE + L5CX_SPAD_SIZE + L5CX_NTAR_SIZE + L5CX_SPS_SIZE \ | ||||||
|  | 	+ L5CX_SIGR_SIZE + L5CX_DIST_SIZE + L5CX_RFLEST_SIZE + L5CX_STA_SIZE \ | ||||||
|  | 	+ L5CX_MOT_SIZE + 20U) | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Macro VL53L8CX_TEMPORARY_BUFFER_SIZE can be used to know the size of | ||||||
|  |  * the temporary buffer. The minimum size is 1024, and the maximum depends of | ||||||
|  |  * the output configuration. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #if VL53L8CX_MAX_RESULTS_SIZE < 1024U | ||||||
|  | #define VL53L8CX_TEMPORARY_BUFFER_SIZE ((uint32_t) 1024U) | ||||||
|  | #else | ||||||
|  | #define VL53L8CX_TEMPORARY_BUFFER_SIZE ((uint32_t) VL53L8CX_MAX_RESULTS_SIZE) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Structure VL53L8CX_Configuration contains the sensor configuration. | ||||||
|  |  * User MUST not manually change these field, except for the sensor address. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  | 	/* Platform, filled by customer into the 'platform.h' file */ | ||||||
|  | 	VL53L8CX_Platform	platform; | ||||||
|  | 	/* Results streamcount, value auto-incremented at each range */ | ||||||
|  | 	uint8_t		        streamcount; | ||||||
|  | 	/* Size of data read though I2C */ | ||||||
|  | 	uint32_t	        data_read_size; | ||||||
|  | 	/* Address of default configuration buffer */ | ||||||
|  | 	uint8_t		        *default_configuration; | ||||||
|  | 	/* Address of default Xtalk buffer */ | ||||||
|  | 	uint8_t		        *default_xtalk; | ||||||
|  | 	/* Offset buffer */ | ||||||
|  | 	uint8_t		        offset_data[VL53L8CX_OFFSET_BUFFER_SIZE]; | ||||||
|  | 	/* Xtalk buffer */ | ||||||
|  | 	uint8_t		        xtalk_data[VL53L8CX_XTALK_BUFFER_SIZE]; | ||||||
|  | 	/* Temporary buffer used for internal driver processing */ | ||||||
|  | 	uint8_t		        temp_buffer[VL53L8CX_TEMPORARY_BUFFER_SIZE]; | ||||||
|  | 	/* Auto-stop flag for stopping the sensor */ | ||||||
|  | 	uint8_t				is_auto_stop_enabled; | ||||||
|  | } VL53L8CX_Configuration; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Structure VL53L8CX_ResultsData contains the ranging results of | ||||||
|  |  * VL53L8CX. If user wants more than 1 target per zone, the results can be split | ||||||
|  |  * into 2 sub-groups : | ||||||
|  |  * - Per zone results. These results are common to all targets (ambient_per_spad | ||||||
|  |  * , nb_target_detected and nb_spads_enabled). | ||||||
|  |  * - Per target results : These results are different relative to the detected | ||||||
|  |  * target (signal_per_spad, range_sigma_mm, distance_mm, reflectance, | ||||||
|  |  * target_status). | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  | 	/* Internal sensor silicon temperature */ | ||||||
|  | 	int8_t silicon_temp_degc; | ||||||
|  | 
 | ||||||
|  | 	/* Ambient noise in kcps/spads */ | ||||||
|  | #ifndef VL53L8CX_DISABLE_AMBIENT_PER_SPAD | ||||||
|  | 	uint32_t ambient_per_spad[VL53L8CX_RESOLUTION_8X8]; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 	/* Number of valid target detected for 1 zone */ | ||||||
|  | #ifndef VL53L8CX_DISABLE_NB_TARGET_DETECTED | ||||||
|  | 	uint8_t nb_target_detected[VL53L8CX_RESOLUTION_8X8]; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 	/* Number of spads enabled for this ranging */ | ||||||
|  | #ifndef VL53L8CX_DISABLE_NB_SPADS_ENABLED | ||||||
|  | 	uint32_t nb_spads_enabled[VL53L8CX_RESOLUTION_8X8]; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 	/* Signal returned to the sensor in kcps/spads */ | ||||||
|  | #ifndef VL53L8CX_DISABLE_SIGNAL_PER_SPAD | ||||||
|  | 	uint32_t signal_per_spad[(VL53L8CX_RESOLUTION_8X8 | ||||||
|  | 					*VL53L8CX_NB_TARGET_PER_ZONE)]; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 	/* Sigma of the current distance in mm */ | ||||||
|  | #ifndef VL53L8CX_DISABLE_RANGE_SIGMA_MM | ||||||
|  | 	uint16_t range_sigma_mm[(VL53L8CX_RESOLUTION_8X8 | ||||||
|  | 					*VL53L8CX_NB_TARGET_PER_ZONE)]; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 	/* Measured distance in mm */ | ||||||
|  | #ifndef VL53L8CX_DISABLE_DISTANCE_MM | ||||||
|  | 	int16_t distance_mm[(VL53L8CX_RESOLUTION_8X8 | ||||||
|  | 					*VL53L8CX_NB_TARGET_PER_ZONE)]; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 	/* Estimated reflectance in percent */ | ||||||
|  | #ifndef VL53L8CX_DISABLE_REFLECTANCE_PERCENT | ||||||
|  | 	uint8_t reflectance[(VL53L8CX_RESOLUTION_8X8 | ||||||
|  | 					*VL53L8CX_NB_TARGET_PER_ZONE)]; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 	/* Status indicating the measurement validity (5 & 9 means ranging OK)*/ | ||||||
|  | #ifndef VL53L8CX_DISABLE_TARGET_STATUS | ||||||
|  | 	uint8_t target_status[(VL53L8CX_RESOLUTION_8X8 | ||||||
|  | 					*VL53L8CX_NB_TARGET_PER_ZONE)]; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 	/* Motion detector results */ | ||||||
|  | #ifndef VL53L8CX_DISABLE_MOTION_INDICATOR | ||||||
|  | 	struct | ||||||
|  | 	{ | ||||||
|  | 		uint32_t global_indicator_1; | ||||||
|  | 		uint32_t global_indicator_2; | ||||||
|  | 		uint8_t	 status; | ||||||
|  | 		uint8_t	 nb_of_detected_aggregates; | ||||||
|  | 		uint8_t	 nb_of_aggregates; | ||||||
|  | 		uint8_t	 spare; | ||||||
|  | 		uint32_t motion[32]; | ||||||
|  | 	} motion_indicator; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | } VL53L8CX_ResultsData; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | union Block_header { | ||||||
|  | 	uint32_t bytes; | ||||||
|  | 	struct { | ||||||
|  | 		uint32_t type : 4; | ||||||
|  | 		uint32_t size : 12; | ||||||
|  | 		uint32_t idx : 16; | ||||||
|  | 	}; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_is_alive( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				*p_is_alive); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Mandatory function used to initialize the sensor. This function must | ||||||
|  |  * be called after a power on, to load the firmware into the VL53L8CX. It takes | ||||||
|  |  * a few hundred milliseconds. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @return (uint8_t) status : 0 if initialization is OK. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_init( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function is used to change the I2C address of the sensor. If | ||||||
|  |  * multiple VL53L5 sensors are connected to the same I2C line, all other LPn | ||||||
|  |  * pins needs to be set to Low. The default sensor address is 0x52. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint16_t) i2c_address : New I2C address. | ||||||
|  |  * @return (uint8_t) status : 0 if new address is OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_set_i2c_address( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint16_t			i2c_address); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function is used to get the current sensor power mode. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint8_t) *p_power_mode : Current power mode. The value of this | ||||||
|  |  * pointer is equal to 0 if the sensor is in low power, | ||||||
|  |  * (VL53L8CX_POWER_MODE_SLEEP), or 1 if sensor is in standard mode | ||||||
|  |  * (VL53L8CX_POWER_MODE_WAKEUP). | ||||||
|  |  * @return (uint8_t) status : 0 if power mode is OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_get_power_mode( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				*p_power_mode); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function is used to set the sensor in Low Power mode, for | ||||||
|  |  * example if the sensor is not used during a long time. The macro | ||||||
|  |  * VL53L8CX_POWER_MODE_SLEEP can be used to enable the low power mode. When user | ||||||
|  |  * want to restart the sensor, he can use macro VL53L8CX_POWER_MODE_WAKEUP. | ||||||
|  |  * Please ensure that the device is not streaming before calling the function. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint8_t) power_mode : Selected power mode (VL53L8CX_POWER_MODE_SLEEP | ||||||
|  |  * or VL53L8CX_POWER_MODE_WAKEUP) | ||||||
|  |  * @return (uint8_t) status : 0 if power mode is OK, or 127 if power mode | ||||||
|  |  * requested by user is not valid. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_set_power_mode( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				power_mode); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function starts a ranging session. When the sensor streams, host | ||||||
|  |  * cannot change settings 'on-the-fly'. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @return (uint8_t) status : 0 if start is OK. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_start_ranging( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function stops the ranging session. It must be used when the | ||||||
|  |  * sensor streams, after calling vl53l8cx_start_ranging(). | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @return (uint8_t) status : 0 if stop is OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_stop_ranging( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function checks if a new data is ready by polling I2C. If a new | ||||||
|  |  * data is ready, a flag will be raised. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint8_t) *p_isReady : Value of this pointer be updated to 0 if data | ||||||
|  |  * is not ready, or 1 if a new data is ready. | ||||||
|  |  * @return (uint8_t) status : 0 if I2C reading is OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_check_data_ready( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				*p_isReady); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function gets the ranging data, using the selected output and the | ||||||
|  |  * resolution. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (VL53L8CX_ResultsData) *p_results : VL53L5 results structure. | ||||||
|  |  * @return (uint8_t) status : 0 data are successfully get. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_get_ranging_data( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		VL53L8CX_ResultsData		*p_results); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function gets the current resolution (4x4 or 8x8). | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint8_t) *p_resolution : Value of this pointer will be equal to 16 | ||||||
|  |  * for 4x4 mode, and 64 for 8x8 mode. | ||||||
|  |  * @return (uint8_t) status : 0 if resolution is OK. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_get_resolution( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				*p_resolution); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function sets a new resolution (4x4 or 8x8). | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint8_t) resolution : Use macro VL53L8CX_RESOLUTION_4X4 or | ||||||
|  |  * VL53L8CX_RESOLUTION_8X8 to set the resolution. | ||||||
|  |  * @return (uint8_t) status : 0 if set resolution is OK. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_set_resolution( | ||||||
|  | 		VL53L8CX_Configuration		 *p_dev, | ||||||
|  | 		uint8_t                         resolution); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function gets the current ranging frequency in Hz. Ranging | ||||||
|  |  * frequency corresponds to the time between each measurement. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint8_t) *p_frequency_hz: Contains the ranging frequency in Hz. | ||||||
|  |  * @return (uint8_t) status : 0 if ranging frequency is OK. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_get_ranging_frequency_hz( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				*p_frequency_hz); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function sets a new ranging frequency in Hz. Ranging frequency | ||||||
|  |  * corresponds to the measurements frequency. This setting depends of | ||||||
|  |  * the resolution, so please select your resolution before using this function. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint8_t) frequency_hz : Contains the ranging frequency in Hz. | ||||||
|  |  * - For 4x4, min and max allowed values are : [1;60] | ||||||
|  |  * - For 8x8, min and max allowed values are : [1;15] | ||||||
|  |  * @return (uint8_t) status : 0 if ranging frequency is OK, or 127 if the value | ||||||
|  |  * is not correct. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_set_ranging_frequency_hz( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				frequency_hz); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function gets the current integration time in ms. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint32_t) *p_time_ms: Contains integration time in ms. | ||||||
|  |  * @return (uint8_t) status : 0 if integration time is OK. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_get_integration_time_ms( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint32_t			*p_time_ms); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function sets a new integration time in ms. Integration time must | ||||||
|  |  * be computed to be lower than the ranging period, for a selected resolution. | ||||||
|  |  * Please note that this function has no impact on ranging mode continous. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint32_t) time_ms : Contains the integration time in ms. For all | ||||||
|  |  * resolutions and frequency, the minimum value is 2ms, and the maximum is | ||||||
|  |  * 1000ms. | ||||||
|  |  * @return (uint8_t) status : 0 if set integration time is OK. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_set_integration_time_ms( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint32_t			integration_time_ms); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function gets the current sharpener in percent. Sharpener can be | ||||||
|  |  * changed to blur more or less zones depending of the application. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint32_t) *p_sharpener_percent: Contains the sharpener in percent. | ||||||
|  |  * @return (uint8_t) status : 0 if get sharpener is OK. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_get_sharpener_percent( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				*p_sharpener_percent); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function sets a new sharpener value in percent. Sharpener can be | ||||||
|  |  * changed to blur more or less zones depending of the application. Min value is | ||||||
|  |  * 0 (disabled), and max is 99. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint32_t) sharpener_percent : Value between 0 (disabled) and 99%. | ||||||
|  |  * @return (uint8_t) status : 0 if set sharpener is OK. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_set_sharpener_percent( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				sharpener_percent); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function gets the current target order (closest or strongest). | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint8_t) *p_target_order: Contains the target order. | ||||||
|  |  * @return (uint8_t) status : 0 if get target order is OK. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_get_target_order( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				*p_target_order); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function sets a new target order. Please use macros | ||||||
|  |  * VL53L8CX_TARGET_ORDER_STRONGEST and VL53L8CX_TARGET_ORDER_CLOSEST to define | ||||||
|  |  * the new output order. By default, the sensor is configured with the strongest | ||||||
|  |  * output. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint8_t) target_order : Required target order. | ||||||
|  |  * @return (uint8_t) status : 0 if set target order is OK, or 127 if target | ||||||
|  |  * order is unknown. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_set_target_order( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				target_order); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function is used to get the ranging mode. Two modes are | ||||||
|  |  * available using ULD : Continuous and autonomous. The default | ||||||
|  |  * mode is Autonomous. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint8_t) *p_ranging_mode : current ranging mode | ||||||
|  |  * @return (uint8_t) status : 0 if get ranging mode is OK. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_get_ranging_mode( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				*p_ranging_mode); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function is used to set the ranging mode. Two modes are | ||||||
|  |  * available using ULD : Continuous and autonomous. The default | ||||||
|  |  * mode is Autonomous. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint8_t) ranging_mode : Use macros VL53L8CX_RANGING_MODE_CONTINUOUS, | ||||||
|  |  * VL53L8CX_RANGING_MODE_CONTINUOUS. | ||||||
|  |  * @return (uint8_t) status : 0 if set ranging mode is OK. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_set_ranging_mode( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				ranging_mode); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function is used to check if the synchronization pin is enabled | ||||||
|  |  * or disabled. When it is enabled, the sensor waits an interrupt on B1 pin | ||||||
|  |  * to start the next measurement. It is useful for multi-devices | ||||||
|  |  * synchronization. By default the sync pin is disabled. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint8_t*) p_is_sync_pin_enabled : Pointer of sync pin status. Value | ||||||
|  |  * overridden to 0 if the pin is disabled, or 1 if the pin is enabled. | ||||||
|  |  * @return (uint8_t) status : 0 if get sync pin OK. | ||||||
|  |  */ | ||||||
|  | uint8_t vl53l8cx_get_external_sync_pin_enable( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				*p_is_sync_pin_enabled); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function is used to enable or disable the synchronization pin. When | ||||||
|  |  * it is enabled, the sensor waits an interrupt on B1 pin to start the next | ||||||
|  |  * measurement. It is useful for multi-devices synchronization. By default the sync | ||||||
|  |  * pin is disabled. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint8_t) enable_sync_pin : Ste the value to 1 to enable the sync | ||||||
|  |  * pin, or 0 to disable it. | ||||||
|  |  * @return (uint8_t) status : 0 if set sync pin OK. | ||||||
|  |  */ | ||||||
|  | uint8_t vl53l8cx_set_external_sync_pin_enable( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				enable_sync_pin); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function can be used to read 'extra data' from DCI. Using a known | ||||||
|  |  * index, the function fills the casted structure passed in argument. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint8_t) *data : This field can be a casted structure, or a simple | ||||||
|  |  * array. Please note that the FW only accept data of 32 bits. So field data can | ||||||
|  |  * only have a size of 32, 64, 96, 128, bits .... | ||||||
|  |  * @param (uint32_t) index : Index of required value. | ||||||
|  |  * @param (uint16_t)*data_size : This field must be the structure or array size | ||||||
|  |  * (using sizeof() function). | ||||||
|  |  * @return (uint8_t) status : 0 if OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_dci_read_data( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				*data, | ||||||
|  | 		uint32_t			index, | ||||||
|  | 		uint16_t			data_size); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function can be used to write 'extra data' to DCI. The data can | ||||||
|  |  * be simple data, or casted structure. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint8_t) *data : This field can be a casted structure, or a simple | ||||||
|  |  * array. Please note that the FW only accept data of 32 bits. So field data can | ||||||
|  |  * only have a size of 32, 64, 96, 128, bits .. | ||||||
|  |  * @param (uint32_t) index : Index of required value. | ||||||
|  |  * @param (uint16_t)*data_size : This field must be the structure or array size | ||||||
|  |  * (using sizeof() function). | ||||||
|  |  * @return (uint8_t) status : 0 if OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_dci_write_data( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				*data, | ||||||
|  | 		uint32_t			index, | ||||||
|  | 		uint16_t			data_size); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function can be used to replace 'extra data' in DCI. The data can | ||||||
|  |  * be simple data, or casted structure. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint8_t) *data : This field can be a casted structure, or a simple | ||||||
|  |  * array. Please note that the FW only accept data of 32 bits. So field data can | ||||||
|  |  * only have a size of 32, 64, 96, 128, bits .. | ||||||
|  |  * @param (uint32_t) index : Index of required value. | ||||||
|  |  * @param (uint16_t)*data_size : This field must be the structure or array size | ||||||
|  |  * (using sizeof() function). | ||||||
|  |  * @param (uint8_t) *new_data : Contains the new fields. | ||||||
|  |  * @param (uint16_t) new_data_size : New data size. | ||||||
|  |  * @param (uint16_t) new_data_pos : New data position into the buffer. | ||||||
|  |  * @return (uint8_t) status : 0 if OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_dci_replace_data( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				*data, | ||||||
|  | 		uint32_t			index, | ||||||
|  | 		uint16_t			data_size, | ||||||
|  | 		uint8_t				*new_data, | ||||||
|  | 		uint16_t			new_data_size, | ||||||
|  | 		uint16_t			new_data_pos); | ||||||
|  | 
 | ||||||
|  | #endif //VL53L8CX_API_H_
 | ||||||
							
								
								
									
										22010
									
								
								VL53L8CX_ULD_API/inc/vl53l8cx_buffers.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22010
									
								
								VL53L8CX_ULD_API/inc/vl53l8cx_buffers.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										186
									
								
								VL53L8CX_ULD_API/inc/vl53l8cx_plugin_detection_thresholds.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								VL53L8CX_ULD_API/inc/vl53l8cx_plugin_detection_thresholds.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,186 @@ | |||||||
|  | /**
 | ||||||
|  |   * | ||||||
|  |   * Copyright (c) 2021 STMicroelectronics. | ||||||
|  |   * All rights reserved. | ||||||
|  |   * | ||||||
|  |   * This software is licensed under terms that can be found in the LICENSE file | ||||||
|  |   * in the root directory of this software component. | ||||||
|  |   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||||
|  |   * | ||||||
|  |   ****************************************************************************** | ||||||
|  |   */ | ||||||
|  | 
 | ||||||
|  | #ifndef VL53L8CX_PLUGIN_DETECTION_THRESHOLDS_H_ | ||||||
|  | #define VL53L8CX_PLUGIN_DETECTION_THRESHOLDS_H_ | ||||||
|  | 
 | ||||||
|  | #include "vl53l8cx_api.h" | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Macro VL53L8CX_NB_THRESHOLDS indicates the number of checkers. This | ||||||
|  |  * value cannot be changed. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_NB_THRESHOLDS				((uint8_t)64U) | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Inner Macro for API. Not for user, only for development. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_DCI_DET_THRESH_CONFIG			((uint16_t)0x5488U) | ||||||
|  | #define VL53L8CX_DCI_DET_THRESH_GLOBAL_CONFIG	((uint16_t)0xB6E0U) | ||||||
|  | #define VL53L8CX_DCI_DET_THRESH_START			((uint16_t)0xB6E8U) | ||||||
|  | #define VL53L8CX_DCI_DET_THRESH_VALID_STATUS	((uint16_t)0xB9F0U) | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Macro VL53L8CX_LAST_THRESHOLD is used to indicate the end of checkers | ||||||
|  |  * programming. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_LAST_THRESHOLD				((uint8_t)128U) | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief The following macro are used to define the 'param_type' of a checker. | ||||||
|  |  * They indicate what is the measurement to catch. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_DISTANCE_MM				((uint8_t)1U) | ||||||
|  | #define VL53L8CX_SIGNAL_PER_SPAD_KCPS 		((uint8_t)2U) | ||||||
|  | #define VL53L8CX_RANGE_SIGMA_MM		 		((uint8_t)4U) | ||||||
|  | #define VL53L8CX_AMBIENT_PER_SPAD_KCPS 		((uint8_t)8U) | ||||||
|  | #define VL53L8CX_NB_TARGET_DETECTED	 		((uint8_t)9U) | ||||||
|  | #define VL53L8CX_TARGET_STATUS				((uint8_t)12U) | ||||||
|  | #define VL53L8CX_NB_SPADS_ENABLED			((uint8_t)13U) | ||||||
|  | #define VL53L8CX_MOTION_INDICATOR          	((uint8_t)19U) | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief The following macro are used to define the 'type' of a checker. | ||||||
|  |  * They indicate the window of measurements, defined by low and a high | ||||||
|  |  * thresholds. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_IN_WINDOW					((uint8_t)0U) | ||||||
|  | #define VL53L8CX_OUT_OF_WINDOW				((uint8_t)1U) | ||||||
|  | #define VL53L8CX_LESS_THAN_EQUAL_MIN_CHECKER ((uint8_t)2U) | ||||||
|  | #define VL53L8CX_GREATER_THAN_MAX_CHECKER	((uint8_t)3U) | ||||||
|  | #define VL53L8CX_EQUAL_MIN_CHECKER			((uint8_t)4U) | ||||||
|  | #define VL53L8CX_NOT_EQUAL_MIN_CHECKER		((uint8_t)5U) | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief The following macro are used to define multiple checkers in the same | ||||||
|  |  * zone, using operators. Please note that the first checker MUST always be a OR | ||||||
|  |  * operation. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_OPERATION_NONE				((uint8_t)0U) | ||||||
|  | #define VL53L8CX_OPERATION_OR				((uint8_t)0U) | ||||||
|  | #define VL53L8CX_OPERATION_AND				((uint8_t)2U) | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Structure VL53L8CX_DetectionThresholds contains a single threshold. | ||||||
|  |  * This structure  is never used alone, it must be used as an array of 64 | ||||||
|  |  * thresholds (defined by macro VL53L8CX_NB_THRESHOLDS). | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | typedef struct { | ||||||
|  | 
 | ||||||
|  | 	/* Low threshold */ | ||||||
|  | 	int32_t 	param_low_thresh; | ||||||
|  | 	/* High threshold */ | ||||||
|  | 	int32_t 	param_high_thresh; | ||||||
|  | 	/* Measurement to catch (VL53L8CX_MEDIAN_RANGE_MM,...)*/ | ||||||
|  | 	uint8_t 	measurement; | ||||||
|  | 	/* Windows type (VL53L8CX_IN_WINDOW, VL53L8CX_OUT_WINDOW, ...) */ | ||||||
|  | 	uint8_t 	type; | ||||||
|  | 	/* Zone id. Please read VL53L5 user manual to find the zone id.Set macro
 | ||||||
|  | 	 * VL53L8CX_LAST_THRESHOLD to indicates the end of checkers */ | ||||||
|  | 	uint8_t 	zone_num; | ||||||
|  | 	/* Mathematics operation (AND/OR). The first threshold is always OR.*/ | ||||||
|  | 	uint8_t		mathematic_operation; | ||||||
|  | }VL53L8CX_DetectionThresholds; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function allows indicating if the detection thresholds are | ||||||
|  |  * enabled. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint8_t) *p_enabled : Set to 1 if enabled, or 0 if disable. | ||||||
|  |  * @return (uint8_t) status : 0 if OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_get_detection_thresholds_enable( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				*p_enabled); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function allows enable the detection thresholds. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint8_t) enabled : Set to 1 to enable, or 0 to disable thresholds. | ||||||
|  |  * @return (uint8_t) status : 0 if programming is OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_set_detection_thresholds_enable( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				enabled); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function allows getting the detection thresholds. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (VL53L8CX_DetectionThresholds) *p_thresholds : Array of 64 thresholds. | ||||||
|  |  * @return (uint8_t) status : 0 if programming is OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_get_detection_thresholds( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		VL53L8CX_DetectionThresholds	*p_thresholds); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function allows programming the detection thresholds. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (VL53L8CX_DetectionThresholds) *p_thresholds :  Array of 64 thresholds. | ||||||
|  |  * @return (uint8_t) status : 0 if programming is OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_set_detection_thresholds( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		VL53L8CX_DetectionThresholds	*p_thresholds); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function is used to enable or disable the auto-stop feature. | ||||||
|  |  * When ToF runs in autonomous mode with detection threshold, the sensor | ||||||
|  |  * only emits an interrupt (INT pin) when a threshold is reached. Interrupt | ||||||
|  |  * is raised when the measurement is completed. It is possible to abort the ranging | ||||||
|  |  * without waiting for end of measurement completed by enabling the auto-stop. The | ||||||
|  |  * sensor emits an interrupt and quickly aborts the measurements in progress. Please | ||||||
|  |  * note that vl53l8cx_stop_ranging() function needs to be used after interrupt raised | ||||||
|  |  * for a clean stop. | ||||||
|  |  * This function is used to get the auto_stop flag. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint8_t) *p_auto_stop :  Pointer of auto-stop feature, 0 disabled | ||||||
|  |  * (default) or 1 enabled. | ||||||
|  |  * @return (uint8_t) status : 0 if programming is OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_get_detection_thresholds_auto_stop( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				*p_auto_stop); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function is used to enable or disable the auto-stop feature. | ||||||
|  |  * When ToF runs in autonomous mode with detection threshold, the sensor | ||||||
|  |  * only emits an interrupt (INT pin) when a threshold is reached. Interrupt | ||||||
|  |  * is raised when the measurement is completed. It is possible to abort the ranging | ||||||
|  |  * without waiting for end of measurement completed by enabling the auto-stop. The | ||||||
|  |  * sensor emits an interrupt and quickly aborts the measurements in progress. Please | ||||||
|  |  * note that vl53l8cx_stop_ranging() function needs to be used after interrupt raised | ||||||
|  |  * for a clean stop. | ||||||
|  |  * This function is used to set the auto_stop flag. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint8_t) *p_auto_stop :  Pointer of auto-stop feature, 0 disabled | ||||||
|  |  * (default) or 1 enabled. | ||||||
|  |  * @return (uint8_t) status : 0 if programming is OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_set_detection_thresholds_auto_stop( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				auto_stop); | ||||||
|  | 
 | ||||||
|  | #endif /* VL53L8CX_PLUGIN_DETECTION_THRESHOLDS_H_ */ | ||||||
							
								
								
									
										96
									
								
								VL53L8CX_ULD_API/inc/vl53l8cx_plugin_motion_indicator.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								VL53L8CX_ULD_API/inc/vl53l8cx_plugin_motion_indicator.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,96 @@ | |||||||
|  | /**
 | ||||||
|  |   * | ||||||
|  |   * Copyright (c) 2021 STMicroelectronics. | ||||||
|  |   * All rights reserved. | ||||||
|  |   * | ||||||
|  |   * This software is licensed under terms that can be found in the LICENSE file | ||||||
|  |   * in the root directory of this software component. | ||||||
|  |   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||||
|  |   * | ||||||
|  |   ****************************************************************************** | ||||||
|  |   */ | ||||||
|  | 
 | ||||||
|  | #ifndef VL53L8CX_PLUGIN_MOTION_INDICATOR_H_ | ||||||
|  | #define VL53L8CX_PLUGIN_MOTION_INDICATOR_H_ | ||||||
|  | 
 | ||||||
|  | #include "vl53l8cx_api.h" | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Motion indicator internal configuration structure. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | typedef struct { | ||||||
|  | 	int32_t  ref_bin_offset; | ||||||
|  | 	uint32_t detection_threshold; | ||||||
|  | 	uint32_t extra_noise_sigma; | ||||||
|  | 	uint32_t null_den_clip_value; | ||||||
|  | 	uint8_t  mem_update_mode; | ||||||
|  | 	uint8_t  mem_update_choice; | ||||||
|  | 	uint8_t  sum_span; | ||||||
|  | 	uint8_t  feature_length; | ||||||
|  | 	uint8_t  nb_of_aggregates; | ||||||
|  | 	uint8_t  nb_of_temporal_accumulations; | ||||||
|  | 	uint8_t  min_nb_for_global_detection; | ||||||
|  | 	uint8_t  global_indicator_format_1; | ||||||
|  | 	uint8_t  global_indicator_format_2; | ||||||
|  | 	uint8_t  spare_1; | ||||||
|  | 	uint8_t  spare_2; | ||||||
|  | 	uint8_t  spare_3; | ||||||
|  | 	int8_t 	 map_id[64]; | ||||||
|  | 	uint8_t  indicator_format_1[32]; | ||||||
|  | 	uint8_t  indicator_format_2[32]; | ||||||
|  | }VL53L8CX_Motion_Configuration; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function is used to initialized the motion indicator. By default, | ||||||
|  |  * indicator is programmed to monitor movements between 400mm and 1500mm. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (VL53L8CX_Motion_Configuration) *p_motion_config : Structure | ||||||
|  |  * containing the initialized motion configuration. | ||||||
|  |  * @param (uint8_t) resolution : Wanted resolution, defined by macros | ||||||
|  |  * VL53L8CX_RESOLUTION_4X4 or VL53L8CX_RESOLUTION_8X8. | ||||||
|  |  * @return (uint8_t) status : 0 if OK, or 127 is the resolution is unknown. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_motion_indicator_init( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		VL53L8CX_Motion_Configuration	*p_motion_config, | ||||||
|  | 		uint8_t				resolution); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function can be used to change the working distance of motion | ||||||
|  |  * indicator. By default, indicator is programmed to monitor movements between | ||||||
|  |  * 400mm and 1500mm. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (VL53L8CX_Motion_Configuration) *p_motion_config : Structure | ||||||
|  |  * containing the initialized motion configuration. | ||||||
|  |  * @param (uint16_t) distance_min_mm : Minimum distance for indicator (min value  | ||||||
|  |  * 400mm, max 4000mm). | ||||||
|  |  * @param (uint16_t) distance_max_mm : Maximum distance for indicator (min value  | ||||||
|  |  * 400mm, max 4000mm). | ||||||
|  |  * VL53L8CX_RESOLUTION_4X4 or VL53L8CX_RESOLUTION_8X8. | ||||||
|  |  * @return (uint8_t) status : 0 if OK, or 127 if an argument is invalid. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_motion_indicator_set_distance_motion( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		VL53L8CX_Motion_Configuration	*p_motion_config, | ||||||
|  | 		uint16_t			distance_min_mm, | ||||||
|  | 		uint16_t			distance_max_mm); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function is used to update the internal motion indicator map. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (VL53L8CX_Motion_Configuration) *p_motion_config : Structure | ||||||
|  |  * containing the initialized motion configuration. | ||||||
|  |  * @param (uint8_t) resolution : Wanted SCI resolution, defined by macros | ||||||
|  |  * VL53L8CX_RESOLUTION_4X4 or VL53L8CX_RESOLUTION_8X8. | ||||||
|  |  * @return (uint8_t) status : 0 if OK, or 127 is the resolution is unknown. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_motion_indicator_set_resolution( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		VL53L8CX_Motion_Configuration	*p_motion_config, | ||||||
|  | 		uint8_t				resolution); | ||||||
|  | 
 | ||||||
|  | #endif /* VL53L8CX_PLUGIN_MOTION_INDICATOR_H_ */ | ||||||
							
								
								
									
										391
									
								
								VL53L8CX_ULD_API/inc/vl53l8cx_plugin_xtalk.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										391
									
								
								VL53L8CX_ULD_API/inc/vl53l8cx_plugin_xtalk.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,391 @@ | |||||||
|  | /**
 | ||||||
|  |   * | ||||||
|  |   * Copyright (c) 2021 STMicroelectronics. | ||||||
|  |   * All rights reserved. | ||||||
|  |   * | ||||||
|  |   * This software is licensed under terms that can be found in the LICENSE file | ||||||
|  |   * in the root directory of this software component. | ||||||
|  |   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||||
|  |   * | ||||||
|  |   ****************************************************************************** | ||||||
|  |   */ | ||||||
|  | 
 | ||||||
|  | #ifndef VL53L8CX_PLUGIN_XTALK_H_ | ||||||
|  | #define VL53L8CX_PLUGIN_XTALK_H_ | ||||||
|  | 
 | ||||||
|  | #include "vl53l8cx_api.h" | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Inner internal number of targets. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #if VL53L8CX_NB_TARGET_PER_ZONE == 1 | ||||||
|  | #define VL53L8CX_FW_NBTAR_XTALK	2 | ||||||
|  | #else | ||||||
|  | #define VL53L8CX_FW_NBTAR_XTALK	VL53L8CX_NB_TARGET_PER_ZONE | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Inner Macro for plugin. Not for user, only for development. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define VL53L8CX_DCI_CAL_CFG				((uint16_t)0x5470U) | ||||||
|  | #define VL53L8CX_DCI_XTALK_CFG				((uint16_t)0xAD94U) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function starts the VL53L8CX sensor in order to calibrate Xtalk. | ||||||
|  |  * This calibration is recommended is user wants to use a coverglass. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint16_t) reflectance_percent : Target reflectance in percent. This | ||||||
|  |  * value is include between 1 and 99%. For a better efficiency, ST recommends a | ||||||
|  |  * 3% target reflectance. | ||||||
|  |  * @param (uint8_t) nb_samples : Nb of samples used for calibration. A higher | ||||||
|  |  * number of samples means a higher accuracy, but it increases the calibration | ||||||
|  |  * time. Minimum is 1 and maximum is 16. | ||||||
|  |  * @param (uint16_t) distance_mm : Target distance in mm. The minimum allowed | ||||||
|  |  * distance is 600mm, and maximum is 3000mm. The target must stay in Full FOV, | ||||||
|  |  * so short distance are easier for calibration. | ||||||
|  |  * @return (uint8_t) status : 0 if calibration OK, 127 if an argument has an | ||||||
|  |  * incorrect value, or 255 is something failed. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_calibrate_xtalk( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint16_t			reflectance_percent, | ||||||
|  | 		uint8_t				nb_samples, | ||||||
|  | 		uint16_t			distance_mm); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function gets the Xtalk buffer. The buffer is available after | ||||||
|  |  * using the function vl53l8cx_calibrate_xtalk(). | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L5 configuration structure. | ||||||
|  |  * @param (uint8_t) *p_xtalk_data : Buffer with a size defined by | ||||||
|  |  * macro VL53L8CX_XTALK_SIZE. | ||||||
|  |  * @return (uint8_t) status : 0 if buffer reading OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_get_caldata_xtalk( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				*p_xtalk_data); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function sets the Xtalk buffer. This function can be used to | ||||||
|  |  * override default Xtalk buffer. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L5 configuration structure. | ||||||
|  |  * @param (uint8_t) *p_xtalk_data : Buffer with a size defined by | ||||||
|  |  * macro VL53L8CX_XTALK_SIZE. | ||||||
|  |  * @return (uint8_t) status : 0 if buffer OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_set_caldata_xtalk( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				*p_xtalk_data); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function gets the Xtalk margin. This margin is used to increase | ||||||
|  |  * the Xtalk threshold. It can also be used to avoid false positives after the | ||||||
|  |  * Xtalk calibration. The default value is 50 kcps/spads. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint32_t) *p_xtalk_margin : Xtalk margin in kcps/spads. | ||||||
|  |  * @return (uint8_t) status : 0 if reading OK | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_get_xtalk_margin( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint32_t			*p_xtalk_margin); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief This function sets the Xtalk margin. This margin is used to increase | ||||||
|  |  * the Xtalk threshold. It can also be used to avoid false positives after the | ||||||
|  |  * Xtalk calibration. The default value is 50 kcps/spads. | ||||||
|  |  * @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure. | ||||||
|  |  * @param (uint32_t) xtalk_margin : New Xtalk margin in kcps/spads. Min value is | ||||||
|  |  * 0 kcps/spads, and max is 10.000 kcps/spads | ||||||
|  |  * @return (uint8_t) status : 0 if set margin is OK, or 127 is the margin is | ||||||
|  |  * invalid. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_set_xtalk_margin( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint32_t			xtalk_margin); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Command used to get Xtalk calibration data | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | static const uint8_t VL53L8CX_GET_XTALK_CMD[] = { | ||||||
|  | 	0x54, 0x00, 0x00, 0x40, | ||||||
|  | 	0x9F, 0xD8, 0x00, 0xC0, | ||||||
|  | 	0x9F, 0xE4, 0x01, 0x40, | ||||||
|  | 	0x9F, 0xF8, 0x00, 0x40, | ||||||
|  | 	0x9F, 0xFC, 0x04, 0x04, | ||||||
|  | 	0xA0, 0xFC, 0x01, 0x00, | ||||||
|  | 	0xA1, 0x0C, 0x01, 0x00, | ||||||
|  | 	0xA1, 0x1C, 0x00, 0xC0, | ||||||
|  | 	0xA1, 0x28, 0x09, 0x02, | ||||||
|  | 	0xA2, 0x48, 0x00, 0x40, | ||||||
|  | 	0xA2, 0x4C, 0x00, 0x81, | ||||||
|  | 	0xA2, 0x54, 0x00, 0x81, | ||||||
|  | 	0xA2, 0x5C, 0x00, 0x81, | ||||||
|  | 	0xA2, 0x64, 0x00, 0x81, | ||||||
|  | 	0xA2, 0x6C, 0x00, 0x84, | ||||||
|  | 	0xA2, 0x8C, 0x00, 0x82, | ||||||
|  | 	0x00, 0x00, 0x00, 0x0F, | ||||||
|  | 	0x07, 0x02, 0x00, 0x44 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Command used to get run Xtalk calibration | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | static const uint8_t VL53L8CX_CALIBRATE_XTALK[] = { | ||||||
|  | 	0x54, 0x50, 0x00, 0x80, | ||||||
|  | 	0x00, 0x04, 0x08, 0x08, | ||||||
|  | 	0x00, 0x00, 0x04, 0x04, | ||||||
|  | 	0xAD, 0x30, 0x00, 0x80, | ||||||
|  | 	0x03, 0x01, 0x06, 0x03, | ||||||
|  | 	0x00, 0x00, 0x01, 0x00, | ||||||
|  | 	0xAD, 0x38, 0x01, 0x00, | ||||||
|  | 	0x01, 0xE0, 0x01, 0x40, | ||||||
|  | 	0x00, 0x10, 0x00, 0x10, | ||||||
|  | 	0x01, 0x00, 0x01, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x01, | ||||||
|  | 	0x54, 0x58, 0x00, 0x40, | ||||||
|  | 	0x04, 0x1A, 0x02, 0x00, | ||||||
|  | 	0x54, 0x5C, 0x01, 0x40, | ||||||
|  | 	0x00, 0x01, 0x00, 0x51, | ||||||
|  | 	0x00, 0x00, 0x0F, 0xA0, | ||||||
|  | 	0x0F, 0xA0, 0x03, 0xE8, | ||||||
|  | 	0x02, 0x80, 0x1F, 0x40, | ||||||
|  | 	0x00, 0x00, 0x05, 0x00, | ||||||
|  | 	0x54, 0x70, 0x00, 0x80, | ||||||
|  | 	0x03, 0x20, 0x03, 0x20, | ||||||
|  | 	0x00, 0x00, 0x00, 0x08, | ||||||
|  | 	0x54, 0x78, 0x01, 0x00, | ||||||
|  | 	0x01, 0x1B, 0x00, 0x21, | ||||||
|  | 	0x00, 0x33, 0x00, 0x00, | ||||||
|  | 	0x02, 0x00, 0x00, 0x01, | ||||||
|  | 	0x04, 0x01, 0x08, VL53L8CX_FW_NBTAR_XTALK, | ||||||
|  | 	0x54, 0x88, 0x01, 0x40, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x08, 0x00, | ||||||
|  | 	0xAD, 0x48, 0x01, 0x00, | ||||||
|  | 	0x01, 0xF4, 0x00, 0x00, | ||||||
|  | 	0x03, 0x06, 0x00, 0x10, | ||||||
|  | 	0x08, 0x08, 0x08, 0x08, | ||||||
|  | 	0x00, 0x00, 0x00, 0x08, | ||||||
|  | 	0xAD, 0x60, 0x01, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x80, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x20, 0x1F, 0x01, 0xF4, | ||||||
|  | 	0x00, 0x00, 0x1D, 0x0A, | ||||||
|  | 	0xAD, 0x70, 0x00, 0x80, | ||||||
|  | 	0x08, 0x00, 0x1F, 0x40, | ||||||
|  | 	0x00, 0x00, 0x00, 0x01, | ||||||
|  | 	0xAD, 0x78, 0x00, 0x80, | ||||||
|  | 	0x00, 0xA0, 0x03, 0x20, | ||||||
|  | 	0x00, 0x01, 0x01, 0x90, | ||||||
|  | 	0xAD, 0x80, 0x00, 0x40, | ||||||
|  | 	0x00, 0x00, 0x28, 0x00, | ||||||
|  | 	0xAD, 0x84, 0x00, 0x80, | ||||||
|  | 	0x00, 0x00, 0x32, 0x00, | ||||||
|  | 	0x03, 0x20, 0x00, 0x00, | ||||||
|  | 	0xAD, 0x8C, 0x00, 0x80, | ||||||
|  | 	0x02, 0x58, 0xFF, 0x38, | ||||||
|  | 	0x00, 0x00, 0x00, 0x0C, | ||||||
|  | 	0xAD, 0x94, 0x01, 0x00, | ||||||
|  | 	0x00, 0x01, 0x90, 0x00, | ||||||
|  | 	0xFF, 0xFF, 0xFC, 0x00, | ||||||
|  | 	0x00, 0x00, 0x04, 0x00, | ||||||
|  | 	0x00, 0x00, 0x01, 0x00, | ||||||
|  | 	0xAD, 0xA4, 0x00, 0xC0, | ||||||
|  | 	0x04, 0x80, 0x06, 0x1A, | ||||||
|  | 	0x00, 0x80, 0x05, 0x80, | ||||||
|  | 	0x00, 0x00, 0x01, 0x06, | ||||||
|  | 	0xAD, 0xB0, 0x00, 0xC0, | ||||||
|  | 	0x04, 0x80, 0x06, 0x1A, | ||||||
|  | 	0x19, 0x00, 0x05, 0x80, | ||||||
|  | 	0x00, 0x00, 0x01, 0x90, | ||||||
|  | 	0xAD, 0xBC, 0x04, 0x40, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x12, 0x00, 0x25, | ||||||
|  | 	0x00, 0x00, 0x00, 0x06, | ||||||
|  | 	0x00, 0x00, 0x00, 0x05, | ||||||
|  | 	0x00, 0x00, 0x00, 0x05, | ||||||
|  | 	0x00, 0x00, 0x00, 0x06, | ||||||
|  | 	0x00, 0x00, 0x00, 0x04, | ||||||
|  | 	0x00, 0x00, 0x00, 0x0F, | ||||||
|  | 	0x00, 0x00, 0x00, 0x5A, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x09, | ||||||
|  | 	0x0B, 0x0C, 0x0B, 0x0B, | ||||||
|  | 	0x03, 0x03, 0x11, 0x05, | ||||||
|  | 	0x01, 0x01, 0x01, 0x01, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x0D, 0x00, 0x00, | ||||||
|  | 	0xAE, 0x00, 0x01, 0x04, | ||||||
|  | 	0x00, 0x00, 0x00, 0x04, | ||||||
|  | 	0x00, 0x00, 0x00, 0x08, | ||||||
|  | 	0x00, 0x00, 0x00, 0x0A, | ||||||
|  | 	0x00, 0x00, 0x00, 0x0C, | ||||||
|  | 	0x00, 0x00, 0x00, 0x0D, | ||||||
|  | 	0x00, 0x00, 0x00, 0x0E, | ||||||
|  | 	0x00, 0x00, 0x00, 0x08, | ||||||
|  | 	0x00, 0x00, 0x00, 0x08, | ||||||
|  | 	0x00, 0x00, 0x00, 0x10, | ||||||
|  | 	0x00, 0x00, 0x00, 0x10, | ||||||
|  | 	0x00, 0x00, 0x00, 0x20, | ||||||
|  | 	0x00, 0x00, 0x00, 0x20, | ||||||
|  | 	0x00, 0x00, 0x00, 0x06, | ||||||
|  | 	0x00, 0x00, 0x05, 0x0A, | ||||||
|  | 	0x02, 0x00, 0x0C, 0x08, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0xAE, 0x40, 0x00, 0x40, | ||||||
|  | 	0x00, 0x00, 0x00, 0xFF, | ||||||
|  | 	0xAE, 0x44, 0x00, 0x40, | ||||||
|  | 	0x00, 0x10, 0x04, 0x01, | ||||||
|  | 	0xAE, 0x48, 0x00, 0x40, | ||||||
|  | 	0x00, 0x00, 0x10, 0x00, | ||||||
|  | 	0xAE, 0x4C, 0x00, 0x40, | ||||||
|  | 	0x00, 0x00, 0x00, 0x01, | ||||||
|  | 	0xAE, 0x50, 0x01, 0x40, | ||||||
|  | 	0x00, 0x00, 0x00, 0x14, | ||||||
|  | 	0x04, 0x00, 0x28, 0x00, | ||||||
|  | 	0x03, 0x20, 0x6C, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0xAE, 0x64, 0x00, 0x40, | ||||||
|  | 	0x00, 0x00, 0x00, 0x01, | ||||||
|  | 	0xAE, 0xD8, 0x01, 0x00, | ||||||
|  | 	0x00, 0xC8, 0x05, 0xDC, | ||||||
|  | 	0x00, 0x00, 0x0C, 0xCD, | ||||||
|  | 	0x01, 0x04, 0x00, 0x00, | ||||||
|  | 	0x00, 0x01, 0x26, 0x01, | ||||||
|  | 	0xB5, 0x50, 0x02, 0x82, | ||||||
|  | 	0xA3, 0xE8, 0xA3, 0xB8, | ||||||
|  | 	0xA4, 0x38, 0xA4, 0x28, | ||||||
|  | 	0xA6, 0x48, 0xA4, 0x48, | ||||||
|  | 	0xA7, 0x88, 0xA7, 0x48, | ||||||
|  | 	0xAC, 0x10, 0xA7, 0x90, | ||||||
|  | 	0x99, 0xBC, 0x99, 0xB4, | ||||||
|  | 	0x9A, 0xFC, 0x9A, 0xBC, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0xB5, 0xA0, 0x02, 0x82, | ||||||
|  | 	0x00, 0x88, 0x03, 0x00, | ||||||
|  | 	0x00, 0x82, 0x00, 0x82, | ||||||
|  | 	0x04, 0x04, 0x04, 0x08, | ||||||
|  | 	0x00, 0x80, 0x04, 0x01, | ||||||
|  | 	0x09, 0x02, 0x09, 0x08, | ||||||
|  | 	0x04, 0x04, 0x00, 0x80, | ||||||
|  | 	0x04, 0x01, 0x04, 0x01, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0xB5, 0xF0, 0x00, 0x40, | ||||||
|  | 	0x00, 0x04, 0x00, 0x00, | ||||||
|  | 	0xB3, 0x9C, 0x01, 0x00, | ||||||
|  | 	0x40, 0x00, 0x05, 0x1E, | ||||||
|  | 	0x02, 0x1B, 0x08, 0x7C, | ||||||
|  | 	0x80, 0x00, 0x12, 0x01, | ||||||
|  | 	0x00, 0x01, 0x08, 0x00, | ||||||
|  | 	0xB6, 0xC0, 0x00, 0xC0, | ||||||
|  | 	0x00, 0x00, 0x60, 0x00, | ||||||
|  | 	0x00, 0x00, 0x20, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0xAE, 0xA8, 0x00, 0x40, | ||||||
|  | 	0x00, 0x00, 0x04, 0x05, | ||||||
|  | 	0xAE, 0xAC, 0x00, 0x80, | ||||||
|  | 	0x01, 0x00, 0x01, 0x00, | ||||||
|  | 	0x00, 0x02, 0x00, 0x00, | ||||||
|  | 	0xAE, 0xB4, 0x00, 0x40, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0xAE, 0xB8, 0x00, 0x81, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0xAE, 0xC0, 0x00, 0x81, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0xAE, 0xC8, 0x00, 0x81, | ||||||
|  | 	0x08, 0x01, 0x01, 0x08, | ||||||
|  | 	0x00, 0x00, 0x00, 0x08, | ||||||
|  | 	0xAE, 0xD0, 0x00, 0x81, | ||||||
|  | 	0x01, 0x08, 0x08, 0x08, | ||||||
|  | 	0x00, 0x00, 0x00, 0x01, | ||||||
|  | 	0xB5, 0xF4, 0x00, 0x80, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0xB5, 0xFC, 0x00, 0x80, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0xB6, 0x04, 0x00, 0x40, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0xB6, 0x08, 0x00, 0x44, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0xB6, 0x18, 0x00, 0x44, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0xB6, 0x28, 0x00, 0x44, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0xB6, 0x38, 0x00, 0x44, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0xB6, 0x48, 0x01, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0xB6, 0x58, 0x01, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0xB6, 0x68, 0x01, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x54, 0x70, 0x00, 0x80, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x02, | ||||||
|  | 	0x00, 0x00, 0x00, 0x0F, | ||||||
|  | 	0x00, 0x01, 0x03, 0xD4 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif /* VL53L8CX_PLUGIN_XTALK_H_ */ | ||||||
							
								
								
									
										1337
									
								
								VL53L8CX_ULD_API/src/vl53l8cx_api.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1337
									
								
								VL53L8CX_ULD_API/src/vl53l8cx_api.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										187
									
								
								VL53L8CX_ULD_API/src/vl53l8cx_plugin_detection_thresholds.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								VL53L8CX_ULD_API/src/vl53l8cx_plugin_detection_thresholds.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,187 @@ | |||||||
|  | /**
 | ||||||
|  |   * | ||||||
|  |   * Copyright (c) 2021 STMicroelectronics. | ||||||
|  |   * All rights reserved. | ||||||
|  |   * | ||||||
|  |   * This software is licensed under terms that can be found in the LICENSE file | ||||||
|  |   * in the root directory of this software component. | ||||||
|  |   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||||
|  |   * | ||||||
|  |   ****************************************************************************** | ||||||
|  |   */ | ||||||
|  | 
 | ||||||
|  | #include "vl53l8cx_plugin_detection_thresholds.h" | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_get_detection_thresholds_enable( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				*p_enabled) | ||||||
|  | { | ||||||
|  | 	uint8_t status = VL53L8CX_STATUS_OK; | ||||||
|  | 
 | ||||||
|  | 	status |= vl53l8cx_dci_read_data(p_dev, (uint8_t*)p_dev->temp_buffer, | ||||||
|  | 			VL53L8CX_DCI_DET_THRESH_GLOBAL_CONFIG, 8); | ||||||
|  | 	*p_enabled = p_dev->temp_buffer[0x1]; | ||||||
|  | 
 | ||||||
|  | 	return status; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_set_detection_thresholds_enable( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				enabled) | ||||||
|  | { | ||||||
|  | 	uint8_t tmp, status = VL53L8CX_STATUS_OK; | ||||||
|  | 	uint8_t grp_global_config[] = {0x01, 0x00, 0x01, 0x00}; | ||||||
|  | 
 | ||||||
|  | 	if(enabled == (uint8_t)1) | ||||||
|  | 	{ | ||||||
|  | 		grp_global_config[0x01] = 0x01; | ||||||
|  | 		tmp = 0x04; | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		grp_global_config[0x01] = 0x00; | ||||||
|  | 		tmp = 0x0C; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* Set global interrupt config */ | ||||||
|  | 	status |= vl53l8cx_dci_replace_data(p_dev, p_dev->temp_buffer, | ||||||
|  | 			VL53L8CX_DCI_DET_THRESH_GLOBAL_CONFIG, 8, | ||||||
|  | 			(uint8_t*)&grp_global_config, 4, 0x00); | ||||||
|  | 
 | ||||||
|  | 	/* Update interrupt config */ | ||||||
|  | 	status |= vl53l8cx_dci_replace_data(p_dev, p_dev->temp_buffer, | ||||||
|  | 			VL53L8CX_DCI_DET_THRESH_CONFIG, 20, | ||||||
|  | 			(uint8_t*)&tmp, 1, 0x11); | ||||||
|  | 
 | ||||||
|  | 	return status; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_get_detection_thresholds( | ||||||
|  | 		VL53L8CX_Configuration			*p_dev, | ||||||
|  | 		VL53L8CX_DetectionThresholds	*p_thresholds) | ||||||
|  | { | ||||||
|  | 	uint8_t i, status = VL53L8CX_STATUS_OK; | ||||||
|  | 
 | ||||||
|  | 	/* Get thresholds configuration */ | ||||||
|  | 	status |= vl53l8cx_dci_read_data(p_dev, (uint8_t*)p_thresholds, | ||||||
|  | 			VL53L8CX_DCI_DET_THRESH_START, | ||||||
|  |                         (uint16_t)VL53L8CX_NB_THRESHOLDS | ||||||
|  | 			*(uint16_t)sizeof(VL53L8CX_DetectionThresholds)); | ||||||
|  | 
 | ||||||
|  | 	for(i = 0; i < (uint8_t)VL53L8CX_NB_THRESHOLDS; i++) | ||||||
|  | 	{ | ||||||
|  | 		switch(p_thresholds[i].measurement) | ||||||
|  | 		{ | ||||||
|  | 			case VL53L8CX_DISTANCE_MM: | ||||||
|  | 				p_thresholds[i].param_low_thresh  /= 4; | ||||||
|  | 				p_thresholds[i].param_high_thresh /= 4; | ||||||
|  | 				break; | ||||||
|  | 			case VL53L8CX_SIGNAL_PER_SPAD_KCPS: | ||||||
|  | 				p_thresholds[i].param_low_thresh  /= 2048; | ||||||
|  | 				p_thresholds[i].param_high_thresh /= 2048; | ||||||
|  | 				break; | ||||||
|  | 			case VL53L8CX_RANGE_SIGMA_MM: | ||||||
|  | 				p_thresholds[i].param_low_thresh  /= 128; | ||||||
|  | 				p_thresholds[i].param_high_thresh /= 128; | ||||||
|  | 				break; | ||||||
|  | 			case VL53L8CX_AMBIENT_PER_SPAD_KCPS: | ||||||
|  | 				p_thresholds[i].param_low_thresh  /= 2048; | ||||||
|  | 				p_thresholds[i].param_high_thresh /= 2048; | ||||||
|  | 				break; | ||||||
|  | 			case VL53L8CX_NB_SPADS_ENABLED: | ||||||
|  | 				p_thresholds[i].param_low_thresh  /= 256; | ||||||
|  | 				p_thresholds[i].param_high_thresh /= 256; | ||||||
|  | 				break; | ||||||
|  | 			case VL53L8CX_MOTION_INDICATOR: | ||||||
|  | 				p_thresholds[i].param_low_thresh  /= 65535; | ||||||
|  | 				p_thresholds[i].param_high_thresh /= 65535; | ||||||
|  | 				break; | ||||||
|  | 			default: | ||||||
|  | 				break; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return status; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_set_detection_thresholds( | ||||||
|  | 		VL53L8CX_Configuration			*p_dev, | ||||||
|  | 		VL53L8CX_DetectionThresholds	*p_thresholds) | ||||||
|  | { | ||||||
|  | 	uint8_t i, status = VL53L8CX_STATUS_OK; | ||||||
|  | 	uint8_t grp_valid_target_cfg[] = {0x05, 0x05, 0x05, 0x05, | ||||||
|  | 					0x05, 0x05, 0x05, 0x05}; | ||||||
|  | 
 | ||||||
|  | 	for(i = 0; i < (uint8_t) VL53L8CX_NB_THRESHOLDS; i++) | ||||||
|  | 	{ | ||||||
|  | 		switch(p_thresholds->measurement) | ||||||
|  | 		{ | ||||||
|  | 			case VL53L8CX_DISTANCE_MM: | ||||||
|  | 				p_thresholds[i].param_low_thresh  *= 4; | ||||||
|  | 				p_thresholds[i].param_high_thresh *= 4; | ||||||
|  | 				break; | ||||||
|  | 			case VL53L8CX_SIGNAL_PER_SPAD_KCPS: | ||||||
|  | 				p_thresholds[i].param_low_thresh  *= 2048; | ||||||
|  | 				p_thresholds[i].param_high_thresh *= 2048; | ||||||
|  | 				break; | ||||||
|  | 			case VL53L8CX_RANGE_SIGMA_MM: | ||||||
|  | 				p_thresholds[i].param_low_thresh  *= 128; | ||||||
|  | 				p_thresholds[i].param_high_thresh *= 128; | ||||||
|  | 				break; | ||||||
|  | 			case VL53L8CX_AMBIENT_PER_SPAD_KCPS: | ||||||
|  | 				p_thresholds[i].param_low_thresh  *= 2048; | ||||||
|  | 				p_thresholds[i].param_high_thresh *= 2048; | ||||||
|  | 				break; | ||||||
|  | 			case VL53L8CX_NB_SPADS_ENABLED: | ||||||
|  | 				p_thresholds[i].param_low_thresh  *= 256; | ||||||
|  | 				p_thresholds[i].param_high_thresh *= 256; | ||||||
|  | 				break; | ||||||
|  | 			case VL53L8CX_MOTION_INDICATOR: | ||||||
|  | 				p_thresholds[i].param_low_thresh  *= 65535; | ||||||
|  | 				p_thresholds[i].param_high_thresh *= 65535; | ||||||
|  | 				break; | ||||||
|  | 			default: | ||||||
|  | 				break; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* Set valid target list */ | ||||||
|  | 	status |= vl53l8cx_dci_write_data(p_dev, (uint8_t*)grp_valid_target_cfg, | ||||||
|  | 			VL53L8CX_DCI_DET_THRESH_VALID_STATUS, | ||||||
|  | 			(uint16_t)sizeof(grp_valid_target_cfg)); | ||||||
|  | 
 | ||||||
|  | 	/* Set thresholds configuration */ | ||||||
|  | 	status |= vl53l8cx_dci_write_data(p_dev, (uint8_t*)p_thresholds, | ||||||
|  | 			VL53L8CX_DCI_DET_THRESH_START, | ||||||
|  | 			(uint16_t)(VL53L8CX_NB_THRESHOLDS | ||||||
|  | 			*sizeof(VL53L8CX_DetectionThresholds))); | ||||||
|  | 
 | ||||||
|  | 	return status; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_get_detection_thresholds_auto_stop( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				*p_auto_stop) | ||||||
|  | { | ||||||
|  | 	uint8_t status = VL53L8CX_STATUS_OK; | ||||||
|  | 
 | ||||||
|  | 	status |= vl53l8cx_dci_read_data(p_dev, (uint8_t*)p_dev->temp_buffer, | ||||||
|  | 			VL53L8CX_DCI_PIPE_CONTROL, 4); | ||||||
|  | 	*p_auto_stop = p_dev->temp_buffer[0x3]; | ||||||
|  | 
 | ||||||
|  | 	return status; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_set_detection_thresholds_auto_stop( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				auto_stop) | ||||||
|  | { | ||||||
|  | 	uint8_t status = VL53L8CX_STATUS_OK; | ||||||
|  | 
 | ||||||
|  | 	status |= vl53l8cx_dci_replace_data(p_dev, p_dev->temp_buffer, | ||||||
|  | 			VL53L8CX_DCI_PIPE_CONTROL, 4, | ||||||
|  | 	(uint8_t*)&auto_stop, 1, 0x03); | ||||||
|  | 	p_dev->is_auto_stop_enabled = (uint8_t)auto_stop; | ||||||
|  | 
 | ||||||
|  | 	return status; | ||||||
|  | } | ||||||
							
								
								
									
										122
									
								
								VL53L8CX_ULD_API/src/vl53l8cx_plugin_motion_indicator.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								VL53L8CX_ULD_API/src/vl53l8cx_plugin_motion_indicator.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,122 @@ | |||||||
|  | /**
 | ||||||
|  |   * | ||||||
|  |   * Copyright (c) 2021 STMicroelectronics. | ||||||
|  |   * All rights reserved. | ||||||
|  |   * | ||||||
|  |   * This software is licensed under terms that can be found in the LICENSE file | ||||||
|  |   * in the root directory of this software component. | ||||||
|  |   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||||
|  |   * | ||||||
|  |   ****************************************************************************** | ||||||
|  |   */ | ||||||
|  | 
 | ||||||
|  | #include <math.h>  | ||||||
|  | #include "vl53l8cx_plugin_motion_indicator.h" | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_motion_indicator_init( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		VL53L8CX_Motion_Configuration	*p_motion_config, | ||||||
|  | 		uint8_t				resolution) | ||||||
|  | { | ||||||
|  | 	uint8_t status = VL53L8CX_STATUS_OK; | ||||||
|  | 
 | ||||||
|  | 	(void)memset(p_motion_config, 0, sizeof(VL53L8CX_Motion_Configuration)); | ||||||
|  | 
 | ||||||
|  | 	p_motion_config->ref_bin_offset = 13633; | ||||||
|  | 	p_motion_config->detection_threshold = 2883584; | ||||||
|  | 	p_motion_config->extra_noise_sigma = 0; | ||||||
|  | 	p_motion_config->null_den_clip_value = 0; | ||||||
|  | 	p_motion_config->mem_update_mode = 6; | ||||||
|  | 	p_motion_config->mem_update_choice = 2; | ||||||
|  | 	p_motion_config->sum_span = 4; | ||||||
|  | 	p_motion_config->feature_length = 9; | ||||||
|  | 	p_motion_config->nb_of_aggregates = 16; | ||||||
|  | 	p_motion_config->nb_of_temporal_accumulations = 16; | ||||||
|  | 	p_motion_config->min_nb_for_global_detection = 1; | ||||||
|  | 	p_motion_config->global_indicator_format_1 = 8; | ||||||
|  | 	p_motion_config->global_indicator_format_2 = 0; | ||||||
|  | 	p_motion_config->spare_1 = 0; | ||||||
|  | 	p_motion_config->spare_2 = 0; | ||||||
|  | 	p_motion_config->spare_3 = 0; | ||||||
|  | 
 | ||||||
|  | 	status |= vl53l8cx_motion_indicator_set_resolution(p_dev, | ||||||
|  | 			p_motion_config, resolution); | ||||||
|  | 
 | ||||||
|  | 	return status; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_motion_indicator_set_distance_motion( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		VL53L8CX_Motion_Configuration	*p_motion_config, | ||||||
|  | 		uint16_t			distance_min_mm, | ||||||
|  | 		uint16_t			distance_max_mm) | ||||||
|  | { | ||||||
|  | 	uint8_t status = VL53L8CX_STATUS_OK; | ||||||
|  | 	float_t tmp; | ||||||
|  | 
 | ||||||
|  | 	if(((distance_max_mm - distance_min_mm) > (uint16_t)1500) | ||||||
|  | 			|| (distance_min_mm < (uint16_t)400) | ||||||
|  |                         || (distance_max_mm > (uint16_t)4000)) | ||||||
|  | 	{ | ||||||
|  | 		status |= VL53L8CX_STATUS_INVALID_PARAM; | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{            | ||||||
|  | 		tmp = (float_t)((((float_t)distance_min_mm/(float_t)37.5348) | ||||||
|  |                                -(float_t)4.0)*(float_t)2048.5); | ||||||
|  |                 p_motion_config->ref_bin_offset = (int32_t)tmp; | ||||||
|  |                  | ||||||
|  |                 tmp = (float_t)((((((float_t)distance_max_mm- | ||||||
|  | 			(float_t)distance_min_mm)/(float_t)10.0)+(float_t)30.02784) | ||||||
|  | 			/((float_t)15.01392))+(float_t)0.5); | ||||||
|  | 		p_motion_config->feature_length = (uint8_t)tmp; | ||||||
|  | 
 | ||||||
|  | 		status |= vl53l8cx_dci_write_data(p_dev, | ||||||
|  | 			(uint8_t*)(p_motion_config), | ||||||
|  | 			VL53L8CX_DCI_MOTION_DETECTOR_CFG, | ||||||
|  |                         (uint16_t)sizeof(*p_motion_config)); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return status; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_motion_indicator_set_resolution( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		VL53L8CX_Motion_Configuration	*p_motion_config, | ||||||
|  | 		uint8_t				resolution) | ||||||
|  | { | ||||||
|  | 	uint8_t i, status = VL53L8CX_STATUS_OK; | ||||||
|  | 
 | ||||||
|  | 	switch(resolution) | ||||||
|  | 	{ | ||||||
|  | 		case VL53L8CX_RESOLUTION_4X4: | ||||||
|  | 			for(i = 0; i < (uint8_t)VL53L8CX_RESOLUTION_4X4; i++) | ||||||
|  | 			{ | ||||||
|  | 				p_motion_config->map_id[i] = (int8_t)i; | ||||||
|  | 			} | ||||||
|  | 		(void)memset(p_motion_config->map_id + 16, -1, 48); | ||||||
|  | 		break; | ||||||
|  | 
 | ||||||
|  | 		case VL53L8CX_RESOLUTION_8X8: | ||||||
|  | 			for(i = 0; i < (uint8_t)VL53L8CX_RESOLUTION_8X8; i++) | ||||||
|  | 			{ | ||||||
|  |                                p_motion_config->map_id[i] = (int8_t)((((int8_t) | ||||||
|  |                                i % 8)/2) + (4*((int8_t)i/16))); | ||||||
|  | 			} | ||||||
|  | 		break; | ||||||
|  | 
 | ||||||
|  | 		default: | ||||||
|  | 			status |= VL53L8CX_STATUS_ERROR; | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if(status == VL53L8CX_STATUS_OK) | ||||||
|  | 	{ | ||||||
|  | 		status |= vl53l8cx_dci_write_data(p_dev, | ||||||
|  | 				(uint8_t*)(p_motion_config), | ||||||
|  | 				VL53L8CX_DCI_MOTION_DETECTOR_CFG, | ||||||
|  |                                 (uint16_t)sizeof(*p_motion_config)); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return status; | ||||||
|  | } | ||||||
							
								
								
									
										366
									
								
								VL53L8CX_ULD_API/src/vl53l8cx_plugin_xtalk.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										366
									
								
								VL53L8CX_ULD_API/src/vl53l8cx_plugin_xtalk.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,366 @@ | |||||||
|  | /**
 | ||||||
|  |   * | ||||||
|  |   * Copyright (c) 2021 STMicroelectronics. | ||||||
|  |   * All rights reserved. | ||||||
|  |   * | ||||||
|  |   * This software is licensed under terms that can be found in the LICENSE file | ||||||
|  |   * in the root directory of this software component. | ||||||
|  |   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||||
|  |   * | ||||||
|  |   ****************************************************************************** | ||||||
|  |   */ | ||||||
|  | 
 | ||||||
|  | #include "vl53l8cx_plugin_xtalk.h" | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Inner function, not available outside this file. This function is used to | ||||||
|  |  * wait for an answer from VL53L5 sensor. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | static uint8_t _vl53l8cx_poll_for_answer( | ||||||
|  | 		VL53L8CX_Configuration   *p_dev, | ||||||
|  | 		uint16_t 				address, | ||||||
|  | 		uint8_t 				expected_value) | ||||||
|  | { | ||||||
|  | 	uint8_t status = VL53L8CX_STATUS_OK; | ||||||
|  | 	uint8_t timeout = 0; | ||||||
|  | 
 | ||||||
|  | 	do { | ||||||
|  | 		status |= RdMulti(&(p_dev->platform),  | ||||||
|  |                                   address, p_dev->temp_buffer, 4); | ||||||
|  | 		status |= WaitMs(&(p_dev->platform), 10); | ||||||
|  | 		 | ||||||
|  |                 /* 2s timeout or FW error*/ | ||||||
|  | 		if((timeout >= (uint8_t)200)  | ||||||
|  |                    || (p_dev->temp_buffer[2] >= (uint8_t) 0x7f)) | ||||||
|  | 		{ | ||||||
|  | 			status |= VL53L8CX_MCU_ERROR; | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                   timeout++; | ||||||
|  |                 } | ||||||
|  | 	}while ((p_dev->temp_buffer[0x1]) != expected_value); | ||||||
|  |          | ||||||
|  | 	return status; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Inner function, not available outside this file. This function is used to | ||||||
|  |  * program the output using the macro defined into the 'platform.h' file. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | static uint8_t _vl53l8cx_program_output_config( | ||||||
|  | 		VL53L8CX_Configuration 		 *p_dev) | ||||||
|  | { | ||||||
|  | 	uint8_t resolution, status = VL53L8CX_STATUS_OK; | ||||||
|  | 	uint32_t i; | ||||||
|  | 	uint32_t header_config[2] = {0, 0}; | ||||||
|  | 	union Block_header *bh_ptr; | ||||||
|  | 
 | ||||||
|  | 	status |= vl53l8cx_get_resolution(p_dev, &resolution); | ||||||
|  | 	p_dev->data_read_size = 0; | ||||||
|  | 
 | ||||||
|  | 	/* Enable mandatory output (meta and common data) */ | ||||||
|  | 	uint32_t output_bh_enable[] = { | ||||||
|  | 			0x0001FFFFU, | ||||||
|  | 			0x00000000U, | ||||||
|  | 			0x00000000U, | ||||||
|  | 			0xC0000000U}; | ||||||
|  | 
 | ||||||
|  | 	/* Send addresses of possible output */ | ||||||
|  | 	uint32_t output[] ={ | ||||||
|  | 			0x0000000DU, | ||||||
|  | 			0x54000040U, | ||||||
|  | 			0x9FD800C0U, | ||||||
|  | 			0x9FE40140U, | ||||||
|  | 			0x9FF80040U, | ||||||
|  | 			0x9FFC0404U, | ||||||
|  | 			0xA0FC0100U, | ||||||
|  | 			0xA10C0100U, | ||||||
|  | 			0xA11C00C0U, | ||||||
|  | 			0xA1280902U, | ||||||
|  | 			0xA2480040U, | ||||||
|  | 			0xA24C0081U, | ||||||
|  | 			0xA2540081U, | ||||||
|  | 			0xA25C0081U, | ||||||
|  | 			0xA2640081U, | ||||||
|  | 			0xA26C0084U, | ||||||
|  | 			0xA28C0082U}; | ||||||
|  | 
 | ||||||
|  | 	/* Update data size */ | ||||||
|  | 	for (i = 0; i < (uint32_t)(sizeof(output)/sizeof(uint32_t)); i++) | ||||||
|  | 	{ | ||||||
|  | 		if ((output[i] == (uint8_t)0)  | ||||||
|  |                     || ((output_bh_enable[i/(uint32_t)32] | ||||||
|  |                          &((uint32_t)1 << (i%(uint32_t)32))) == (uint32_t)0)) | ||||||
|  | 		{ | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		bh_ptr = (union Block_header *)&(output[i]); | ||||||
|  | 		if (((uint8_t)bh_ptr->type >= (uint8_t)0x1)  | ||||||
|  |                     && ((uint8_t)bh_ptr->type < (uint8_t)0x0d)) | ||||||
|  | 		{ | ||||||
|  | 			if ((bh_ptr->idx >= (uint16_t)0x54d0)  | ||||||
|  |                             && (bh_ptr->idx < (uint16_t)(0x54d0 + 960))) | ||||||
|  | 			{ | ||||||
|  | 				bh_ptr->size = resolution; | ||||||
|  | 			}	 | ||||||
|  | 			else  | ||||||
|  | 			{ | ||||||
|  | 				bh_ptr->size = (uint8_t)(resolution  | ||||||
|  |                                   * (uint8_t)VL53L8CX_NB_TARGET_PER_ZONE); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  |                          | ||||||
|  | 			p_dev->data_read_size += bh_ptr->type * bh_ptr->size; | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			p_dev->data_read_size += bh_ptr->size; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		p_dev->data_read_size += (uint32_t)4; | ||||||
|  | 	} | ||||||
|  | 	p_dev->data_read_size += (uint32_t)24; | ||||||
|  | 
 | ||||||
|  | 	status |= vl53l8cx_dci_write_data(p_dev, | ||||||
|  | 			(uint8_t*)&(output),  | ||||||
|  |                         VL53L8CX_DCI_OUTPUT_LIST, (uint16_t)sizeof(output)); | ||||||
|  |          | ||||||
|  | 	header_config[0] = p_dev->data_read_size; | ||||||
|  | 	header_config[1] = i + (uint32_t)1; | ||||||
|  | 
 | ||||||
|  | 	status |= vl53l8cx_dci_write_data(p_dev, (uint8_t*)&(header_config), | ||||||
|  | 			VL53L8CX_DCI_OUTPUT_CONFIG, | ||||||
|  |                         (uint16_t)sizeof(header_config)); | ||||||
|  | 	status |= vl53l8cx_dci_write_data(p_dev, (uint8_t*)&(output_bh_enable), | ||||||
|  | 			VL53L8CX_DCI_OUTPUT_ENABLES, | ||||||
|  |                         (uint16_t)sizeof(output_bh_enable)); | ||||||
|  | 
 | ||||||
|  | 	return status; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_calibrate_xtalk( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint16_t			reflectance_percent, | ||||||
|  | 		uint8_t				nb_samples, | ||||||
|  | 		uint16_t			distance_mm) | ||||||
|  | { | ||||||
|  | 	uint16_t timeout = 0; | ||||||
|  | 	uint8_t cmd[] = {0x00, 0x03, 0x00, 0x00}; | ||||||
|  | 	uint8_t footer[] = {0x00, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x03, 0x04}; | ||||||
|  | 	uint8_t continue_loop = 1, status = VL53L8CX_STATUS_OK; | ||||||
|  | 
 | ||||||
|  | 	uint8_t resolution, frequency, target_order, sharp_prct, ranging_mode; | ||||||
|  | 	uint32_t integration_time_ms, xtalk_margin; | ||||||
|  |          | ||||||
|  | 	uint16_t reflectance = reflectance_percent; | ||||||
|  | 	uint8_t	samples = nb_samples; | ||||||
|  | 	uint16_t distance = distance_mm; | ||||||
|  | 	uint8_t *default_xtalk_ptr; | ||||||
|  | 
 | ||||||
|  | 	/* Get initial configuration */ | ||||||
|  | 	status |= vl53l8cx_get_resolution(p_dev, &resolution); | ||||||
|  | 	status |= vl53l8cx_get_ranging_frequency_hz(p_dev, &frequency); | ||||||
|  | 	status |= vl53l8cx_get_integration_time_ms(p_dev, &integration_time_ms); | ||||||
|  | 	status |= vl53l8cx_get_sharpener_percent(p_dev, &sharp_prct); | ||||||
|  | 	status |= vl53l8cx_get_target_order(p_dev, &target_order); | ||||||
|  | 	status |= vl53l8cx_get_xtalk_margin(p_dev, &xtalk_margin); | ||||||
|  | 	status |= vl53l8cx_get_ranging_mode(p_dev, &ranging_mode); | ||||||
|  | 
 | ||||||
|  | 	/* Check input arguments validity */ | ||||||
|  | 	if(((reflectance < (uint16_t)1) || (reflectance > (uint16_t)99)) | ||||||
|  | 		|| ((distance < (uint16_t)600) || (distance > (uint16_t)3000)) | ||||||
|  | 		|| ((samples < (uint8_t)1) || (samples > (uint8_t)16))) | ||||||
|  | 	{ | ||||||
|  | 		status |= VL53L8CX_STATUS_INVALID_PARAM; | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		status |= vl53l8cx_set_resolution(p_dev, | ||||||
|  | 				VL53L8CX_RESOLUTION_8X8); | ||||||
|  | 
 | ||||||
|  | 		/* Send Xtalk calibration buffer */ | ||||||
|  |                 (void)memcpy(p_dev->temp_buffer, VL53L8CX_CALIBRATE_XTALK, | ||||||
|  |                        sizeof(VL53L8CX_CALIBRATE_XTALK)); | ||||||
|  | 		status |= WrMulti(&(p_dev->platform), 0x2c28, | ||||||
|  | 				p_dev->temp_buffer,  | ||||||
|  |                        (uint16_t)sizeof(VL53L8CX_CALIBRATE_XTALK)); | ||||||
|  | 		status |= _vl53l8cx_poll_for_answer(p_dev, | ||||||
|  | 				VL53L8CX_UI_CMD_STATUS, 0x3); | ||||||
|  | 
 | ||||||
|  | 		/* Format input argument */ | ||||||
|  | 		reflectance = reflectance * (uint16_t)16; | ||||||
|  | 		distance = distance * (uint16_t)4; | ||||||
|  | 
 | ||||||
|  | 		/* Update required fields */ | ||||||
|  | 		status |= vl53l8cx_dci_replace_data(p_dev, p_dev->temp_buffer, | ||||||
|  | 				VL53L8CX_DCI_CAL_CFG, 8, | ||||||
|  |                                 (uint8_t*)&distance, 2, 0x00); | ||||||
|  | 
 | ||||||
|  | 		status |= vl53l8cx_dci_replace_data(p_dev, p_dev->temp_buffer, | ||||||
|  | 				VL53L8CX_DCI_CAL_CFG, 8, | ||||||
|  |                                 (uint8_t*)&reflectance, 2,0x02); | ||||||
|  | 
 | ||||||
|  | 		status |= vl53l8cx_dci_replace_data(p_dev, p_dev->temp_buffer, | ||||||
|  | 				VL53L8CX_DCI_CAL_CFG, 8, | ||||||
|  |                                 (uint8_t*)&samples, 1, 0x04); | ||||||
|  | 
 | ||||||
|  | 		/* Program output for Xtalk calibration */ | ||||||
|  | 		status |= _vl53l8cx_program_output_config(p_dev); | ||||||
|  | 
 | ||||||
|  | 		/* Start ranging session */ | ||||||
|  | 		status |= WrMulti(&(p_dev->platform), | ||||||
|  | 				VL53L8CX_UI_CMD_END - (uint16_t)(4 - 1), | ||||||
|  | 				(uint8_t*)cmd, sizeof(cmd)); | ||||||
|  | 		status |= _vl53l8cx_poll_for_answer(p_dev, | ||||||
|  | 				VL53L8CX_UI_CMD_STATUS, 0x3); | ||||||
|  | 
 | ||||||
|  | 		/* Wait for end of calibration */ | ||||||
|  | 		do { | ||||||
|  | 			status |= RdMulti(&(p_dev->platform),  | ||||||
|  |                                           0x0, p_dev->temp_buffer, 4); | ||||||
|  | 			if(p_dev->temp_buffer[0] != VL53L8CX_STATUS_ERROR) | ||||||
|  | 			{ | ||||||
|  | 				/* Coverglass too good for Xtalk calibration */ | ||||||
|  | 				if((p_dev->temp_buffer[2] >= (uint8_t)0x7f) && | ||||||
|  | 				(((uint16_t)(p_dev->temp_buffer[3] &  | ||||||
|  |                                  (uint16_t)0x80) >> 7) == (uint16_t)1)) | ||||||
|  | 				{ | ||||||
|  | 					default_xtalk_ptr = p_dev->default_xtalk; | ||||||
|  | 					(void)memcpy(p_dev->xtalk_data,  | ||||||
|  | 						default_xtalk_ptr, | ||||||
|  | 						sizeof(p_dev->xtalk_data)); | ||||||
|  | 					status |= VL53L8CX_STATUS_XTALK_FAILED; | ||||||
|  | 				} | ||||||
|  | 				continue_loop = (uint8_t)0; | ||||||
|  | 			} | ||||||
|  | 			else if(timeout >= (uint16_t)400) | ||||||
|  | 			{ | ||||||
|  | 				status |= VL53L8CX_STATUS_ERROR; | ||||||
|  | 				continue_loop = (uint8_t)0; | ||||||
|  | 			} | ||||||
|  | 			else | ||||||
|  | 			{ | ||||||
|  | 				timeout++; | ||||||
|  | 				status |= WaitMs(&(p_dev->platform), 50); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 		}while (continue_loop == (uint8_t)1); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* Save Xtalk data into the Xtalk buffer */ | ||||||
|  |         (void)memcpy(p_dev->temp_buffer, VL53L8CX_GET_XTALK_CMD, | ||||||
|  |                sizeof(VL53L8CX_GET_XTALK_CMD)); | ||||||
|  | 	status |= WrMulti(&(p_dev->platform), 0x2fb8, | ||||||
|  | 			p_dev->temp_buffer,  | ||||||
|  |                         (uint16_t)sizeof(VL53L8CX_GET_XTALK_CMD)); | ||||||
|  | 	status |= _vl53l8cx_poll_for_answer(p_dev,VL53L8CX_UI_CMD_STATUS, 0x03); | ||||||
|  | 	status |= RdMulti(&(p_dev->platform), VL53L8CX_UI_CMD_START, | ||||||
|  | 			p_dev->temp_buffer,  | ||||||
|  |                         VL53L8CX_XTALK_BUFFER_SIZE + (uint16_t)4); | ||||||
|  | 
 | ||||||
|  | 	(void)memcpy(&(p_dev->xtalk_data[0]), &(p_dev->temp_buffer[8]), | ||||||
|  | 			VL53L8CX_XTALK_BUFFER_SIZE - (uint16_t)8); | ||||||
|  | 	(void)memcpy(&(p_dev->xtalk_data[VL53L8CX_XTALK_BUFFER_SIZE | ||||||
|  |                        - (uint16_t)8]), footer, sizeof(footer)); | ||||||
|  | 
 | ||||||
|  | 	/* Reset default buffer */ | ||||||
|  | 	status |= WrMulti(&(p_dev->platform), 0x2c34, | ||||||
|  | 			p_dev->default_configuration, | ||||||
|  | 			VL53L8CX_CONFIGURATION_SIZE); | ||||||
|  | 	status |= _vl53l8cx_poll_for_answer(p_dev,VL53L8CX_UI_CMD_STATUS, 0x03); | ||||||
|  | 
 | ||||||
|  | 	/* Reset initial configuration */ | ||||||
|  | 	status |= vl53l8cx_set_resolution(p_dev, resolution); | ||||||
|  | 	status |= vl53l8cx_set_ranging_frequency_hz(p_dev, frequency); | ||||||
|  | 	status |= vl53l8cx_set_integration_time_ms(p_dev, integration_time_ms); | ||||||
|  | 	status |= vl53l8cx_set_sharpener_percent(p_dev, sharp_prct); | ||||||
|  | 	status |= vl53l8cx_set_target_order(p_dev, target_order); | ||||||
|  | 	status |= vl53l8cx_set_xtalk_margin(p_dev, xtalk_margin); | ||||||
|  | 	status |= vl53l8cx_set_ranging_mode(p_dev, ranging_mode); | ||||||
|  | 
 | ||||||
|  | 	return status; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_get_caldata_xtalk( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				*p_xtalk_data) | ||||||
|  | { | ||||||
|  | 	uint8_t status = VL53L8CX_STATUS_OK, resolution; | ||||||
|  | 	uint8_t footer[] = {0x00, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x03, 0x04}; | ||||||
|  | 
 | ||||||
|  | 	status |= vl53l8cx_get_resolution(p_dev, &resolution); | ||||||
|  | 	status |= vl53l8cx_set_resolution(p_dev, VL53L8CX_RESOLUTION_8X8); | ||||||
|  | 
 | ||||||
|  |         (void)memcpy(p_dev->temp_buffer, VL53L8CX_GET_XTALK_CMD, | ||||||
|  |                sizeof(VL53L8CX_GET_XTALK_CMD)); | ||||||
|  | 	status |= WrMulti(&(p_dev->platform), 0x2fb8, | ||||||
|  | 			p_dev->temp_buffer,  sizeof(VL53L8CX_GET_XTALK_CMD)); | ||||||
|  | 	status |= _vl53l8cx_poll_for_answer(p_dev,VL53L8CX_UI_CMD_STATUS, 0x03); | ||||||
|  | 	status |= RdMulti(&(p_dev->platform), VL53L8CX_UI_CMD_START, | ||||||
|  | 			p_dev->temp_buffer,  | ||||||
|  |                         VL53L8CX_XTALK_BUFFER_SIZE + (uint16_t)4); | ||||||
|  | 
 | ||||||
|  | 	(void)memcpy(&(p_xtalk_data[0]), &(p_dev->temp_buffer[8]), | ||||||
|  | 			VL53L8CX_XTALK_BUFFER_SIZE-(uint16_t)8); | ||||||
|  | 	(void)memcpy(&(p_xtalk_data[VL53L8CX_XTALK_BUFFER_SIZE - (uint16_t)8]), | ||||||
|  | 			footer, sizeof(footer)); | ||||||
|  | 
 | ||||||
|  | 	status |= vl53l8cx_set_resolution(p_dev, resolution); | ||||||
|  | 
 | ||||||
|  | 	return status; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_set_caldata_xtalk( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint8_t				*p_xtalk_data) | ||||||
|  | { | ||||||
|  | 	uint8_t resolution, status = VL53L8CX_STATUS_OK; | ||||||
|  | 
 | ||||||
|  | 	status |= vl53l8cx_get_resolution(p_dev, &resolution); | ||||||
|  | 	(void)memcpy(p_dev->xtalk_data, p_xtalk_data, VL53L8CX_XTALK_BUFFER_SIZE); | ||||||
|  | 	status |= vl53l8cx_set_resolution(p_dev, resolution); | ||||||
|  | 
 | ||||||
|  | 	return status; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_get_xtalk_margin( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint32_t			*p_xtalk_margin) | ||||||
|  | { | ||||||
|  | 	uint8_t status = VL53L8CX_STATUS_OK; | ||||||
|  | 
 | ||||||
|  | 	status |= vl53l8cx_dci_read_data(p_dev, (uint8_t*)p_dev->temp_buffer, | ||||||
|  | 			VL53L8CX_DCI_XTALK_CFG, 16); | ||||||
|  | 
 | ||||||
|  | 	(void)memcpy(p_xtalk_margin, p_dev->temp_buffer, 4); | ||||||
|  | 	*p_xtalk_margin = *p_xtalk_margin/(uint32_t)2048; | ||||||
|  | 
 | ||||||
|  | 	return status; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint8_t vl53l8cx_set_xtalk_margin( | ||||||
|  | 		VL53L8CX_Configuration		*p_dev, | ||||||
|  | 		uint32_t			xtalk_margin) | ||||||
|  | { | ||||||
|  | 	uint8_t status = VL53L8CX_STATUS_OK; | ||||||
|  |         uint32_t margin_kcps = xtalk_margin; | ||||||
|  | 
 | ||||||
|  | 	if(margin_kcps > (uint32_t)10000) | ||||||
|  | 	{ | ||||||
|  | 		status |= VL53L8CX_STATUS_INVALID_PARAM; | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		margin_kcps = margin_kcps*(uint32_t)2048; | ||||||
|  | 		status |= vl53l8cx_dci_replace_data(p_dev, p_dev->temp_buffer, | ||||||
|  | 				VL53L8CX_DCI_XTALK_CFG, 16, | ||||||
|  |                                 (uint8_t*)&margin_kcps, 4, 0x00); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return status; | ||||||
|  | } | ||||||
							
								
								
									
										145
									
								
								VL53L8_2024.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								VL53L8_2024.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,145 @@ | |||||||
|  | #include "vl53l8cx_api.h" | ||||||
|  | #include <stdio.h> | ||||||
|  | 
 | ||||||
|  | int masque[64]={ | ||||||
|  | 
 | ||||||
|  | 	3000,3000,3000,3000,3000,3000,3000,3000, | ||||||
|  | 	3000,3000,3000,3000,3000,3000,3000,3000, | ||||||
|  | 	3000,3000,3000,3000,3000,3000,3000,3000, | ||||||
|  | 	3000,3000,3000,3000,3000,3000,3000,3000, | ||||||
|  | 	3000,3000,3000,3000,3000,3000,3000,3000, | ||||||
|  | 	350,350,350,350,350,350,350,350, | ||||||
|  | 	281,286,299,306,310,314,302,286, | ||||||
|  | 	195,200,202,206,213,200,200,202 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | void VL53L8_init(VL53L8CX_Configuration * Dev){ | ||||||
|  | 	uint8_t status, isAlive, isReady, i; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	/*********************************/ | ||||||
|  | 	/*      Customer platform        */ | ||||||
|  | 	/*********************************/ | ||||||
|  | 
 | ||||||
|  | 	/* Fill the platform structure with customer's implementation. For this
 | ||||||
|  | 	* example, only the I2C address is used. | ||||||
|  | 	*/ | ||||||
|  | 	Dev->platform.address = VL53L8CX_DEFAULT_I2C_ADDRESS; | ||||||
|  | 
 | ||||||
|  | 	/* (Optional) Reset sensor toggling PINs (see platform, not in API) */ | ||||||
|  | 	//Reset_Sensor(&(Dev.platform));
 | ||||||
|  | 
 | ||||||
|  | 	/* (Optional) Set a new I2C address if the wanted address is different
 | ||||||
|  | 	* from the default one (filled with 0x20 for this example). | ||||||
|  | 	*/ | ||||||
|  | 	//status = vl53l8cx_set_i2c_address(&Dev, 0x20);
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	/*********************************/ | ||||||
|  | 	/*   Power on sensor and init    */ | ||||||
|  | 	/*********************************/ | ||||||
|  | 
 | ||||||
|  | 	/* (Optional) Check if there is a VL53L8CX sensor connected */ | ||||||
|  | 	do{ | ||||||
|  | 		status = vl53l8cx_is_alive(Dev, &isAlive); | ||||||
|  | 		if(status){ | ||||||
|  | 
 | ||||||
|  | 			printf("VL53L8CX not detected at requested address\n"); | ||||||
|  | 			WaitMs(&(Dev->platform), 1000); | ||||||
|  | 		} | ||||||
|  | 		if(!isAlive){ | ||||||
|  | 			printf("VL53L8CX not alived\n"); | ||||||
|  | 			WaitMs(&(Dev->platform), 1000); | ||||||
|  | 		} | ||||||
|  | 	}while(!isAlive || status); | ||||||
|  | 	printf("VL53L8CX detected !\n"); | ||||||
|  |      | ||||||
|  | 
 | ||||||
|  | 	/* (Mandatory) Init VL53L8CX sensor */ | ||||||
|  | 	status = vl53l8cx_init(Dev); | ||||||
|  | 	if(status) | ||||||
|  | 	{ | ||||||
|  | 		while(1){ | ||||||
|  | 			printf("VL53L8CX ULD Loading failed :%d\n", status); | ||||||
|  | 			WaitMs(&(Dev->platform), 1000); | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	printf("VL53L8CX ULD ready ! (Version : %s)\n", | ||||||
|  | 			VL53L8CX_API_REVISION); | ||||||
|  | 	 | ||||||
|  | 	status = vl53l8cx_set_resolution(Dev, VL53L8CX_RESOLUTION_8X8); | ||||||
|  | 	if(status !=0){ | ||||||
|  | 		while(1){ | ||||||
|  | 			printf("vl53l8cx_set_resolution failed :%d\n", status); | ||||||
|  | 			WaitMs(&(Dev->platform), 1000); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	status = vl53l8cx_set_ranging_frequency_hz(Dev, 15); | ||||||
|  | 	if(status !=0){ | ||||||
|  | 		while(1){ | ||||||
|  | 			printf("vl53l8cx_set_ranging_frequency_hz  (15hz) failed :%d\n", status); | ||||||
|  | 			WaitMs(&(Dev->platform), 1000); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	//vl53l8cx_set_target_order(&Dev, VL53L8CX_TARGET_ORDER_CLOSEST);
 | ||||||
|  | 	vl53l8cx_set_target_order(Dev, VL53L8CX_TARGET_ORDER_STRONGEST); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	/*********************************/ | ||||||
|  | 	/*         Ranging loop          */ | ||||||
|  | 	/*********************************/ | ||||||
|  | 
 | ||||||
|  | 	status = vl53l8cx_start_ranging(Dev); | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void VL53L8_lecture(VL53L8CX_Configuration * Dev, VL53L8CX_ResultsData * Results){ | ||||||
|  | 	uint8_t error; | ||||||
|  |     error = vl53l8cx_get_ranging_data(Dev, Results); | ||||||
|  | 	if(error){ | ||||||
|  | 		printf("Error VL53L8\n"); | ||||||
|  | 		VL53L8_init(Dev); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     /* As the sensor is set in 4x4 mode by default, we have a total 
 | ||||||
|  |         * of 16 zones to print. For this example, only the data of first zone are  | ||||||
|  |         * print */ | ||||||
|  |      | ||||||
|  |     // Filtrage des données
 | ||||||
|  |     for(int row=0; row < 8; row++){ | ||||||
|  |         for(int col=0; col < 8; col++){ | ||||||
|  |             /*if(Results.target_status[col+ 8*row] == 255 ||// No Target detected
 | ||||||
|  |                 Results.target_status[col+ 8*row] == 10 ||// Range valid, but no target detected at previous range
 | ||||||
|  |                 Results.target_status[col+ 8*row] == 4 ||// Target consistency failed
 | ||||||
|  |                 Results.target_status[col+ 8*row] == 3  ){// Sigma error too high
 | ||||||
|  |                 Results.distance_mm[col+ 8*row] = 3000; | ||||||
|  |             }*/ | ||||||
|  |             // Seul status 100% valid
 | ||||||
|  |             if(Results->target_status[col+ 8*row] != 5){ | ||||||
|  |                 Results->distance_mm[col+ 8*row] = 3000; | ||||||
|  |             } | ||||||
|  |             if(Results->distance_mm[col+ 8*row] > 0.9 * masque[col+ 8*row]){ | ||||||
|  |                 Results->distance_mm[col+ 8*row] = 3000; | ||||||
|  |             } | ||||||
|  |             if(Results->distance_mm[col+ 8*row] < 0){ | ||||||
|  |                 printf("Valeur négative %d, status:%d\n", Results->distance_mm[col+ 8*row], Results->target_status[col+ 8*row]); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // Affichage des données
 | ||||||
|  |     printf(">distance:"); | ||||||
|  |     for(int row=0; row < 8; row++){ | ||||||
|  |         for(int col=0; col < 8; col++){ | ||||||
|  |             printf("%d,", Results->distance_mm[col+ 8*row]); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     printf("\n"); | ||||||
|  | } | ||||||
							
								
								
									
										4
									
								
								VL53L8_2024.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								VL53L8_2024.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | |||||||
|  | #include "vl53l8cx_api.h" | ||||||
|  | 
 | ||||||
|  | void VL53L8_init(VL53L8CX_Configuration * Dev); | ||||||
|  | void VL53L8_lecture(VL53L8CX_Configuration * Dev, VL53L8CX_ResultsData * Results); | ||||||
							
								
								
									
										274
									
								
								i2c_maitre.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										274
									
								
								i2c_maitre.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,274 @@ | |||||||
|  | #include "i2c_maitre.h" | ||||||
|  | #include "hardware/gpio.h" | ||||||
|  | #include "hardware/i2c.h" | ||||||
|  | #include "pico/stdlib.h" | ||||||
|  | #include <stdio.h> | ||||||
|  | 
 | ||||||
|  | #define I2C1_SDA_PIN 14 | ||||||
|  | #define I2C1_SCL_PIN 15 | ||||||
|  | 
 | ||||||
|  | #define I2C_NB_MAX_TAMPON 20 | ||||||
|  | 
 | ||||||
|  | enum i2c_statu_t{ | ||||||
|  |     I2C_STATU_LIBRE, | ||||||
|  |     I2C_STATU_OCCUPE | ||||||
|  | } i2c_statu_i2c1; | ||||||
|  | 
 | ||||||
|  | uint16_t I2C_tampon_envoi[I2C_NB_MAX_TAMPON]; | ||||||
|  | uint8_t I2C_tampon_reception[I2C_NB_MAX_TAMPON]; | ||||||
|  | uint16_t I2C_nb_a_envoyer, I2C_nb_a_recevoir; | ||||||
|  | uint8_t adresse_7_bits; | ||||||
|  | uint32_t i2c_error_code; // value of i2c->hw->tx_abrt_source if anything wrong happen, 0 if everything was fine.
 | ||||||
|  | 
 | ||||||
|  | enum transaction_statu_t{ | ||||||
|  |     TRANSACTION_EN_COURS, | ||||||
|  |     TRANSACTION_TERMINEE | ||||||
|  | } statu_emission, statu_reception; | ||||||
|  | 
 | ||||||
|  | void i2d_set_adresse_esclave(uint8_t _adresse_7bits); | ||||||
|  | void i2c_charger_tampon_envoi(uint8_t* emission, uint16_t nb_envoi, uint16_t nb_reception); | ||||||
|  | enum i2c_resultat_t i2c_transmission(uint8_t _adresse_7bits, uint8_t* emission, uint16_t nb_envoi, uint16_t nb_reception); | ||||||
|  | 
 | ||||||
|  | void i2c_maitre_init(void){ | ||||||
|  |     //stdio_init_all();
 | ||||||
|  |     i2c_init(i2c1, 400 * 1000); | ||||||
|  | 
 | ||||||
|  |     printf("Initialisation des broches\n"); | ||||||
|  |     printf("%d et %d en I2C\n", I2C1_SDA_PIN, I2C1_SCL_PIN); | ||||||
|  |     gpio_set_function(I2C1_SDA_PIN, GPIO_FUNC_I2C); | ||||||
|  |     gpio_set_function(I2C1_SCL_PIN, GPIO_FUNC_I2C); | ||||||
|  |     gpio_pull_up(I2C1_SDA_PIN); | ||||||
|  |     gpio_pull_up(I2C1_SCL_PIN); | ||||||
|  | 
 | ||||||
|  |     i2c_statu_i2c1 = I2C_STATU_LIBRE; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// @brief Fonction à appeler régulièrement ou en interruption.
 | ||||||
|  | /// @param i2c 
 | ||||||
|  | void i2c_gestion(i2c_inst_t *i2c){ | ||||||
|  |     // on veut gérer l'i2c avec cette fonction.
 | ||||||
|  |     // 2 cas :
 | ||||||
|  |     // - Soit écriture simple (plusieurs octets (W))
 | ||||||
|  |     // - Soit écriture + lecture (Adresse (W), registre (W), données (R))
 | ||||||
|  |     // Pour écrire 1 octet, i2c->hw->data_cmd = xxx, (avec CMD:8 à 0, ) 
 | ||||||
|  |     // Pour lire 1 octet, i2c->hw->data_cmd = xxx (avec CMD:8 à 1)
 | ||||||
|  |     // Il faut mettre CMD:9 à 1 pour le dernier octet.
 | ||||||
|  | 
 | ||||||
|  |     // Envoi des données (ou des demandes de lecture)
 | ||||||
|  |     static uint16_t index_envoi=0, index_reception=0; | ||||||
|  | 
 | ||||||
|  |     // Acquitement des erreurs, pas 100% fonctionnel ! TODO !
 | ||||||
|  |     if(i2c->hw->tx_abrt_source !=0){ | ||||||
|  |         // Seule solution trouvée pour réinitialiser l'I2C.
 | ||||||
|  |         char a; | ||||||
|  |         i2c_read_blocking(i2c, adresse_7_bits, &a, 1, false); | ||||||
|  | 
 | ||||||
|  |         I2C_nb_a_envoyer = 0; | ||||||
|  |         index_reception = 0; | ||||||
|  |         I2C_nb_a_recevoir = 0; | ||||||
|  |         statu_emission = TRANSACTION_TERMINEE; | ||||||
|  |         statu_reception = TRANSACTION_TERMINEE; | ||||||
|  |         i2c_statu_i2c1 = I2C_STATU_LIBRE; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     while( (index_envoi < I2C_nb_a_envoyer) && (i2c_get_write_available(i2c)) ){ | ||||||
|  |         bool restart = false; | ||||||
|  |         bool last = false; | ||||||
|  | 
 | ||||||
|  |         if (index_envoi == 0){ | ||||||
|  |             // Début de l'envoi, assurons nous d'avoir la bonne adresse de l'esclave
 | ||||||
|  |             i2c->hw->enable = 0; | ||||||
|  |             i2c->hw->tar = adresse_7_bits; | ||||||
|  |             i2c->hw->enable = 1; | ||||||
|  |         }else{ | ||||||
|  |             // Passage de l'écriture à la lecture, on envoie un bit de restart.
 | ||||||
|  |             if( !(I2C_tampon_envoi[index_envoi-1] & I2C_IC_DATA_CMD_CMD_BITS) &&  | ||||||
|  |                     (I2C_tampon_envoi[index_envoi] & I2C_IC_DATA_CMD_CMD_BITS)){ | ||||||
|  |                 restart = true; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if(index_envoi + 1 == I2C_nb_a_envoyer){ | ||||||
|  |             // Fin de la trame, nous devons envoyer un bit de stop.
 | ||||||
|  |             last = true; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         i2c->hw->data_cmd = | ||||||
|  |                 I2C_tampon_envoi[index_envoi] | | ||||||
|  |                 bool_to_bit(restart) << I2C_IC_DATA_CMD_RESTART_LSB | | ||||||
|  |                 bool_to_bit(last) << I2C_IC_DATA_CMD_STOP_LSB; | ||||||
|  | 
 | ||||||
|  |         if(last){ | ||||||
|  |             statu_emission = TRANSACTION_TERMINEE; | ||||||
|  |             index_envoi = 0; | ||||||
|  |             I2C_nb_a_envoyer = 0; | ||||||
|  |             //printf("I2C emission terminee\n");
 | ||||||
|  |         }else{ | ||||||
|  |             index_envoi++; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // Réception des données - Lecture des données présentes dans le tampon
 | ||||||
|  |     while( (index_reception < I2C_nb_a_recevoir) && (i2c_get_read_available(i2c)) ){ | ||||||
|  |         I2C_tampon_reception[index_reception] = (uint8_t) i2c->hw->data_cmd; | ||||||
|  |         index_reception++; | ||||||
|  |     } | ||||||
|  |     if(index_reception == I2C_nb_a_recevoir){ | ||||||
|  |         statu_reception = TRANSACTION_TERMINEE; | ||||||
|  |         index_reception = 0; | ||||||
|  |         I2C_nb_a_recevoir = 0; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if(statu_reception == TRANSACTION_TERMINEE && statu_emission == TRANSACTION_TERMINEE){ | ||||||
|  |         i2c_statu_i2c1 = I2C_STATU_LIBRE; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// @brief Charge le tampon d'émission pour pré-mâcher le travail à la fonction i2c_gestion
 | ||||||
|  | /// @param emission 
 | ||||||
|  | /// @param nb_envoi 
 | ||||||
|  | /// @param nb_reception 
 | ||||||
|  | void i2c_charger_tampon_envoi(uint8_t* emission, uint16_t nb_envoi, uint16_t nb_reception){ | ||||||
|  |     // Données à envoyer
 | ||||||
|  |     for(unsigned int index=0; index<nb_envoi; index++){ | ||||||
|  |         I2C_tampon_envoi[index] = (uint16_t) emission[index]; | ||||||
|  |     } | ||||||
|  |     // Données à lire
 | ||||||
|  |     for(unsigned int index=0; index<nb_reception; index++){ | ||||||
|  |         I2C_tampon_envoi[nb_envoi + index] = (uint16_t) 0x0100; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// @brief Stock l'adresse de l'esclave avec lequel communiquer
 | ||||||
|  | /// @param _adresse_7bits 
 | ||||||
|  | void i2d_set_adresse_esclave(uint8_t _adresse_7bits){ | ||||||
|  |     adresse_7_bits =_adresse_7bits; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// @brief Initialise la transmission I2, sur l'i2c1. Une transmission se compose de 2 trames I2C, une pour écrire (Adresse + données), une pour lire
 | ||||||
|  | /// Si nb_reception = 0, alors la trame pour lire ne sera pas envoyée.
 | ||||||
|  | /// @param emission : données à envoyer
 | ||||||
|  | /// @param nb_envoi : nombre de données à envoyer
 | ||||||
|  | /// @param nb_reception : nombre de données à recevoir
 | ||||||
|  | /// @return I2C_EN_COURS, I2C_SUCCES ou I2C_ECHEC
 | ||||||
|  | enum i2c_resultat_t i2c_transmission(uint8_t _adresse_7bits, uint8_t* emission, uint16_t nb_envoi, uint16_t nb_reception){ | ||||||
|  |     static enum m_statu_t{ | ||||||
|  |         I2C_STATU_INIT, | ||||||
|  |         I2C_STATU_EN_COURS, | ||||||
|  |     }m_statu = I2C_STATU_INIT; | ||||||
|  | 
 | ||||||
|  |     switch(m_statu){ | ||||||
|  |         case I2C_STATU_INIT: | ||||||
|  |             // I2C libre ?
 | ||||||
|  |             if(i2c_statu_i2c1 == I2C_STATU_OCCUPE){ | ||||||
|  |                 return I2C_EN_COURS; | ||||||
|  |             } | ||||||
|  |             // Alors il est à nous !
 | ||||||
|  |             i2c_statu_i2c1 = I2C_STATU_OCCUPE; | ||||||
|  |             statu_emission = TRANSACTION_EN_COURS; | ||||||
|  |             statu_reception = TRANSACTION_EN_COURS; | ||||||
|  |             i2c_error_code = 0; | ||||||
|  | 
 | ||||||
|  |             i2d_set_adresse_esclave(_adresse_7bits); | ||||||
|  | 
 | ||||||
|  |             i2c_charger_tampon_envoi(emission, nb_envoi, nb_reception); | ||||||
|  |             // Nous devons envoyer aussi une commande pour chaque octet à recevoir.
 | ||||||
|  |             I2C_nb_a_envoyer = nb_envoi + nb_reception; | ||||||
|  |             I2C_nb_a_recevoir = nb_reception; | ||||||
|  |              | ||||||
|  |             // On appelle la fonction gestion pour gagner du temps.
 | ||||||
|  |             i2c_gestion(i2c1); | ||||||
|  |             m_statu = I2C_STATU_EN_COURS; | ||||||
|  |             break; | ||||||
|  | 
 | ||||||
|  |         case I2C_STATU_EN_COURS: | ||||||
|  |             if(i2c_statu_i2c1 == I2C_STATU_LIBRE){ | ||||||
|  |                 m_statu = I2C_STATU_INIT; | ||||||
|  |                 if(i2c_error_code){ | ||||||
|  |                     return I2C_ECHEC; | ||||||
|  |                 }else{ | ||||||
|  |                     return I2C_SUCCES; | ||||||
|  |                 } | ||||||
|  |                  | ||||||
|  |             } | ||||||
|  |             break; | ||||||
|  |     } | ||||||
|  |     return I2C_EN_COURS; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// @brief Lit le registre d'un composant se comportant comme une EPROM I2C.
 | ||||||
|  | /// @return I2C_SUCCES, I2C_EN_COURS ou I2C_ECHEC
 | ||||||
|  | enum i2c_resultat_t i2c_lire_registre_nb(uint8_t adresse_7_bits, uint8_t registre, uint8_t * reception, uint8_t len){ | ||||||
|  |     uint8_t emission[1]; | ||||||
|  |     emission[0] = registre; | ||||||
|  |     enum i2c_resultat_t i2c_resultat; | ||||||
|  |     i2c_resultat = i2c_transmission(adresse_7_bits, emission, 1, len); | ||||||
|  |     if(i2c_resultat == I2C_SUCCES){ | ||||||
|  |         for(uint32_t i = 0; i < len; i++){ | ||||||
|  |             reception[i] = I2C_tampon_reception[i]; | ||||||
|  |         } | ||||||
|  |         return I2C_SUCCES; | ||||||
|  |     }else if(i2c_resultat == I2C_ECHEC){ | ||||||
|  |         return I2C_ECHEC; | ||||||
|  |     } | ||||||
|  |     return I2C_EN_COURS;    | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// @brief Initialise une transaction I2C. 
 | ||||||
|  | /// Renvoie I2C_SUCCES si l'intégralité du message est chargé en envoi, 
 | ||||||
|  | /// Renvoie I2C_EN_COURS si la fonction doit encore être appelée pour finir d'envoyer le message
 | ||||||
|  | /// Renvoie I2C_ECHEC en cas d'erreur I2C.
 | ||||||
|  | enum i2c_resultat_t i2c_ecrire_registre_nb(uint8_t adresse_7_bits, uint8_t registre, uint8_t * _emission, uint8_t len){ | ||||||
|  |     uint8_t emission[I2C_NB_MAX_TAMPON]; | ||||||
|  |     emission[0] = registre; | ||||||
|  |     for(uint32_t i = 0; i < len; i++){ | ||||||
|  |         emission[i+1] = _emission[i]; | ||||||
|  |     } | ||||||
|  |     enum i2c_resultat_t i2c_resultat; | ||||||
|  |     return i2c_transmission(adresse_7_bits, emission, 1 + len, 0); | ||||||
|  |      | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// @brief Pour l'instant bloquant, mais devrait passer en non bloquant bientôt => Non, voir i2c_lire_registre_nb
 | ||||||
|  | /// @param adresse_7_bits 
 | ||||||
|  | /// @param  
 | ||||||
|  | /// @return 0: en cours, 
 | ||||||
|  | int i2c_lire_registre(char adresse_7_bits, char registre, char * reception, char len){ | ||||||
|  |     int statu; | ||||||
|  |     char emission[1]; | ||||||
|  | 
 | ||||||
|  |     emission[0] = registre; | ||||||
|  |     statu = i2c_write_blocking (i2c1, adresse_7_bits, emission, 1, 0); | ||||||
|  |     if(statu == PICO_ERROR_GENERIC){ | ||||||
|  |         printf("I2C - Envoi registre Echec - adresse %x\n", adresse_7_bits); | ||||||
|  |         return I2C_ECHEC; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     statu = i2c_read_blocking (i2c1, adresse_7_bits, reception, len, 0); | ||||||
|  |     if(statu == PICO_ERROR_GENERIC){ | ||||||
|  |         printf("I2C - lecture registre Echec - adresse %x\n", adresse_7_bits); | ||||||
|  |         return I2C_ECHEC; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return I2C_SUCCES; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int i2c_ecrire_registre(char adresse_7_bits, char registre, char valeur_registre){ | ||||||
|  |     int statu; | ||||||
|  |     char emission[2]; | ||||||
|  | 
 | ||||||
|  |     emission[0] = registre; | ||||||
|  |     emission[1] = valeur_registre; | ||||||
|  |     statu = i2c_write_blocking (i2c1, adresse_7_bits, emission, 2, 0); | ||||||
|  |     if(statu == PICO_ERROR_GENERIC){ | ||||||
|  |         printf("Erreur ecrire registre\n"); | ||||||
|  |         return I2C_ECHEC; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     printf("i2c Registre %x, valeur %x\n", registre, valeur_registre); | ||||||
|  | 
 | ||||||
|  |     return I2C_SUCCES; | ||||||
|  | } | ||||||
							
								
								
									
										15
									
								
								i2c_maitre.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								i2c_maitre.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | |||||||
|  | #include "pico/stdlib.h" | ||||||
|  | #include "hardware/i2c.h" | ||||||
|  | 
 | ||||||
|  | enum i2c_resultat_t { | ||||||
|  |     I2C_EN_COURS, | ||||||
|  |     I2C_SUCCES, | ||||||
|  |     I2C_ECHEC | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | void i2c_maitre_init(void); | ||||||
|  | void i2c_gestion(i2c_inst_t *i2c); | ||||||
|  | enum i2c_resultat_t i2c_lire_registre_nb(uint8_t adresse_7_bits, uint8_t registre, uint8_t * reception, uint8_t len); | ||||||
|  | enum i2c_resultat_t i2c_ecrire_registre_nb(uint8_t adresse_7_bits, uint8_t registre, uint8_t * _emission, uint8_t len); | ||||||
|  | int i2c_ecrire_registre(char adresse_7_bits, char registre, char valeur_registre); | ||||||
|  | int i2c_lire_registre(char adresse_7_bits, char registre, char * reception, char len); | ||||||
							
								
								
									
										17
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								main.c
									
									
									
									
									
								
							| @ -15,6 +15,8 @@ | |||||||
| #include "Temps.h" | #include "Temps.h" | ||||||
| #include "Trajectoire.h" | #include "Trajectoire.h" | ||||||
| #include "Trajet.h" | #include "Trajet.h" | ||||||
|  | #include "VL53L8_2024.h" | ||||||
|  | #include "vl53l8cx_api.h" | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <math.h> | #include <math.h> | ||||||
| #include "QEI.h" | #include "QEI.h" | ||||||
| @ -41,10 +43,12 @@ float distance1_mm=0, distance2_mm=0; | |||||||
| extern float abscisse;  | extern float abscisse;  | ||||||
| extern struct point_xyo_t point; | extern struct point_xyo_t point; | ||||||
| float vitesse; | float vitesse; | ||||||
|  | VL53L8CX_Configuration Dev; | ||||||
| 
 | 
 | ||||||
| void main(void) | void main(void) | ||||||
| { | { | ||||||
| 	int ledpower = 500; | 	int ledpower = 500; | ||||||
|  | 	VL53L8CX_ResultsData Results; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -54,6 +58,19 @@ void main(void) | |||||||
| 	identifiant_init(); | 	identifiant_init(); | ||||||
| 	Localisation_init(); | 	Localisation_init(); | ||||||
| 	Trajet_init(); | 	Trajet_init(); | ||||||
|  | 	i2c_maitre_init(); | ||||||
|  | 
 | ||||||
|  | 	VL53L8_init(&Dev); | ||||||
|  | 	sleep_ms(100); | ||||||
|  |     VL53L8_lecture( &Dev, &Results); // une première lecture 
 | ||||||
|  |     uint8_t status, isReady; | ||||||
|  | 	while(1){ | ||||||
|  | 		status = vl53l8cx_check_data_ready(&Dev, &isReady); | ||||||
|  | 		if(isReady){ | ||||||
|  | 			VL53L8_lecture( &Dev, &Results); | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	uint32_t temps_ms = Temps_get_temps_ms(); | 	uint32_t temps_ms = Temps_get_temps_ms(); | ||||||
| 	uint32_t temps_depart_ms; | 	uint32_t temps_depart_ms; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user