## stm32F1 VL53L0X例程及部分代码讲解(可调工作模式版)

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了//

你可能感兴趣的:(stm32,F1)