基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

这篇具有很好参考价值的文章主要介绍了基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

VL6180X是基于ST FlightSense™专利技术的最新产品。作为一项突破性技术,它实现了独立于目标反射率的绝对距离测量。传统的测量方法通过测量反射光的光量来估算距离,然而这种方法存在一个主要缺点,即被测物体的颜色和表面特性对测量精度产生很大影响。VL6180X采用了一种全新的方法,它精确测量了光线从传感器照射到最近物体,并在反射回传感器所需的时间(即飞行时间),从而准确计算出两者之间的距离。
基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

VL6180X模块集成了一个红外发射器、一个红外传感器和一个环境光传感器,全部封装在一个便于集成的三合一回流焊封装中。这种设计使终端产品制造商能够减少光学和机械设计的优化过程,并降低相关成本。
该模块具备低功耗操作的特点。测距和环境光感应(ALS)测量可以在用户定义的时间间隔内自动执行。此外,它支持多种门限和中断方案,以最大程度地减少主机操作的需要。
主机控制和结果读取是通过I2C接口实现的,方便快捷。此外,VL6180X还提供两个可编程的GPIO引脚,用于可选的附加功能,例如测量准备和门限中断。
通过以上的优化和扩写,文案更加详细地描述了VL6180X模块的工作原理、集成设计的优势以及支持的功能和接口。这些信息可以帮助读者更好地了解该模块的特性和应用价值。
最近在弄ST和瑞萨RA的课程,需要样片的可以加群申请:6_15061293 。
基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

视频教程

https://www.bilibili.com/video/BV1tX4y1q7Zj/

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

样品申请

https://www.wjx.top/vm/OhcKxJk.aspx#

完整代码下载

https://download.csdn.net/download/qq_24312945/87945855

所有功能

  • 三合一智能光学模块
    • 接近传感器
    • 环境光传感器
    • VCSEL光源
  • 快速,精确测距
    • 绝对测量范围从0到超过10 cm(10cm以上的测距取决于具体情况)
    • 不受目标反射率影响
    • 环境光抑制
    • 盖片的串扰补偿
  • 盖片的串扰补偿
    • 主机系统可以用距离和信号电平实现手势识别
    • 可用演示系统:P-NUCLEO-6180X1 评估板
  • 环境光传感器
    • 高动态范围
    • 精确/超低光敏感
    • 校准输出值(以勒克斯为单位)
  • 方便集成
    • 单回流焊元件
    • 无附加光学元件
    • 单电源
    • 用于器件控制和数据的I2C接口
    • 提供一个文档化的C可移植 API(应用程序接口)
  • 两个可编程GPIO
    • 测距和ALS的窗口和门限功能

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

技术规范

该模块的供电要求为2.8V,适合于低电压应用场景。它通过I2C接口进行主机控制和数据通信,方便与其他设备的集成。支持最大快速模式速率,达到400k,确保高效的数据传输。
此外,VL6180X模块具备出色的光照强度检测能力,覆盖了广泛的光照强度范围。从微弱的1 Lux到高达100 kLux的光照强度,该模块能够准确测量环境的光照水平。这使得它在需要实时监测光照条件的应用中非常有用,例如室内照明控制、自动调节显示亮度等。
最后,VL6180X模块具有一个默认地址为0x29的设备地址,这样在多个I2C设备共享同一总线时,可以轻松管理和区分不同的模块。
基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

接口

vl6180模块接口的示意图如下所示。
基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

接口说明

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

最小系统图

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

生成STM32CUBEMX

用STM32CUBEMX生成例程,这里使用MCU为STM32G030C8。
配置时钟树,配置时钟为64M。
基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

串口配置

查看原理图,PA9和PA10设置为开发板的串口。

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

配置串口。

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

IIC配置

在这个应用中,VL6180模块通过I2C(IIC)接口与主控器通信。具体来说,VL6180模块的I2C引脚连接到主控器的PB6(引脚B6)和PB7(引脚B7)两个IO口。
这种连接方式确保了模块与主控器之间的可靠数据传输和通信。PB6作为I2C总线的串行数据线(SDA),负责数据的传输和接收。而PB7则充当I2C总线的串行时钟线(SCL),用于同步数据传输的时序。
基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

