/** * @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; }