这是一个国产的激光测距芯片,相对于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;
}
以上是驱动程序调用逻辑,应用中如有任何问题,欢迎留言讨论!


被折叠的 条评论
为什么被折叠?