配置IIC为快速模式,速度为400k。
基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

串口重定向

打开魔术棒,勾选MicroLIB
基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践
在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

函数声明和串口重定向:

/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f){
	HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
	return ch;
}
/* USER CODE END PFP */

模块片选

根据提供的表格信息,我们可以得知VL6180模块的GPIO0/CE引脚用作片选脚(Chip Enable),在需要使用该功能时,需要给该引脚一个高电平信号。
确保在使用GPIO0/CE引脚时,正确设置引脚的电平状态,并按照VL6180模块的规格和要求进行相应的配置和操作。这将确保模块按照预期工作,并满足特定的功能需求。

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

下面为模块启动时序图。

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

模块地址

VL6180模块的默认设备地址为0x29。设备地址是用来识别和通信特定设备的标识符。通过将VL6180模块的设备地址设置为0x29,您可以确保与该模块进行正常的通信和控制。

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践
虽然VL6180模块的默认设备地址为0x29,但可以通过使用I2C_SLAVE__DEVICE_ADDRESS {0x212}来修改模块的设备地址。
通过修改设备地址,可以为VL6180模块指定一个与默认地址不同的唯一地址。这种灵活性使您能够在同一I2C总线上连接多个VL6180X模块或与其他设备进行通信,而无需担心地址冲突的问题。

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

读写位

在I2C总线上,由于可能连接多个设备,主设备在传输有效数据之前需要指定从设备的地址。大多数从设备使用7位地址,而一些设备支持10位地址寻址。主设备在需要发送或接收数据时,首先发送所需从设备的地址,并匹配总线上挂载的从设备的地址。然后,主设备可以将数据发送到SDA数据线上。
紧随地址的第8位是数据方向位(R/W),其中’0’表示发送(写入),'1’表示请求数据(读取)。
对于VL6180模块,默认的7位地址是0x29(二进制为010 1001),加上写位后为0x52(二进制为0101 0010),加上读位后为0x53(二进制为0101 0011)。
这意味着当主设备与VL6180模块进行通信时,要发送0x52地址字节进行写操作,或发送0x53地址字节进行读取操作。

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

extern I2C_HandleTypeDef hi2c1;

void VL6180X_WriteByte(uint8_t add,uint16_t reg,uint8_t data)
{
	HAL_I2C_Mem_Write(&hi2c1 ,(add<<1)|0,reg,I2C_MEMADD_SIZE_16BIT,&data,1,0xffff);
	
}
void VL6180X_WriteByte_16Bit(uint8_t add,uint16_t reg,uint16_t data)
{
	uint8_t data2[2]={0,0};
	data2[0]=data>>8;
	data2[1]=data;
	HAL_I2C_Mem_Write(&hi2c1 ,(add<<1)|0,reg,I2C_MEMADD_SIZE_16BIT,data2,2,0xffff);
	
}

uint8_t VL6180X_ReadByte(uint8_t add,uint16_t reg)
{
	uint8_t data=0;
	HAL_I2C_Mem_Read(&hi2c1 ,(add<<1)|1,reg,I2C_MEMADD_SIZE_16BIT,&data,1,0xffff);
	return data;
}


uint16_t VL6180X_ReadBytee_16Bit(uint8_t add,uint16_t reg)
{
	uint16_t data=0;
	uint8_t data2[2];
	HAL_I2C_Mem_Read(&hi2c1 ,(add<<1)|1,reg,I2C_MEMADD_SIZE_16BIT,data2,2,0xffff);
	data=data2[0];
	data=data<<8;
	data+=data2[1];
	
	return data;



}

模块寄存器

对于VL6180,模块寄存器的地址是16位的,不是8位的。VL6180模块使用16位的寄存器地址来访问和配置各种功能和参数。这种扩展的地址空间提供了更大的灵活性和更多的寄存器选项,以满足不同的应用需求。
在与VL6180模块进行通信时,主设备需要发送16位的寄存器地址,以指定所需的操作和寄存器位置。这样可以确保主设备与模块之间的正确数据交换和通信。

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践
所以对于vl6180模块,读写代码如下所示。

