stm32F1 VL53L0X例程及部分代码讲解(可调工作模式版)
前段时间为了使用这个模块,翻看手册,发现全是英文看不太懂,就到处从网上找VL53L0X的例程,发现下载的很多个例程都不能用。为了避免大家少走弯路,我在这里总结一下容易出错误的地方。顺便在介绍一下多个I2C工作的基本配置。
1.1 模块初始化
VL53L0X_Error vl53l0x_init(VL53L0X_Dev_t *dev)
{
GPIO_InitTypeDef
- GPIO_InitStructure
;
VL53L0X_Error Status = VL53L0X_ERROR_NONE;
VL53L0X_Dev_t *pMyDevice = dev;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能IO
pMyDevice->I2cDevAddr = VL53L0X_Addr;//I2C地址
pMyDevice->comms_type = 1; //I2C通信模式
pMyDevice->comms_speed_khz = 400; //I2C通信速率
VL53L0X_i2c_init();//初始化I2C
VL53L0X_Xshut=0;//使能端0为传感器不工作
delay_ms(30);
VL53L0X_Xshut=1;//使能端1为传感器工作
delay_ms(30);
==vl53l0x_Addr_set(pMyDevice,0x52)==;//I2C地址
/******************这个地方大家记得设成0x52之前有个博主提供的例程是默认0x54的************/
1.2 I2C接口的速率设置
void VL53L0X_i2c_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
==GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;==//这个地方记得设置成2MHZ 50MHZ是不能用的
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
==GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;==//也需要设置成2MHZ 50MHZ是不能用的
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
还有一点,大家从网下下载的例程记得把他们设置的I2C接口更改一下,很多人的接口都是不一样的。
1.3 I2C的时间设置
那段时间模块不能用,一直在纠结于I2C的delay_us(4)和delay_us(1)的问题,其实这两个并不影响。这两个的差别在I2C的SDA和SCL发送和接收时间段是允许。希望大家不要纠结这个,节约时间。
2 激光测距模块的模式配置问题
网上代码分两种,有一种是阉割版的不能配置工作模式,另一种是可以配置的。
可以配置的我已经上传了大家可以下载。
顺便提一句,高速率模式对于智能小车定位有很好的响应效果,其它模式延迟大,不建议使用
3 多个激光模块的共同工作
我采用的是通过配置使能端口实现的,还有一种是配置地址(暂时没有成功)。
XSHUT接高电平为工作状态,接低电平为休眠状态。可以给不同的传感器配置不同的IO来实现读取每个传感器的值。
另外,可以把多个模块的SCL和SDA并在一起,一起接到开发板上的I2C口上,这样可以节省端口,想用哪个的时候使能它的端口就行了。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //PA4端口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);¸
GPIO_ResetBits(GPIOA,GPIO_Pin_4); //PA.4配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PA5端口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_P ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_5); //PA.5配置
//该文章仅仅是抛砖引玉,因为本人水平有限,如果大家可以看了本文之后可以少走一些弯路就OK了//