本文记录了我使用STM32F103结合VL53L0测距模块的一个学习过程。

VL53L0是由ST公司最新推出的一款飞行时间测距+手势检测的微型模块,它应用非常广泛包括:激光测距、避障检测、一维手势识别等;接下来我们重点介绍它的激光测距功能。

一、模块的硬件连接


上图便是我所使用的测距模块GYVL53L0XV2,它预留了六个接口:
1、VIN:供电电压,可在3V~5V范围内进行供电,但如果自己进行电路搭建的话,则需要一个线性稳压电路,将输入电压稳定在2.8V进行芯片供电和芯片I/O端口的上拉,这个可以自己看它的数据手册;
2、GND:参考地;
3、SCL:I2C通信的时钟线;
4、SDA:I2C通信的数据线;
5、XSHUT:芯片的使能管脚,电平1代表有效,电平0代表无效;
6、GPIO1:芯片的中断管脚。

本文与STM32F103的连线如下:

VIN--------------->3.3V
GND------------->GND
SCL-------------->PB6
SDA-------------->PB7

其中XSHUT与GPIO1没有连接,由电路可知,未连接时它们均上拉为高电平,XSHUT一直为高则代表芯片始终有效工作,如果有需要也可以进行连接,用单片机控制。在这里我没有使用到,因此直接不连接就行。

二、程序代码

#ifndef _VL53L0_H
#define _VL53L0_H#define VL53L0X_REG_IDENTIFICATION_MODEL_ID         0xc0
#define VL53L0X_REG_IDENTIFICATION_REVISION_ID      0xc2
#define VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD   0x50
#define VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD 0x70
#define VL53L0X_REG_SYSRANGE_START                  0x00
#define VL53L0X_REG_RESULT_INTERRUPT_STATUS         0x13
#define VL53L0X_REG_RESULT_RANGE_STATUS             0x14
#define VL53L0X_Add 0x29
#include "stm32f10x.h"
#include "bsp_usart1.h"
#include "bsp_i2c_gpio.h"u8 VL53L0X_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf);
u8 VL53L0X_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf);
u8 VL53L0X_Write_Byte(u8 reg,u8 data);
u8 VL53L0X_Read_Byte(u8 reg);
uint16_t bswap(u8 b[]);
uint16_t VL53L0X_decode_vcsel_period(short vcsel_period_reg);
uint16_t makeuint16(int lsb, int msb);       #endif#include "VL53L0.h"
uint16_t bswap(u8 b[])
{uint16_t val = ((b[0]<< 8) & b[1]);return val;
}uint16_t VL53L0X_decode_vcsel_period(short vcsel_period_reg)
{uint16_t vcsel_period_pclks = (vcsel_period_reg + 1) <<1;return vcsel_period_pclks;
}uint16_t makeuint16(int lsb, int msb)
{return ((msb & 0xFF) << 8) | (lsb & 0xFF);
}u8 VL53L0X_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{u8 i; i2c_Start(); i2c_SendByte((addr<<1)|0);if(i2c_WaitAck()){i2c_Stop();        return 1;      }i2c_SendByte(reg);i2c_WaitAck();       for(i=0;i<len;i++){i2c_SendByte(buf[i]);  if(i2c_WaitAck())       {i2c_Stop();     return 1;       }      }    i2c_Stop();     return 0;
} u8 VL53L0X_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{ i2c_Start(); i2c_SendByte((addr<<1)|0);if(i2c_WaitAck())    i2c_Stop();      return 1;      }i2c_SendByte(reg); i2c_WaitAck();      i2c_Start();i2c_SendByte((addr<<1)|1);    i2c_WaitAck();      while(len){if(len==1){*buf=i2c_ReadByte();i2c_NAck();}else {*buf=i2c_ReadByte();    i2c_Ack();}len--;buf++; }    i2c_Stop();return 0;
}//IIC写一个字节
//reg:寄存器地址
//data:数据
//·返回值:0,代表正常
//     其他,错误代码
u8 VL53L0X_Write_Byte(u8 reg,u8 data)
{ i2c_Start(); i2c_SendByte((VL53L0X_Add<<1)|0);//发送器件地址+写命令if(i2c_WaitAck())    //等待应答{i2c_Stop();       return 1;      }i2c_SendByte(reg); //写寄存器地址i2c_WaitAck();      //等待应答i2c_SendByte(data);//发送数据if(i2c_WaitAck())    //等待应答{i2c_Stop();   return 1;       }       i2c_Stop();     return 0;
}
//IIC读一个字节
//reg:寄存器地址
//返回值:读到的数据
u8 VL53L0X_Read_Byte(u8 reg)
{u8 res;i2c_Start(); i2c_SendByte(0x52);//发送器件地址+写命令   i2c_WaitAck();      //等待应答i2c_SendByte(reg);    //写寄存器地址i2c_WaitAck();      //等待应答i2c_Start();i2c_SendByte(0x53 );//发送器件地址+读命令i2c_WaitAck();i2c_SendByte(reg);    //写寄存器地址res=i2c_ReadByte();   //读取数据,发送nACKi2c_Stop();           //产生一个停止条件return res;
}main.c:
#include "stm32f10x.h"
#include "bsp_usart1.h"
#include "bsp_i2c_gpio.h"
#include "VL53L0.h"uint8_t Rxflag=0;
uint8_t ucTemp;int main(void)
{   u8 val = 0;u8 gbuf[16];u8 DeviceRangeStatusInternal;u8 tp=0;uint32_t cnt = 0;uint16_t count[3];NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);USARTx_Config();NVIC_Configuration();InitSysTick();bsp_InitI2C();while(1){VL53L0X_Write_Byte(VL53L0X_REG_SYSRANGE_START, 0x01);while(cnt < 100){delay_ms(10);val = VL53L0X_Read_Byte(VL53L0X_REG_RESULT_RANGE_STATUS);if( val & 0x01) break;cnt++;}if( val & 0x01)printf("\r\n readey \r\n");elseprintf("\r\n not readey \r\n");VL53L0X_Read_Len(VL53L0X_Add, 0x14 , 12, gbuf);count[0] = makeuint16(gbuf[7], gbuf[6]);count[1] = makeuint16(gbuf[9], gbuf[8]);count[2] = makeuint16(gbuf[11], gbuf[10]);DeviceRangeStatusInternal = ((gbuf[0] & 0x78) >> 3);printf("\r\n ambient count = %4d signal count = %4d distance = %4d status = %d ",count[0],count[1],count[2],DeviceRangeStatusInternal);delay_ms(1000);}
}