void VL6180X_WriteByte(uint8_t add,uint16_t reg,uint8_t data)
{
	HAL_I2C_Mem_Write(&hi2c1 ,(add<<1)|0,reg,I2C_MEMADD_SIZE_16BIT,&data,1,0xffff);
	
}
void VL6180X_WriteByte_16Bit(uint8_t add,uint16_t reg,uint16_t data)
{
	uint8_t data2[2]={0,0};
	data2[0]=data>>8;
	data2[1]=data;
	HAL_I2C_Mem_Write(&hi2c1 ,(add<<1)|0,reg,I2C_MEMADD_SIZE_16BIT,data2,2,0xffff);
	
}


uint8_t VL6180X_ReadByte(uint8_t add,uint16_t reg)
{
	uint8_t data=0;
	HAL_I2C_Mem_Read(&hi2c1 ,(add<<1)|1,reg,I2C_MEMADD_SIZE_16BIT,&data,1,0xffff);
	return data;
}




uint16_t VL6180X_ReadBytee_16Bit(uint8_t add,uint16_t reg)
{
	uint16_t data=0;
	uint8_t data2[2];
	HAL_I2C_Mem_Read(&hi2c1 ,(add<<1)|1,reg,I2C_MEMADD_SIZE_16BIT,data2,2,0xffff);
	data=data2[0];
	data=data<<8;
	data+=data2[1];
	
	return data;



}

初始化

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践
首先需要检查寄存器SYSTEM__FRESH_OUT_OF_RESET {0x16}是否为0x01.

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

可以通过读取SYSTEM__FRESH_OUT_OF_RESET {0x16}进行判断设备是否准备好,之后进行6180初始化。
初始化如下所示。

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践
基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

 uint8_t ptp_offset;
uint8_t VL6180X_Init(uint8_t add)
{
	ptp_offset=VL6180X_ReadByte(add,VL6180X_REG_SYSTEM_FRESH_OUT_OF_RESET);
	printf("ptp_offset=%d\n",ptp_offset);
//	if(VL6180X_Read_ID(add) == VL6180X_DEFAULT_ID)
	if(ptp_offset==0x01)
	{	
		VL6180X_WriteByte(add,0x0207, 0x01);
		VL6180X_WriteByte(add,0x0208, 0x01);
		VL6180X_WriteByte(add,0x0096, 0x00);
		VL6180X_WriteByte(add,0x0097, 0xfd);
		VL6180X_WriteByte(add,0x00e3, 0x00);
		VL6180X_WriteByte(add,0x00e4, 0x04);
		VL6180X_WriteByte(add,0x00e5, 0x02);
		VL6180X_WriteByte(add,0x00e6, 0x01);
		VL6180X_WriteByte(add,0x00e7, 0x03);
		VL6180X_WriteByte(add,0x00f5, 0x02);
		VL6180X_WriteByte(add,0x00d9, 0x05);
		VL6180X_WriteByte(add,0x00db, 0xce);
		VL6180X_WriteByte(add,0x00dc, 0x03);
		VL6180X_WriteByte(add,0x00dd, 0xf8);
		VL6180X_WriteByte(add,0x009f, 0x00);
		VL6180X_WriteByte(add,0x00a3, 0x3c);
		VL6180X_WriteByte(add,0x00b7, 0x00);
		VL6180X_WriteByte(add,0x00bb, 0x3c);
		VL6180X_WriteByte(add,0x00b2, 0x09);
		VL6180X_WriteByte(add,0x00ca, 0x09);
		VL6180X_WriteByte(add,0x0198, 0x01);
		VL6180X_WriteByte(add,0x01b0, 0x17);
		VL6180X_WriteByte(add,0x01ad, 0x00);
		VL6180X_WriteByte(add,0x00ff, 0x05);
		VL6180X_WriteByte(add,0x0100, 0x05);
		VL6180X_WriteByte(add,0x0199, 0x05);
		VL6180X_WriteByte(add,0x01a6, 0x1b);
		VL6180X_WriteByte(add,0x01ac, 0x3e);
		VL6180X_WriteByte(add,0x01a7, 0x1f);
		VL6180X_WriteByte(add,0x0030, 0x00);
		
		// Recommended : Public registers - See data sheet for more detail
		VL6180X_WriteByte(add,0x0011, 0x10);       // Enables polling for 'New Sample ready'
									// when measurement completes
		VL6180X_WriteByte(add,0x010a, 0x30);       // Set the averaging sample period
									// (compromise between lower noise and
									// increased execution time)
		VL6180X_WriteByte(add,0x003f, 0x46);       // Sets the light and dark gain (upper
									// nibble). Dark gain should not be
									// changed. !上半字节要写入0x4	默认增益是1.0
		VL6180X_WriteByte(add,0x0031, 0xFF);       // sets the # of range measurements after
									// which auto calibration of system is
									// performed
		VL6180X_WriteByte(add,0x0041, 0x63);       // Set ALS integration time to 100ms
		VL6180X_WriteByte(add,0x002e, 0x01);       // perform a single temperature calibration
									// of the ranging sensor

		// Optional: Public registers - See data sheet for more detail
		VL6180X_WriteByte(add,0x001b, 0x09);    //测量间隔	轮询模式
									// period to 100ms	每步10ms->0-10ms
		VL6180X_WriteByte(add,0x003e, 0x31);      //测量周期	ALS模式
									// to 500ms		
		VL6180X_WriteByte(add,0x0014, 0x24);       // Configures interrupt on 'New Sample
									// Ready threshold event'


//VL6180X_WriteByte(add,VL6180X_REG_SYSTEM_FRESH_OUT_OF_RESET, 0x00); //不发送00那么读出来的数值就是01

		return 0;
	}
	else return 1;
}

