芯视界VI5300 TOF激光芯片模拟驱动代码

这是一个国产的激光测距芯片,相对于ST 的VL53L4来说,国产的价格优势太明显了,性能、功能够用:

因此,在项目评估过程中,确认使用该模块开发。

此驱动代码在项目中已经验证OK,有需要的朋友自取。

VI5300相关GPIO 初始化(居于CW32L010)

//VI5300初始化
void VI5300_Conf_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStruct = {0};

		//__disable_irq();                     // 关闭全局中断
		NVIC_SetPriority(GPIOB_IRQn, IRQ_PRIORITY_HIGHEST); 
        NVIC_EnableIRQ(GPIOB_IRQn);           //使能GPIOB外部中断
		//__enable_irq();                     // 开启全局中断
		
		//SDA
		GPIO_InitStruct.IT = GPIO_IT_NONE;
		GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;    //开漏输出
		GPIO_InitStruct.Pins = VL53_SDA_GPIO_PIN;
		GPIO_Init(VL53_SDA_GPIO_Port, &GPIO_InitStruct);
		
		//SCL
		GPIO_InitStruct.IT = GPIO_IT_NONE;
		GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;    //数字输出
		GPIO_InitStruct.Pins = VL53_SCL_GPIO_PIN;
		GPIO_Init(VL53_SCL_GPIO_Port, &GPIO_InitStruct);
		
		//XSHUT
		GPIO_InitStruct.IT = GPIO_IT_NONE;
		GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;    //数字输出
		GPIO_InitStruct.Pins = VL53_SHUT_GPIO_PIN;
		GPIO_Init(VL53_SHUT_GPIO_Port, &GPIO_InitStruct);
		
		//GPIO1
		GPIO_InitStruct.IT = GPIO_IT_FALLING;
		GPIO_InitStruct.Mode = GPIO_MODE_INPUT;         //中断输入
		GPIO_InitStruct.Pins = EXIT_VL53_GPIO_PIN;
		GPIO_Init(EXIT_VL53_GPIO_Port, &GPIO_InitStruct);
}

VI5300 初始化


