STM32F103模拟IIC总线驱动四个VL53L0

2020-11-29晚更新

最近有私信说代码用不了的问题,上传的第一个版本确实有一些优化的缺陷,但是绝对是可以用的,在笔者之前的使用过程中是可以满足需求的,下载了代码的小伙伴不要有拿来即用的想法,可能由于传感器和单片机型号的差异,或者是接线的错误,请有点耐心

由于是去年做的东西,后来一直没碰过,在上次写完博客后不久确实找到了一个更好的demo,笔者按照自己的需求做了修改,但是现在不知道是哪个版本,于是这次重新上传三个版本,有需要的可以下载,以前的46积分是系统设置的,无法修改,这次上传都改成0积分了。

https://download.csdn.net/download/lx635541878/13204120

总之,关于四个VL53L0的使用方法前面我已经讲了,使用iic总线模式,对四个模块设置不同地址,由于每个模块的初始地址都是一样的,所以需要逐一开启每个模块的使能线,修改地址,修改完地址后不要再关闭该模块的使能线了,直接开启下一模块的使能线,完成初始化后就可以获取数据了

第一次写博客,记录一下使用四个正点原子VL53L0获取数据的过程。

使用IIC总线模式驱动四个正点原子VL53L0模块,开发板使用F103ZET6,F1系列都通用,iic是软件模拟,再加四个普通IO,用来做初始化时的片选信号

正点原子的VL53L0用户手册上写明了再次使能时地址会恢复为0x52,这是一个坑,要注意。

//这里是vl530x.c文件

//单个VL53L0初始化
VL53L0X_Error vl53l0x_initX( VL53L0X_Dev_t *pMyDevice ,u8 vl53l0_x_id)
{
    VL53L0X_Error Status = VL53L0X_ERROR_NONE;   //初始值赋值为0
    pMyDevice->I2cDevAddr      = 0x52;        //iic地址  0x52是默认地址,要初始化必须先写0x52,才能初始化,之后再通过软件修改
    pMyDevice->comms_type      =  1;              //选择IIC还是SPI    iic=1;SPI=0
    pMyDevice->comms_speed_khz =  400;            //iic速率   


    //正点原子的VL53L0用户手册上写明了再次使能时地址会恢复为0x52,所以只能使能一次,设置好地址即可,这里是核心
    switch(vl53l0_x_id)
      {
        case 0:  
           I2C_X0_HIGH();  
              delay_ms(20);
           vl53l0x_Addr_set(pMyDevice,0x54);//设置第一个VL53L0X传感器I2C地址
           break;
        case 1:               
           I2C_X1_HIGH();
              delay_ms(20);
           vl53l0x_Addr_set(pMyDevice,0x56);//设置第一个VL53L0X传感器I2C地址
           break;
        case 2:  
            I2C_X2_HIGH();  
               delay_ms(20);
            vl53l0x_Addr_set(pMyDevice,0x58);
            break;
        case 3:  
            I2C_X3_HIGH();  
               delay_ms(20);
            vl53l0x_Addr_set(pMyDevice,0x5a);
            break;
      }
    Status = VL53L0X_DataInit(pMyDevice); // Data initialization  //VL53L0X_DataInit:一次设备的初始化,初始化成功返回0
    if(Status != VL53L0X_ERROR_NONE){     //判断如果状态不为0   打印错误信息
        print_pal_error(Status);
        return Status;        //  返回错误值 可通过此值DEBUG查找错误位置
    }

    Status = VL53L0X_GetDeviceInfo(pMyDevice, &vl53l0x_dev_info);   //读取给定设备的设备信息
    if(Status != VL53L0X_ERROR_NONE){
        print_pal_error(Status);
        return Status;
    }
    printf("VL53L0X_GetDeviceInfo:\n");
    printf("Device Name : %s\n", vl53l0x_dev_info.Name);     //设备名
    printf("Device Type : %s\n", vl53l0x_dev_info.Type);    //产品类型VL53L0X = 1, VL53L1 = 2 
    printf("Device ID : %s\n", vl53l0x_dev_info.ProductId);   // 设备ID
    printf("ProductRevisionMajor : %d\n", vl53l0x_dev_info.ProductRevisionMajor);
    printf("ProductRevisionMinor : %d\n", vl53l0x_dev_info.ProductRevisionMinor);

    if ((vl53l0x_dev_info.ProductRevisionMajor != 1) && (vl53l0x_dev_info.ProductRevisionMinor != 1)){
        printf("Error expected cut 1.1 but found cut %d.%d\n",
        vl53l0x_dev_info.ProductRevisionMajor, vl53l0x_dev_info.ProductRevisionMinor);
        Status = VL53L0X_ERROR_NOT_SUPPORTED;
        print_pal_error(Status);
        return Status;
    }

    Status = vl53l0x_measure_init(pMyDevice);   //测量配置
    vl53l0x_status = Status;
    if(Status != VL53L0X_ERROR_NONE){    //判断如果不为0打印错误信息
        print_pal_error(Status);
        return Status;
    }        
}

//在主函数调用这个初始化函数即可
VL53L0X_Error vl53l0x_init(void)
{
    
    VL53L0X_Error Status = VL53L0X_ERROR_NONE;   //初始值赋值为0

     //初始化一定按照这个顺序执行,否则不成功
     VL53L0X_i2c_init(); 
     vl53l0x_initX(&vl53l0x_dev0,0);
     vl53l0x_initX(&vl53l0x_dev1,1);
     vl53l0x_initX(&vl53l0x_dev2,2);
     vl53l0x_initX(&vl53l0x_dev3,3);
       
    return Status;           //返回0
}

//这里是主函数

int main(void)
{     
        delay_init();             //延时函数初始化      
        NVIC_Configuration();      //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 
        uart_init(9600);
        vl53l0x_init(); 

  while(1)
    {
      vl53l0x_getdistance();

      //distancebuff[4] 定义在vl530x.c文件中,并且声明为外部变量,供主函数调用
      printf( "0:%d 1:%d 2:%d 3:%d\r\n",distancebuff[0],distancebuff[1],distancebuff[2],distancebuff[3]);    
      delay_ms(1000);
    } 
}

笔者一直遇到的问题在前买说了,VL53L0只能使能一次,设置好地址后不要关闭使能,所以只能逐一开启使能完成初始化,否词就会调用出错。

完整工程请自行下载。

https://download.csdn.net/download/lx635541878/11950982

 

 

  • 19
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值