具体代码可下载:以上代码的完整版-STM32F103+VL53L0源代码

**未完待续:STM32F103+VL53L0测距(二)

接下来将要发布的内容是关于STM32F103使用GPIO模拟I2C与VL53L0通信的代码**

STM32F103+VL53L0测距(一)相关推荐

  1. VL53L0测距芯片试用【ST主题月】

    http://bbs.eeworld.com.cn/thread-496247-1-1.html 还记得上次的VL6180评估板的试用吗?现在VL53L0面世了,这次让我们开始VL53L0评估板的试用 ...

  2. STM32F103驱动HCSR04超声波测距显示

    STM32F103驱动HCSR04超声波测距显示 目录 超声波模块介绍 ①实物图 ②产品说明 ③电气参数 ④超声波工作原理 驱动代码 ①STM32配置初始化代码 ①超声波驱动应用代码 ②超声波距离计算 ...

  3. STM32F103实现激光测距传感器测距WT-VL53L0 L1

    目录 本博客将采用标准库和HAL库实现 所用设备选择 引脚说明 与单片机的接线表 标准库实现 HAL库实现 本博客将采用标准库和HAL库实现 所用设备选择 单片机型号:STM32F103C8T6  激 ...

  4. 基于STM32F103的超声波测距+屏幕显示功能(汉字显示)

    关于单片机,我用的是STM32F103精英版,(系统板也可以). 超声波就是常用的HC-SR04.原理简单的说一下 基本工作原理: (1)采用IO口TRIG触发测距,给至少10us的高电平信号; (2 ...

  5. STM32F103模拟IIC总线驱动四个VL53L0

    2020-11-29晚更新 最近有私信说代码用不了的问题,上传的第一个版本确实有一些优化的缺陷,但是绝对是可以用的,在笔者之前的使用过程中是可以满足需求的,下载了代码的小伙伴不要有拿来即用的想法,可能 ...

  6. STM32F103 HC-SR04超声波测距

    前言: 为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长. github:my github 注:博客所涉及的关于 stm32 的代码 ...

  7. STM32F103—有关HC-SR04超声波测距模块的代码

    关于HC-SR04超声波测距模块(Trig和Echo的引脚可以自定义,我用的TRIG是PBout(11) ECHO是PBin(10)) 硬件连接: Vcc :5V输入(最好不要用3.3V输入) Tri ...

  8. STM32F103关于输入捕获以及控制超声波测距模块的笔记(2)

    今天操控了超声波测距模块并尝试了关于超声波精度的测量.后来学习了OLED显示屏的一些知识. 首先先说一下超声波测距控制程序中timer.c里面除去相应的串口,定时器,中断等相应的初始化后的一些函数: ...

  9. stm32之蓝牙无线超声波测距

    将以前做过的蓝牙和超声波结合就得到蓝牙无线超声波测距 通过hc05蓝牙模块使手机和stm32开发板能互相发送字符串--DMA&空闲中断 stm32f103之HC_SR04超声波测距 在正点原子 ...

最新文章

  1. 一图读懂Java架构
  2. VS扩展开发 一 导航
  3. 从零开始学习Docker
  4. Objective-C语法快速参考
  5. Hadoop集群搭建之问题锦集
  6. Mysql 浮点型入门
  7. 网线连接电脑共享文件传递
  8. Linux常用监控服务器性能命令 内存 CPU 磁盘
  9. 利用jieba进行中文分词并进行词频统计
  10. Programer Cat 福利
  11. 深度学习(Deep Learning)综述及其延伸,入门必看!
  12. 【熊出没之雪岭熊风】下载
  13. 【Visual C++】游戏开发笔记三十八 浅墨DirectX提高班之六 携手迈向三维世界:四大变换展身手
  14. 2020年金融科技创新项目总结
  15. 西门子实数转整数_西门子PLC字整数与双字整数之间的转换、双整数与实数之间的转换...
  16. 编程英语:常见代码错误 error 语句学习(12)
  17. 又订阅了万维刚的精英日课
  18. MSDC 4.3 接口规范(26)
  19. 三大集合:List、Map、Set
  20. 机器学习笔记之深度信念网络(一)背景介绍与结构表示

热门文章

  1. 电脑连上了WIFI但打不开网页
  2. excel进阶:如何快速自动填充空白单元格上一行的内容
  3. 2014新浪校招笔试题:取水果(17年第一篇让人懵逼的面试题)
  4. 用树莓派搭建公网个人下载平台aria2-pro,推荐6个优质种子资源站
  5. 平面设计师怎么找素材?
  6. Windows Server 2008 R2 搭建ASP网站
  7. 人类刚给火星送去Linux系统,以及一款安卓手机芯片
  8. Coreseek开源中文检索引擎 coreseek-4.1 win7安装教程
  9. 数据中心的双活与灾备方案设计
  10. Eclipse+ GNU ARM Eclipse Plug-in+ Sourcery G++ Lite Edition for ARM+OPENCD+Jlink