feat: 增加vl53l0x驱动
This commit is contained in:
120
3rd-part/Simple_VL53L0X/VL53l0x_i2c_dev.c
Normal file
120
3rd-part/Simple_VL53L0X/VL53l0x_i2c_dev.c
Normal file
@@ -0,0 +1,120 @@
|
||||
/**
|
||||
* @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;
|
||||
}
|
||||
Reference in New Issue
Block a user