Files
BC3S-firmware/3rd-part/Simple_VL53L0X/VL53l0x_i2c_dev.c

120 lines
3.6 KiB
C
Raw Normal View History

2024-05-11 19:51:10 +08:00
/**
* @brief STM32 HAL
* @author WMD
* @date 2018 4 22 21:20:32
* @version
* @par Copyright (c):
* WMD
* @par
*/
#include "ST_I2C.h"
#include "vl53l0x_api.h"
#include "by_debug.h"
// #include "cmsis_os.h"
/**
* @name
* @{
*/
VL53L0X_Error VL53L0X_WriteMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count)
{
return ST_IICwriteBytes(Dev->I2cDevAddr, index, count, pdata);
}
VL53L0X_Error VL53L0X_ReadMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count)
{
return ST_IICreadBytes(Dev->I2cDevAddr, index, count, pdata);
}
VL53L0X_Error VL53L0X_WrByte(VL53L0X_DEV Dev, uint8_t index, uint8_t data)
{
return ST_IICwriteByte(Dev->I2cDevAddr, index, data);
}
VL53L0X_Error VL53L0X_RdByte(VL53L0X_DEV Dev, uint8_t index, uint8_t *data)
{
return VL53L0X_ReadMulti(Dev, index, data, 1);
}
/// 注意以下这些函数有可能会导致大小端不对
VL53L0X_Error VL53L0X_WrWord(VL53L0X_DEV Dev, uint8_t index, uint16_t data)
{
uint8_t tmp[2] = {((uint16_t)(data & 0xff00) >> 8), ((uint16_t)data & 0x00ff)};
return ST_IICwriteBytes(Dev->I2cDevAddr, index, 2, tmp);
}
VL53L0X_Error VL53L0X_WrDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t data)
{
uint8_t tmp[4] = {((data & 0xff000000) >> 24), ((data & 0x00ff0000) >> 16), ((data & 0x0000ff00) >> 8), ((data & 0x000000ff))};
return ST_IICwriteBytes(Dev->I2cDevAddr, index, 4, tmp);
}
VL53L0X_Error VL53L0X_RdWord(VL53L0X_DEV Dev, uint8_t index, uint16_t *data)
{
uint8_t tmp[2];
uint8_t *p = (uint8_t *)data;
ST_IICreadBytes(Dev->I2cDevAddr, index, 2, tmp);
p[0] = tmp[1];
p[1] = tmp[0];
return 0;
}
VL53L0X_Error VL53L0X_RdDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t *data)
{
uint8_t tmp[4];
uint8_t *p = (uint8_t *)data;
ST_IICreadBytes(Dev->I2cDevAddr, index, 4, tmp);
p[0] = tmp[3];
p[1] = tmp[2];
p[2] = tmp[1];
p[3] = tmp[0];
return 0;
}
VL53L0X_Error VL53L0X_UpdateByte(VL53L0X_DEV Dev, uint8_t index, uint8_t AndData, uint8_t OrData)
{
uint8_t tmp;
ST_IICreadBytes(Dev->I2cDevAddr, index, 1, &tmp);
tmp = (tmp & AndData) | OrData;
return ST_IICwriteByte(Dev->I2cDevAddr, index, tmp);
}
//! 该函数是等待用函数 要改成对应环境的 Delay
VL53L0X_Error VL53L0X_PollingDelay(VL53L0X_DEV Dev)
{
// osDelay(5);
delay_ms(5);
return 0;
}
/** @} */
// 接下来是要引出的简化 API 函数
//! 激光传感器的结构体
static VL53L0X_Dev_t TestDev_s;
static VL53L0X_DEV TestDev = &TestDev_s;
static VL53L0X_RangingMeasurementData_t TestData_s;
static VL53L0X_RangingMeasurementData_t *TestData = &TestData_s;
/**
* @brief
* @param void
* @retval void
* @par
*
*/
void VL53L0X_Init(void)
{
TestDev->I2cDevAddr = 0x52;
VL53L0X_SetDeviceAddress(TestDev, 0x52); // 设置地址
VL53L0X_SetPowerMode(TestDev, VL53L0X_POWERMODE_STANDBY_LEVEL2); // 设定最不省电模式
VL53L0X_SetDeviceMode(TestDev, VL53L0X_DEVICEMODE_CONTINUOUS_RANGING); // 设定连续读取模式
VL53L0X_SetInterMeasurementPeriodMilliSeconds(TestDev, 10); // 设定采样时间
VL53L0X_DataInit(TestDev);
}
/**
* @brief
* @param void
* @retval uint16_t ( mm)
* @note 使
* @par
*
*/
uint16_t VL53L0X_GetValue(void)
{
VL53L0X_PerformSingleMeasurement(TestDev); // 简单测量
VL53L0X_GetRangingMeasurementData(TestDev, TestData);
return TestData->RangeMilliMeter;
}