完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近有私信说代码用不了的问题,上传的第一个版本确实有一些优化的缺陷,但是绝对是可以用的,在笔者之前的使用过程中是可以满足需求的,下载了代码的小伙伴不要有拿来即用的想法,可能由于传感器和单片机型号的差异,或者是接线的错误,请有点耐心
由于是去年做的东西,后来一直没碰过,在上次写完博客后不久确实找到了一个更好的demo,笔者按照自己的需求做了修改,但是现在不知道是哪个版本,于是这次重新上传三个版本,有需要的可以下载,以前的46积分是系统设置的,无法修改,这次上传都改成0积分了。 总之,关于四个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 : %sn", vl53l0x_dev_info.Name); //设备名 printf("Device Type : %sn", vl53l0x_dev_info.Type); //产品类型VL53L0X = 1, VL53L1 = 2 printf("Device ID : %sn", vl53l0x_dev_info.ProductId); // 设备ID printf("ProductRevisionMajor : %dn", vl53l0x_dev_info.ProductRevisionMajor); printf("ProductRevisionMinor : %dn", 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.%dn", 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:%drn",distancebuff[0],distancebuff[1],distancebuff[2],distancebuff[3]); delay_ms(1000); } } 笔者一直遇到的问题在前买说了,VL53L0只能使能一次,设置好地址后不要关闭使能,所以只能逐一开启使能完成初始化,否词就会调用出错。 完整工程请自行下载。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1780 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1081 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1679 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
596浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
556浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 19:36 , Processed in 0.839209 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号