VI530x_Status VI5300_Int_Sub(void){
	
		VI5300_status = VI530x_OK;
		
		//配置VI5300参数
		//1、选择中断方式:0x00----寄存器0x03查询,其他值----GPIO硬件中断
		#if INTERRUPT_MODE	
				VI530x_Cali_Data.VI530x_Interrupt_Mode_Status = 0x88;		//GPIO引脚启用,硬件中断
		#else	
				VI530x_Cali_Data.VI530x_Interrupt_Mode_Status = 0x00;		//GPIO引脚不启用,软件中断
		#endif
		
		//2、选择复位方式
		#if Xshut_MODE
				VI530x_Chip_PowerON();							//Xshut引脚启用,硬件复位/使能,**建议方式**
		#else	
				VI530x_Chip_SWReset();			  //Xshut引脚不启用,软复位,Xshut引脚需要上拉
		#endif
	
		//3、初始化VI5300
		//VI5300_status = VI530x_Chip_Init();	
		for(uint8_t i=5; i>0; i--){
				VI5300_status = VI530x_Chip_Init();	
				if(VI5300_status == VI530x_OK) break;    //返回正常,跳出执行下一步
				//LED_R_1; Delay_Ms(10); LED_R_0;  
		}
		if(VI5300_status != VI530x_OK) return VI5300_status;
		
		//4、VI530x固件写入,系统参数配置
		VI5300_status = VI530x_Download_Firmware((uint8_t *)VI5300_M31_firmware_buff, FirmwareSize());
		if(VI5300_status != VI530x_OK){
				return VI5300_status;
		} 
		
		//5、需根据应用需求评估测试使用, FPS帧率范围0-120, 积分次数最大值需计算:
		//VI5300_status = VI530x_Set_Integralcounts_Frame(5,1310);	//帧率,积分次数,默认(30,131072)
		for(uint8_t i=5; i>0; i--){
				VI5300_status = VI530x_Set_Integralcounts_Frame(5,131072);	//帧率,积分次数,默认(30,131072)
				if(VI5300_status == VI530x_OK) break;    //返回正常,跳出执行下一步
				//LED_R_1; Delay_Ms(10); LED_R_0;  
		}
		if(VI5300_status != VI530x_OK) return VI5300_status;
		
		//6、获取激光标定状态
		//获取FLASH中的校准标定参数 0:正常   1:异常,必须需要重新执行标定   
		uint8_t status_calib = GET_VI5300_Calibration();      //这里直接返回1,未做校准,如需校准,需要实现;
		
		//7、配置激光标定参数
		if(status_calib == 1){
			  //标定参数获取异常,加载异常提示并尝试使用默认配置进行标定
			
				//初始化标定参数
			  VI530x_Cali_Data.VI530x_Calibration_Offset = 0;    //float
				VI530x_Cali_Data.VI530x_Calibration_CG_Pos = 0;    //int8_t
				VI530x_Cali_Data.VI530x_Calibration_CG_Maxratio = 10;    //uint8_t
				//RefToF标定没做前请在关闭温补功能。
				VI530x_Cali_Data.VI530x_Calibration_Reftof = 0;       //uint16_t
				#ifdef VI530x_GRADIENTK_CALIBRATION
				VI530x_Cali_Data.VI530x_Calibration_GradientK = 1;     //float
				#endif
		}else{
				//标定参数正常,直接加载
				
		}
		
		///8、设置标定参数
		//VI530x_Cali_Data.VI530x_Calibration_CG_Maxratio += 10;	//增加Xtalk处理上限,正常不需要启用,需实测
		//VI5300_status |= VI530x_Set_Californiation_Data(VI530x_Cali_Data);     //设置标定参数
		for(uint8_t i=5; i>0; i--){
				VI5300_status =  VI530x_Set_Californiation_Data(VI530x_Cali_Data);     //设置标定参数
				if(VI5300_status == VI530x_OK) break;    //返回正常,跳出执行下一步
				//LED_R_1; Delay_Ms(10); LED_R_0;  
		}
		if(VI5300_status != VI530x_OK) return VI5300_status;
		
		//9、温度校准,做了RefTof标定后,再开启温度校准
		#if VI5300_Temp_CALIBRATION
				//VI5300_status |= VI530x_Set_Sys_Temperature_Enable(0x00);
				for(uint8_t i=5; i>0; i--){
						VI5300_status =   VI530x_Set_Sys_Temperature_Enable(0x01);
						if(VI5300_status == VI530x_OK) break;    //返回正常,跳出执行下一步
				}
				if(VI5300_status != VI530x_OK) return VI5300_status;
				
		#else	
				//VI5300_status |= VI530x_Set_Sys_Temperature_Enable(0x00);
				for(uint8_t i=5; i>0; i--){
						VI5300_status =   VI530x_Set_Sys_Temperature_Enable(0x00);
						if(VI5300_status == VI530x_OK) break;    //返回正常,跳出执行下一步
						//LED_R_1; Delay_Ms(10); LED_R_0;  
				}
				if(VI5300_status != VI530x_OK) return VI5300_status;
		#endif
				
		//10、开启测距,配置测距方式
		//ret |= VI530x_Stop_Continue_Ranging_Cmd();	//关闭命令,给芯片下发命令前需要芯片停止状态
		//VI5300_status |= VI530x_Start_Continue_Ranging_Cmd();	//连续模式,功耗会更高一些
		for(uint8_t i=5; i>0; i--){
				VI5300_status =  VI530x_Start_Continue_Ranging_Cmd();	//连续模式,功耗会更高一些
				if(VI5300_status == VI530x_OK) break;    //返回正常,跳出执行下一步
				//LED_R_1; Delay_Ms(10); LED_R_0;  
		}
		if(VI5300_status != VI530x_OK) return VI5300_status;
		//ret = VI530x_Start_Single_Ranging_Cmd();	//单次模式,功耗低
		
		//11、判断初始化状态
		return VI530x_OK;
}

以上是驱动程序调用逻辑,应用中如有任何问题,欢迎留言讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值