设备标识号

查询设备号可以通过0x000指令进行查询,返回值一般为0xB4。

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

uint8_t VL6180X_Read_ID(uint8_t add)
{
	return VL6180X_ReadByte(add,VL6180X_REG_IDENTIFICATION_MODEL_ID);
}


单次读取距离长度

在VL6180模块中,可以使用单次读取或多次读取的方式来获取所需的数据。在这里,我们将使用单次读取的方式来读取数据。下图中红色框内的部分展示了单次读取的操作方式。
单次读取是一种简单而常用的读取数据的方法。它涉及到向VL6180模块发送一个读取命令,并从模块的寄存器中读取所需的数据。
图示中的红色框内部所示的读取操作方式可以作为参考,帮助理解和实施单次读取操作。

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

由上图可以得知,读取的寄存器地址为0x062,0x062寄存器的说明如下所示,单位为mm。

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

代码如下所示。

uint8_t VL6180X_Read_Range(uint8_t add)
{
	uint8_t range = 0;
	//等待设备准备好进行量程测量
	while(!(VL6180X_ReadByte(add,VL6180X_REG_RESULT_RANGE_STATUS) & 0x01));//VL6180X_REG_RESULT_RANGE_STATUS,0x0d, 自检0x01连续性测试
	//开始量程测量
	VL6180X_WriteByte(add,VL6180X_REG_SYSRANGE_START,0x01);//VL6180X_REG_SYSRANGE_START,0x018,开启测距,0x01,单次模
	//轮询到第2位被设置
	while(!(VL6180X_ReadByte(add,VL6180X_REG_RESULT_INTERRUPT_STATUS_GPIO) & 0x04));//VL6180X_REG_RESULT_INTERRUPT_STATUS_GPIO,中断等待,0x04,数据等待完毕
	//读数范围(毫米)
	range = VL6180X_ReadByte(add,VL6180X_REG_RESULT_RANGE_VAL);//RESULT__RANGE_VAL,0x062,显示检测长度
	//清除中断
	VL6180X_WriteByte(add,VL6180X_REG_SYSTEM_INTERRUPT_CLEAR,0x07);//VL6180X_REG_SYSTEM_INTERRUPT_CLEAR,0x015,清除状态位
	return range;
}

测试结果

测试结果如下所示。

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践文章来源地址https://www.toymoban.com/news/detail-499223.html

