/*
这是一个用于VL53L1传感器的源代码,包含了多种用于配置和获取传感器数据的函数。代码分为几个部分,包括设置和获取静态配置、动态配置、系统控制、结果数据、调试数据、前向(GPH)配置和结果,以及影子(shadow)配置和结果。
每个部分包含了一系列函数,用于读取和写入特定的寄存器或数据结构到传感器。例如,`VL53L1_i2c_encode_static_config` 和 `VL53L1_i2c_decode_static_config` 是用于将静态配置数据编码和解码为I2C缓冲区,然后通过I2C接口写入和读取传感器。
这些函数通常先检查缓冲区大小是否足够,然后执行具体的编码或解码操作,并将结果返回给调用者。在写入传感器之前,通常还会禁用固件(固件控制模式),写入数据后再重新启用固件。
这些函数通常被设计为在特定的上下文中使用,例如在设置或获取传感器配置时,或者在进行测量和获取结果时。每个函数都设计为与特定的寄存器或数据结构相关联,这样它们就可以被用在特定的上下文中,以执行特定的任务。
这些函数提供了一种方便的方式来与VL53L1传感器进行通信,使得配置和读取传感器数据变得简单而直接。
*/
/**
* @file vl53l1_register_funcs.c
* @brief VL53L1 Register Function definitions
*/
#include "vl53l1_ll_def.h"
#include "vl53l1_platform.h"
#include "vl53l1_platform_log.h"
#include "vl53l1_core.h"
#include "vl53l1_register_map.h"
#include "vl53l1_register_structs.h"
#include "vl53l1_register_funcs.h"
#define LOG_FUNCTION_START(fmt, ...) \
_LOG_FUNCTION_START(VL53L1_TRACE_MODULE_REGISTERS, fmt, ##__VA_ARGS__)
#define LOG_FUNCTION_END(status, ...) \
_LOG_FUNCTION_END(VL53L1_TRACE_MODULE_REGISTERS, status, ##__VA_ARGS__)
#define LOG_FUNCTION_END_FMT(status, fmt, ...) \
_LOG_FUNCTION_END_FMT(VL53L1_TRACE_MODULE_REGISTERS, status, fmt, ##__VA_ARGS__)
VL53L1_Error VL53L1_i2c_encode_static_nvm_managed(
VL53L1_static_nvm_managed_t *pdata,
uint16_t buf_size,
uint8_t *pbuffer)
{
/**
* Encodes data structure VL53L1_static_nvm_managed_t into a I2C write buffer
* Buffer must be at least 11 bytes
*/
VL53L1_Error status = VL53L1_ERROR_NONE;
LOG_FUNCTION_START("");
if (VL53L1_STATIC_NVM_MANAGED_I2C_SIZE_BYTES > buf_size)
return VL53L1_ERROR_COMMS_BUFFER_TOO_SMALL;
*(pbuffer + 0) =
pdata->i2c_slave__device_address & 0x7F;
*(pbuffer + 1) =
pdata->ana_config__vhv_ref_sel_vddpix & 0xF;
*(pbuffer + 2) =
pdata->ana_config__vhv_ref_sel_vquench & 0x7F;
*(pbuffer + 3) =
pdata->ana_config__reg_avdd1v2_sel & 0x3;
*(pbuffer + 4) =
pdata->ana_config__fast_osc__trim & 0x7F;
VL53L1_i2c_encode_uint16_t(
pdata->osc_measured__fast_osc__frequency,
2,
pbuffer + 5);
*(pbuffer + 7) =
pdata->vhv_config__timeout_macrop_loop_bound;
*(pbuffer + 8) =
pdata->vhv_config__count_thresh;
*(pbuffer + 9) =
pdata->vhv_config__offset & 0x3F;
*(pbuffer + 10) =
pdata->vhv_config__init;
LOG_FUNCTION_END(status);
return status;
}
VL53L1_Error VL53L1_i2c_decode_static_nvm_managed(
uint16_t buf_size,
uint8_t *pbuffer,
VL53L1_static_nvm_managed_t *pdata)
{
/**
* Decodes data structure VL53L1_static_nvm_managed_t from the input I2C read buffer
* Buffer must be at least 11 bytes
*/
VL53L1_Error status = VL53L1_ERROR_NONE;
LOG_FUNCTION_START("");
if (VL53L1_STATIC_NVM_MANAGED_I2C_SIZE_BYTES > buf_size)
return VL53L1_ERROR_COMMS_BUFFER_TOO_SMALL;
pdata->i2c_slave__device_address =
(*(pbuffer + 0)) & 0x7F;
pdata->ana_config__vhv_ref_sel_vddpix =
(*(pbuffer + 1)) & 0xF;
pdata->ana_config__vhv_ref_sel_vquench =
(*(pbuffer + 2)) & 0x7F;
pdata->ana_config__reg_avdd1v2_sel =
(*(pbuffer + 3)) & 0x3;
pdata->ana_config__fast_osc__trim =
(*(pbuffer + 4)) & 0x7F;
pdata->osc_measured__fast_osc__frequency =
(VL53L1_i2c_decode_uint16_t(2, pbuffer + 5));
pdata->vhv_config__timeout_macrop_loop_bound =
(*(pbuffer + 7));
pdata->vhv_config__count_thresh =
(*(pbuffer + 8));
pdata->vhv_config__offset =
(*(pbuffer + 9)) & 0x3F;
pdata->vhv_config__init =
(*(pbuffer + 10));
LOG_FUNCTION_END(status);
return status;
}
VL53L1_Error VL53L1_set_static_nvm_managed(
VL53L1_DEV Dev,
VL53L1_static_nvm_managed_t *pdata)
{
/**
* Serialises and sends the contents of VL53L1_static_nvm_managed_t
* data structure to the device
*/
VL53L1_Error status = VL53L1_ERROR_NONE;
uint8_t comms_buffer[VL53L1_STATIC_NVM_MANAGED_I2C_SIZE_BYTES];
LOG_FUNCTION_START("");
if (status == VL53L1_ERROR_NONE) /*lint !e774 always true*/
status = VL53L1_i2c_encode_static_nvm_managed(
pdata,
VL53L1_STATIC_NVM_MANAGED_I2C_SIZE_BYTES,
comms_buffer);
if (status == VL53L1_ERROR_NONE)
status = VL53L1_WriteMulti(
Dev,
VL53L1_I2C_SLAVE__DEVICE_ADDRESS,
comms_buffer,
VL53L1_STATIC_NVM_MANAGED_I2C_SIZE_BYTES);
LOG_FUNCTION_END(status);
return status;
}
VL53L1_Error VL53L1_get_static_nvm_managed(
VL53L1_DEV Dev,
VL53L1_static_nvm_managed_t *pdata)
{
/**
* Reads and de-serialises the contents of VL53L1_static_nvm_managed_t
* data structure from the device
*/
VL53L1_Error status = VL53L1_ERROR_NONE;
uint8_t comms_buffer[VL53L1_STATIC_NVM_MANAGED_I2C_SIZE_BYTES];
LOG_FUNCTION_START("");
if (status == VL53L1_ERROR_NONE) /*lint !e774 always true*/
status = VL53L1_ReadMulti(
Dev,
VL53L1_I2C_SLAVE__DEVICE_ADDRESS,
comms_buffer,
VL53L1_STATIC_NVM_MANAGED_I2C_SIZE_BYTES);
if (status == VL53L1_ERROR_NONE)
status = VL53L1_i2c_decode_static_nvm_managed(
VL53L1_STATIC_NVM_MANAGED_I2C_SIZE_BYTES,
comms_buffer,
pdata);
LOG_FUNCTION_END(status);
return status;
}
VL53L1_Error VL53L1_i2c_encode_customer_nvm_managed(
VL53L1_customer_nvm_managed_t *pdata,
uint16_t buf_size,
uint8_t *pbuffer)
{
/**
* Encodes data structure VL53L1_customer_nvm_managed_t into a I2C write buffer
* Buffer must be at least 23 bytes
*/
VL53L1_Error status = VL53L1_ERROR_NONE;
LOG_FUNCTION_START("");
if (VL53L1_CUSTOMER_NVM_MANAGED_I2C_SIZE_BYTES > buf_size)
return VL53L1_ERROR_COMMS_BUFFER_TOO_SMALL;
*(pbuffer + 0) =
pdata->global_config__spad_enables_ref_0;
*(pbuffer + 1) =
pdata->global_config__spad_enables_ref_1;
*(pbuffer + 2) =
pdata->global_config__spad_enables_ref_2;
*(pbuffer + 3) =
pdata->global_config__spad_enables_ref_3;
*(pbuffer + 4) =
pdata->global_config__spad_enables_ref_4;
*(pbuffer + 5) =
pdata->global_config__spad_enables_ref_5 & 0xF;
*(pbuffer + 6) =
pdata->global_config__ref_en_start_select;
*(pbuffer + 7) =
pdata->ref_spad_man__num_requested_ref_spads & 0x3F;
*(pbuffer + 8) =
pdata->ref_spad_man__ref_location & 0x3;
VL53L1_i2c_encode_uint16_t(
pdata->algo__crosstalk_compensation_plane_offset_kcps,
2,
pbuffer + 9);
VL53L1_i2c_encode_int16_t(
pdata->algo__crosstalk_compensation_x_plane_gradient_kcps,
2,
pbuffer + 11);
VL53L1_i2c_encode_int16_t(
pdata->algo__crosstalk_compensation_y_plane_gradient_kcps,
2,
pbuffer + 13);
VL53L1_i2c_encode_uint16_t(
pdata->ref_spad_char__total_rate_target_mcps,
2,
pbuffer + 15);
VL53L1_i2c_encode_int16_t(
pdata->algo__part_to_part_range_offset_mm & 0x1FFF,
2,
pbuffer + 17);
VL53L1_i2c_encode_int16_t(
pdata->mm_config__inner_offset_mm,
2,
pbuffer + 19);
VL53L1_i2c_encode_int16_t(
pdata->mm_config__outer_offset_mm,
2,
pbuffer + 21);
LOG_FUNCTION_END(status);
return status;
}
VL53L1_Error VL53L1_i2c_decode_customer_nvm_managed(
uint16_t buf_size,
uint8_t *pbuffer,
VL53

静默小音箱
- 粉丝: 2324
最新资源
- 科技管理AI+数智应用服务如何助力企业提升管理效率与创新能力?.docx
- 科技管理部门和开发商如何借助AI+数智应用携手提升管理系统效能?.docx
- 科技管理部门和系统开发商如何利用AI+数智应用实现科技管理的高效与价值最大化?.docx
- 科技管理部门和开发商如何让 AI+数智应用驱动的科技管理更具竞争力?.docx
- 科技管理部门如何借助 AI+数智应用激发内生动力,实现管理创新与价值创造?.docx
- 科技管理的创新有哪些新趋势?AI+数智应用能带来什么机遇?.docx
- 科技管理服务平台为何大多只有管理没有服务,如何通过AI+数智应用破局?.docx
- 科技管理服务商如何借助AI+数智应用帮助提升科技管理系统的效率?.docx
- 科技管理工作如何借助 AI+数智应用实现智能化升级?.docx
- 科技管理工作如何借助AI+数智应用打破瓶颈,实现价值创造?.docx
- 科技管理工作如何借助AI+数智应用工具实现效率与创新的双重突破?.docx
- 科技管理工作如何借助AI+数智应用突破传统模式,实现更高效的管理?.docx
- 科技管理工作者如何利用AI+数智应用应对新技术带来的挑战?.docx
- 科技管理公司如何借助AI+数智应用突破传统管理系统局限,实现高效管理与价值创造?.docx
- 科技管理工作中,如何通过AI+数智应用高效实现科技要素的融合对接?.docx
- 科技管理工作中,如何通过AI+数智应用精准解决环节性需求,实现管理变革?.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


