/**
******************************************************************************
* @file vl53l0x_platform.c
* @author MCD Application Team
* @version V1.0.1
* @date 12-April-2017
* @brief VL53L0X sensor platform file for B-L475-IOT01 board
******************************************************************************
* @attention
*
*
© Copyright (c) 2017 STMicroelectronics International N.V.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted, provided that the following conditions are met:
*
* 1. Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of STMicroelectronics nor the names of other
* contributors to this software may be used to endorse or promote products
* derived from this software without specific written permission.
* 4. This software, including modifications and/or derivative works of this
* software, must execute solely and exclusively on microcontroller or
* microprocessor devices manufactured by or for STMicroelectronics.
* 5. Redistribution and use of this software other than as permitted under
* this license is void and will automatically terminate your rights under
* this license.
*
* THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
* SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include
#include "stm32l4xx_hal.h"
#include "vl53l0x_def.h"
#include "vl53l0x_api.h"
#include "vl53l0x_platform.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define I2C_TIME_OUT_BASE 10
#define I2C_TIME_OUT_BYTE 1
#define VL53L0X_OsDelay(...) HAL_Delay(2)
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
int _I2CWrite(VL53L0X_DEV Dev, uint8_t *pdata, uint32_t count) {
int status;
int i2c_time_out = I2C_TIME_OUT_BASE+ count* I2C_TIME_OUT_BYTE;
status = HAL_I2C_Master_Transmit(Dev->I2cHandle, Dev->I2cDevAddr, pdata, count, i2c_time_out);
return status;
}
int _I2CRead(VL53L0X_DEV Dev, uint8_t *pdata, uint32_t count) {
int status;
int i2c_time_out = I2C_TIME_OUT_BASE+ count* I2C_TIME_OUT_BYTE;
status = HAL_I2C_Master_Receive(Dev->I2cHandle, Dev->I2cDevAddr|1, pdata, count, i2c_time_out);
return status;
}
VL53L0X_Error VL53L0X_RdByte(VL53L0X_DEV Dev, uint8_t index, uint8_t *data) {
VL53L0X_Error Status = VL53L0X_ERROR_NONE;
int32_t status_int;
status_int = _I2CWrite(Dev, &index, 1);
if( status_int ){
Status = VL53L0X_ERROR_CONTROL_INTERFACE;
goto done;
}
status_int = _I2CRead(Dev, data, 1);
if (status_int != 0) {
Status = VL53L0X_ERROR_CONTROL_INTERFACE;
}
done:
return Status;
}
uint8_t _I2CBuffer[64];
// the ranging_sensor_comms.dll will take care of the page selection
VL53L0X_Error VL53L0X_WriteMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count) {
int status_int;
VL53L0X_Error Status = VL53L0X_ERROR_NONE;
if (count > sizeof(_I2CBuffer) - 1) {
return VL53L0X_ERROR_INVALID_PARAMS;
}
_I2CBuffer[0] = index;
memcpy(&_I2CBuffer[1], pdata, count);
status_int = _I2CWrite(Dev, _I2CBuffer, count + 1);
if (status_int != 0) {
Status = VL53L0X_ERROR_CONTROL_INTERFACE;
}
return Status;
}
// the ranging_sensor_comms.dll will take care of the page selection
VL53L0X_Error VL53L0X_ReadMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count) {
VL53L0X_Error Status = VL53L0X_ERROR_NONE;
int32_t status_int;
status_int = _I2CWrite(Dev, &index, 1);
if (status_int != 0) {
Status = VL53L0X_ERROR_CONTROL_INTERFACE;
goto done;
}
status_int = _I2CRead(Dev, pdata, count);
if (status_int != 0) {
Status = VL53L0X_ERROR_CONTROL_INTERFACE;
}
done:
return Status;
}
VL53L0X_Error VL53L0X_RdWord(VL53L0X_DEV Dev, uint8_t index, uint16_t *data) {
VL53L0X_Error Status = VL53L0X_ERROR_NONE;
int32_t status_int;
status_int = _I2CWrite(Dev, &index, 1);
if( status_int ){
Status = VL53L0X_ERROR_CONTROL_INTERFACE;
goto done;
}
status_int = _I2CRead(Dev, _I2CBuffer, 2);
if (status_int != 0) {
Status = VL53L0X_ERROR_CONTROL_INTERFACE;
goto done;
}
*data = ((uint16_t)_I2CBuffer[0]<<8) + (uint16_t)_I2CBuffer[1];
done:
return Status;
}
VL53L0X_Error VL53L0X_RdDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t *data) {
VL53L0X_Error Status = VL53L0X_ERROR_NONE;
int32_t status_int;
status_int = _I2CWrite(Dev, &index, 1);
if (status_int != 0) {
Status = VL53L0X_ERROR_CONTROL_INTERFACE;
goto done;
}
status_int = _I2CRead(Dev, _I2CBuffer, 4);
if (status_int != 0) {
Status = VL53L0X_ERROR_CONTROL_INTERFACE;
goto done;
}
*data = ((uint32_t)_I2CBuffer[0]<<24) + ((uint32_t)_I2CBuffer[1]<<16) + ((uint32_t)_I2CBuffer[2]<<8) + (uint32_t)_I2CBuffer[3];
done:
return Status;
}
VL53L0X_Error VL53L0X_WrByte(VL53L0X_DEV Dev, uint8_t index, uint8_t data) {
VL53L0X_Error Status = VL53L0X_ERROR_NONE;
int32_t status_int;
_I2CBuffer[0] = index;
_I2CBuffer[1] = data;
status_int = _I2CWrite(Dev, _I2CBuffer, 2);
if (status_int != 0) {
Status = VL53L0X_ERROR_CONTROL_INTERFACE;
}
return Status;
}
VL53L0X_Error VL53L0X_WrWord(VL53L0X_DEV Dev, uint8_t index, uint16_t data) {
VL53L0X_Error Status = VL53L0X_ERROR_NONE;
int32_t status_int;
_I2CBuffer[0] = index;
_I2CBuffer[1] = data >> 8;
_I2CBuffer[2] = data & 0x00FF;
status_int = _I2CWrite(Dev, _I2CBuffer, 3);
if (status_int != 0) {
Status = VL53L0X_ERROR_CONTROL_INTERFACE;
}
return Status;
}
VL53L0X_Error VL53L0X_WrDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t data) {
VL53L0X_Error Status = VL53L0X_ERROR_NONE;
int32_t status_int;
_I2CBuffer[0] = index;
_I2CBuffer[1] = (data >> 24) & 0xFF;
_I2CBuffer[2] = (data >> 16) & 0xFF;
_I2CBuffer[3] = (data >> 8) & 0xFF;
_I2CBuffer[4] = (data >> 0 ) & 0xFF;
status_int = _I2CWrite(Dev, _I2CBuffer, 5);
if (status_int != 0) {
Status = VL53L0X_ERROR_CONTROL_INTERFACE;
}
return Status;
}
VL53L0X_Error VL53L0X_UpdateByte(VL53L0X_DEV Dev, uint8_t index, uint8_t AndData, uint8_t OrData) {
VL53L0X_Error Status = VL53L0X_ERROR_NONE;
uint8_t data;
Status = VL53L0X_RdByte(Dev, index, &data);
if (Status) {
goto done;
}
data = (data & AndData) | OrData;
Status = VL53L0X_WrByte(Dev, index, data);
done:
return Status;
}
VL53L0X_Error VL53L0X_PollingDelay(VL53L0X_DEV Dev) {
VL53L0X_Error status = VL53L0X_ERROR_NONE;
// do nothing
VL53L0X_OsDelay();
return status;
}
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/