到了这里,关于基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32CubeMX驱动4x4键盘模块

    4x4键盘模块是一种常用的电子组件,它由16个按钮或开关以矩阵方式排列而成,可以与微控制器或其他数字电路设备一起使用。该模块通常用于数据输入、操作界面等各种应用场合。 如果你的单片机已经有足够的GPIO引脚可供使用,可以把4x4键盘模块中的16个按键分别连接到

    2024年01月21日
    浏览(56)
  • VL53L5CX驱动开发(1)----驱动TOF进行区域检测

    VL53L5CX是一款先进的飞行感应(FlightSense)产品系列的飞行时间(ToF)多区间测距传感器。封装在微型的可回流焊盘封装内,它集成了SPAD阵列、物理红外滤光片和衍射光学元件(DOE),以在不同的环境光照条件和各种覆盖玻璃材料下实现最佳测距性能。 最近在弄ST的课程,需

    2024年02月03日
    浏览(39)
  • VL53L8CX驱动开发(1)----驱动TOF进行区域检测

    VL53L8CX是一款8x8多区域ToF测距传感器,它在环境光下能够在降低功耗的同时增强性能。该传感器基于意法半导体的FlightSense技术设计,能够提供最高400 cm的精确测距,并具有65°对角线视场。 VL53L8CX集成了功能强大的新一代VCSEL,以及两个先进的超表面镜头。硬件封装在创新的“

    2024年03月18日
    浏览(70)
  • cubemx stm32 pca9685pw模块 16路PWM 可用于舵机驱动 驱动代码

    淘宝链接请点这里 淘宝资料资料: 链接:https://pan.baidu.com/s/1Kda-c7QdZdQ03FBMa0zeRA 提取码:1234 这个模块是 I2C 通信控制 16 路 PWM 的模块。 所有路的 频率 是统一设置的,所以每一路的频率都一样,但是每一路可以设置不同的占空比。 PCA9685的分辨率是12位,即占空比控制时,0-

    2024年02月06日
    浏览(48)
  • 【CubeMX配置STM32驱动超声波模块(HC-SR04)】

    一、CubeMX配置STM32 1、选择定时器 选择 输入捕获模式 预分频设置为71,向上计数,自动重装值65535 然后将名字改为 ECHO 2、配置TRIG口 这里的端口使用其它空闲的IO口是可以的,设置为输出模式,其它配置不需要改变,最主要的是 User Label 那儿,需要设置为 TRIG ,因为驱动函数里

    2024年02月02日
    浏览(58)
  • STM32 HAL库硬I2C的TOF050C模块

    最近在倒腾毕业设计,需要用到TOF050C,但是现有的案例都是软IIC,并且还是基于STM32F103的,笔者用的STM32F767,没有GPIO-CRH寄存器。问题来了,如果我每次都要去看寄存器手册属实费时间,这不干脆直接用硬IIC? 于是乎,打开了TOF050C手册,硬啃! 这手册好在它有工作流程图,

    2024年02月14日
    浏览(60)
  • 基于STM32CUBEMX驱动低压步进器电机驱动器STSPIN220(3)----定时器中断产生指定数量脉冲

    在步进电机控制过程中,为了实现精确的位置和速度控制,经常需要输出指定数量的脉冲。这就需要使用定时器功能来生成PWM脉冲信号。本文将详细介绍如何利用STM32CUBEMX配置定时器以输出指定数量的PWM脉冲。 定时器是STM32微控制器的一个重要功能模块,可用于生成各种定时

    2024年02月14日
    浏览(52)
  • STM32F1基于STM32CubeMX配置硬件SPI驱动1.8寸TFT LCD128X160 ST7735S屏幕

    📌相关篇《【STM32CubeIDE】STM32F103硬件SPI驱动1.8寸TFT LCD128X160 ST7735S屏幕》 ✨驱动效果就不做演示了,和上面的相关篇一样,主要是为了方便使用MDK Keil开发的使用。所以花了点时间从上面的工程当中做了分离,重新使用STM32CubeMX配置一个方便二次开发移植使用和配置的工程。本

    2024年02月03日
    浏览(50)
  • 基于STM32的超声波HC-SR04和红外测距模块测量距离的实验对比(HAL库)

            前言: 本文主要是为了 日常普通场合 下测距做的 对比实验 ,本实验主要包含 2种模块 : 超声波测距模块 (HC-SR04)和 红外测距模块 (SHARP GP2Y0A21YK0F)。两种模块不管是测距原理和编程实验方式都是不相同的,其测距效果也存在很大差异。感兴趣的读者朋友,

    2023年04月27日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包