238 lines
6.6 KiB
C
238 lines
6.6 KiB
C
//?????#include "hal.h"
|
|
#include "vl53l0x_platform.h"
|
|
#include "vl53l0x_api.h"
|
|
|
|
#include "stm32wlxx_hal.h"
|
|
#include <string.h>
|
|
|
|
#define I2C_TIME_OUT_BASE 10
|
|
#define I2C_TIME_OUT_BYTE 1
|
|
#define VL53L0X_OsDelay(...) HAL_Delay(2)
|
|
|
|
|
|
#ifndef HAL_I2C_MODULE_ENABLED
|
|
#warning "HAL I2C module must be enable "
|
|
#endif
|
|
//extern I2C_HandleTypeDef hi2c1;
|
|
//#define VL53L0X_pI2cHandle (&hi2c1)
|
|
|
|
/* when not customized by application define dummy one */
|
|
#ifndef VL53L0X_GetI2cBus
|
|
/** This macro can be overloaded by user to enforce i2c sharing in RTOS context
|
|
*/
|
|
# define VL53L0X_GetI2cBus(...) (void)0
|
|
#endif
|
|
|
|
#ifndef VL53L0X_PutI2cBus
|
|
/** This macro can be overloaded by user to enforce i2c sharing in RTOS context
|
|
*/
|
|
# define VL53L0X_PutI2cBus(...) (void)0
|
|
#endif
|
|
|
|
#ifndef VL53L0X_OsDelay
|
|
# define VL53L0X_OsDelay(...) (void)0
|
|
#endif
|
|
|
|
|
|
uint8_t _I2CBuffer[64];
|
|
|
|
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);
|
|
if (status) {
|
|
//VL6180x_ErrLog("I2C error 0x%x %d len", dev->I2cAddr, len);
|
|
//XNUCLEO6180XA1_I2C1_Init(&hi2c1);
|
|
}
|
|
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);
|
|
if (status) {
|
|
//VL6180x_ErrLog("I2C error 0x%x %d len", dev->I2cAddr, len);
|
|
//XNUCLEO6180XA1_I2C1_Init(&hi2c1);
|
|
}
|
|
return status;
|
|
}
|
|
|
|
// 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);
|
|
VL53L0X_GetI2cBus();
|
|
status_int = _I2CWrite(Dev, _I2CBuffer, count + 1);
|
|
if (status_int != 0) {
|
|
Status = VL53L0X_ERROR_CONTROL_INTERFACE;
|
|
}
|
|
VL53L0X_PutI2cBus();
|
|
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;
|
|
VL53L0X_GetI2cBus();
|
|
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:
|
|
VL53L0X_PutI2cBus();
|
|
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;
|
|
|
|
VL53L0X_GetI2cBus();
|
|
status_int = _I2CWrite(Dev, _I2CBuffer, 2);
|
|
if (status_int != 0) {
|
|
Status = VL53L0X_ERROR_CONTROL_INTERFACE;
|
|
}
|
|
VL53L0X_PutI2cBus();
|
|
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;
|
|
|
|
VL53L0X_GetI2cBus();
|
|
status_int = _I2CWrite(Dev, _I2CBuffer, 3);
|
|
if (status_int != 0) {
|
|
Status = VL53L0X_ERROR_CONTROL_INTERFACE;
|
|
}
|
|
VL53L0X_PutI2cBus();
|
|
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;
|
|
VL53L0X_GetI2cBus();
|
|
status_int = _I2CWrite(Dev, _I2CBuffer, 5);
|
|
if (status_int != 0) {
|
|
Status = VL53L0X_ERROR_CONTROL_INTERFACE;
|
|
}
|
|
VL53L0X_PutI2cBus();
|
|
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_RdByte(VL53L0X_DEV Dev, uint8_t index, uint8_t *data) {
|
|
VL53L0X_Error Status = VL53L0X_ERROR_NONE;
|
|
int32_t status_int;
|
|
|
|
VL53L0X_GetI2cBus();
|
|
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:
|
|
VL53L0X_PutI2cBus();
|
|
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;
|
|
|
|
VL53L0X_GetI2cBus();
|
|
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:
|
|
VL53L0X_PutI2cBus();
|
|
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;
|
|
|
|
VL53L0X_GetI2cBus();
|
|
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:
|
|
VL53L0X_PutI2cBus();
|
|
return Status;
|
|
}
|
|
|
|
VL53L0X_Error VL53L0X_PollingDelay(VL53L0X_DEV Dev) {
|
|
VL53L0X_Error status = VL53L0X_ERROR_NONE;
|
|
|
|
// do nothing
|
|
VL53L0X_OsDelay();
|
|
return status;
|
|
}
|
|
|
|
//end of file
|