从IIC实测波形入手,搞懂IIC通信

本文深入解析IIC(InterIntegratedCircuit)通信协议,从基础知识、物理连接、时序分析到真实波形解读,结合代码示例阐述了IIC的起始、停止、应答等关键步骤,帮助理解IIC通信的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

玩单片机的朋友都知道IIC通信这个工具,但好多人只是会用,内部的原理不求甚解,或是想要了解其原理,但却对抽象的时序描述一头雾水。本文将从实测的IIC波形入手,带你看到真实的IIC样子,进而去理解IIC的通信原理。

1 IIC基础知识

首先复习一下IIC基础知识,这部分看不懂的请先带着疑问,然后我们通过分析IIC的真实波形,这些疑问可能就豁然开朗了~

1.1 IIC是什么

IIC(Inter Integrated Circuit,集成电路总线)是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线 SDA时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU (单片机)与IIC模块之间、IIC模块与IIC模块之间进行双向传送。

IIC的一些特点:

  • IIC是半双工,而不是全双工
  • IIC是真正的多主机总线,(对比SPI在每次通信前都需要把主机定死,而IIC可以在通讯过程中,改变主机),如果两个或更多的主机同时请求总线,可以通过冲突检测和仲裁防止总线数据被破坏
  • 起始和终止信号都是由主机发出的,连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号
  • 起始信号后必须发送一个7位从机地址+1位方向位,用“0”表示主机发送数据“1”表示主机接收数据。
  • 每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据
  • 起始信号是必需的,结束信号和应答信号,都可以不要

:实际使用中,一般是单片机作为主机,其它器件作为从机,单片机先向器件发送信息表示要读取数据,之后转变传输方向,器件发送数据到单片机。

1.2 IIC物理连接

使用IIC通信的IIC器件有很多,比如陀螺仪加速度计MPU6050,EEPROM存储芯片AT24C02等,通过IIC总线,可以与单片机之间进行数据传输。

  • IIC通信线只有只有两根,数据线SDA的高低电平传输2进制的数据,时钟线SCL通过方波信号提供时钟节拍
  • 多个IIC器件可以并联在IIC总线上,每个器件有特定的地址,分时共享IIC总线
  • 实际使用IIC当然还要连接电源以及共地哦

1.3 IIC时序

网上查找IIC的基础知识,可能会搜到这样的时序图:

看起来好复杂的样子,这时可能一部分人就放弃思考了。

1.3.1 IIC起始结束信号

好吧,换个简单点的图,你也可能会搜到这样的图:

这张图看起来更简单一些,描述了IIC的起始和停止条件:

  • 起始:时钟线SCL为高时,数据线SDA由高到低
  • 停止:时钟线SCL为高时,数据线SDA由低到高

注:SDA和SCL同时为高时,为IIC总线的空闲状态

1.3.2 IIC应答

再来看下面这张图:

这表示IIC的应答机制

  • 下面的波形:SCL,主机产生的时钟脉冲
  • 上面的波形:SDA,主机发送的8位数据
  • 中间的波形:SDA,从机在第9个时钟信号进行拉低回应,表示收到了主机发来的数据,拉高则表示不应答

注:实际上,上面和中间是同样的SDA线,这里只是分开示意。因为IIC应答是一种相互关系,单片机发数据给IIC器件,IIC器件要进行应答,表示收到了数据,同样,单片机接收IIC器件的数据后,也要给IIC器件一个应答。

既然发送完都需要对方回应,那什么时候使用不应答呢?就是在读取到本次数据后,如果不需要继续读取,则发送非应答,对方以为你没收到这次数据,则就不会继续发送了。

1.3.3 IIC完整传输时序

  • 开始标志(S)发出后,主设备会传送一个7 位的Slave 地址,并且后面跟着一个第8位,称为Read/Write 位。
  • R/W 位表示主设备是在接受从设备的数据还是在向其写数据。
  • 然后,主设备释放SDA 线,等待从设备的应答信号(ACK)。每个字节的传输都要跟随有一个应答位。
  • 应答产生时,从设备将SDA 线拉低并且在SCL 为高电平时保持低。
  • 数据传输以停止标志(P)结束,然后释放总线。但主设备也可以产生重复的开始信号去操作另一台从设备,而不发出结束标志。
  • 所有的SDA 信号变化都要在SCL 时钟为低电平时进行,除了开始和结束标志

1.4 常用的数据收发方式(时序)

上面1.3小节是IIC的基础时序,在实际使用中,一般是对某个IIC器件的某个寄存器进行读写操作,因此,对于寄存器的读写操作,还要遵循下面的组合时序逻辑。

1.4.1 写一个字节

用于对IIC器件某个寄存器的配置,如对MPU6050的某些参数进行设置。

  • 写寄存器时,主设备除了发出开始标志和地址位,还要加一个R/W 位,0 为写,1 为读
  • 在第9 个时钟周期(高电平时),MPU6050 产生应答信号
  • 主设备开始传送寄存器地址,并接到应答
  • 然后开始传送寄存器数据,仍然要有应答信号
  • 最后主设备发送停止信号。

1.4.2 连续写多个字节

对连续地址的写入,这个用的较少。

通信时序与上面的“写一个字节”类似,上面是写一个字节后就停止了,若要连续写,则继续写即可,只要可以收到从机Ack。

1.4.3 读一个字节

用于读取IIC器件某个寄存器的数值。

  • 首先由主设备产生开始信号,然后发送从设备地址位和一个写数据位,等待应答
  • 然后发送寄存器地址,才能开始读寄存器
  • 收到应答信号后,主设备再发一个开始信号,然后发送从设备地址位和一个读数据位
  • 然后,作为从设备的MPU6050 产生应答信号并开始发送寄存器中的数据
  • 通信以主设备产生的拒绝应答信号(nACK)和结束标志(Stop)结束
  • 拒绝应答信号(nACK)产生定义为SDA 数据在第9 个时钟周期一直为高

1.4.4 连续读多个字节

也是用于读取IIC器件某个寄存器的数值,当某些数据一位字节不够表示,或有一组连续的数据需要读时,可以使用该模式。

通信时序与上面的“读一个字节”类似,上面是读一个字节后就nAck叫停,若要连续写,则发送Ack,直到不需要继续读时再回复nAck。

复习了这么多,之前对IIC懵懵懂懂的是否依然犯迷糊,好了,现在从理论进入实践,看看真实的IIC是什么样子。

2 初识IIC真实波形

下面这张图是通过示波器抓取的IIC波形,可以看到:

  • 时钟线SCL是一种间歇性的方波(需要通信时才产生方波)
  • 数据线SDA根据SCL提供的节拍,高电平代表数据1,低电平代表数据0
  • 没有数据传输时,SDA和SCL均为高电平状态
  • 起始信号后,数据是9个一组,包括8位的数据和另一方的1位回应

图中红色数字表示单片机发送的8位数据,黄色数字表示IIC器件回应的信号,低电平0表示器件收到了单片机发来的数据。

现在对IIC波形有没有多了一些直观的认识?下面再进入编程阶段,看看程序是怎么控制这两根线的。

3 编写IIC通信函数

IIC通信可以使用单片机自带的硬件IIC,它提供了固定的引脚接口和函数库。也可以自己通过软件编写来实现IIC时序,这时就可以任选引脚,也方便其它硬件平台的移植。

下面通过软件IIC的编写,从软件角度理解IIC通信逻辑。

以下函数都是单片机在执行,即主机发出的动作,所以一定要从单片机的角度思考哦~

另外,不要看到程序就匆匆掠过,为帮助理解,我对代码进行了一定的注解,仔细分析每条代码,想想与IIC的逻辑如何对应起来,IIC逻辑还没懂的,读完本篇,分析过真实的IIC波形后,再来看看代码,会有不一样的体会。

3.1 起始IIC_Start()

//==================================
//产生IIC起始信号
//==================================
void IIC_Start(void)
{
    SDA_OUT();   //sda线输出
    IIC_SDA=1;    
    delay_us(2);    
    IIC_SCL=1;   //时钟线为高时
    delay_us(2);
    IIC_SDA=0;   //数据线由高到低
    delay_us(4);
    IIC_SCL=0;   //时钟线拉低,钳住IIC总线,准备发送数据 
}

最后一句SCL拉低,然后就准备产生时钟信号,发送数据了。

3.2 停止IIC_Stop()

//==================================
//产生IIC停止信号
//==================================
void IIC_Stop(void)
{
    SDA_OUT();  //sda线输出
    IIC_SCL=0;  //确保时钟线为低时,数据线才能变化为0,否则这就可能成起始信号了!
    delay_us(2);
    IIC_SDA=0;
    delay_us(2);
    IIC_SCL=1;  //时钟线为高时
    IIC_SDA=1;  //数据线由低到高
    delay_us(4);                                
}

停止前也要确保SCL是拉低的状态。

最后SDA和SCL都为高,即释放IIC总线,IIC总线进入空闲状态。

3.3 等待应答IIC_wait_Ack()

//==================================
//等待应答信号到来
//用于发送模式下,发送8位后,等待器件应答第9位
//返回值:1,接收应答失败
//        0,接收应答成功
//==================================
u8 IIC_Wait_Ack(void)
{
    u8 ucErrTime=0;
    SDA_IN();                 //SDA设置为输入  
    IIC_SDA=1;delay_us(1);    //SDA先拉高,若被从机拉低则说明收到应答信号
    IIC_SCL=1;delay_us(1);    //SCL拉高,产生第9位的脉冲
    while(READ_SDA)
    {
        ucErrTime++;
        if(ucErrTime>250)
        {
            IIC_Stop();
            return 1;
        }
    }
    IIC_SCL=0;//时钟输出0     //SCL拉低,结束第9位的脉冲 
    return 0;  
}

在一定是时间内检测SDA是否被从机拉低,被拉低则说明从机收到了数据。

3.4 产生应答IIC_Ack()

//==================================
//产生ACK应答
//用于读取模式(SDA为in)读了8位器件数据后,在第9位给出一个应答,我还要继续读
//==================================
void IIC_Ack(void)
{
    IIC_SCL=0;    //确保时钟线为低时,数据线才能变化为0,否则这就可能成起始信号了!
    SDA_OUT();    //SDA由读取改为发送
    delay_us(2);
    IIC_SDA=0;    //拉低SDA,表示应答
    delay_us(2);
    IIC_SCL=1;    //SCL先上升
    delay_us(2);
    IIC_SCL=0;    //SCL再下降,形成一个脉冲,应答才生效
}

单片机在接收器件数据后,进行回应,表示接收到了器件的数据。

该函数用在连续读取多个字节时,每读完一个字节(8位),产生回应,表示还要进行读,这时器件就可以继续发数据了。

当单片机不需要继续读,如连续读的最后一个字节,或只读一个字节,单片机发送非应答信号,这时器件以为单片机没有收到数据,接下来就不会再发数据了。

非应答函数如下,就是拉高SDA:

3.5 不产生应答IIC_nAck()

//==================================
//不产生ACK应答  
//用于读取模式(SDA为in)读了8位器件数据后,在第9位给出一个应答,我不想读了
//==================================
void IIC_NAck(void)
{
    IIC_SCL=0;    //确保时钟线为低时,数据线才能变化为0,否则这就可能成起始信号了!
    SDA_OUT();    //SDA由读取改为发送
    IIC_SDA=1;    //拉高SDA,表示不应答
    delay_us(2);
    IIC_SCL=1;    //SCL先上升
    delay_us(2);
    IIC_SCL=0;    //SCL再下降,形成一个脉冲,不应答才生效
}

3.6 IIC发送一个字节

//==================================
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答 
//==================================
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
    SDA_OUT();                 //SDA发送模式
    IIC_SCL=0;                 //拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
        IIC_SDA=(txd&0x80)>>7; //SDA高低电平表示数据1和0
        txd<<=1;      
        delay_us(2);           //对TEA5767这三个延时都是必须的
        IIC_SCL=1;             //SCL先上升
        delay_us(2); 
        IIC_SCL=0;             //SCL再下降,形成一个脉冲,发送一位数据生效
        delay_us(2);
    }    
}

发送一个字节,就是分8次循环,产生8个时钟信号,并将SDA赋值为0或1。

3.7 IIC读取一个字节

//==================================
//读1个字节
//ack=1时,发送ACK,ack=0,发送nACK  
//==================================
u8 IIC_Read_Byte(unsigned char ack)
{
    unsigned char i,receive=0;
    SDA_IN();                  //SDA输入模式
    for(i=0;i<8;i++ )
    {
        IIC_SCL=0;             //SCL先下降,通过循环,形成时钟脉冲
        delay_us(2);
        IIC_SCL=1;             //SCL上升
        receive<<=1;
        if(READ_SDA)
            receive++;         //读取并组合记录数据,++表示读到1了,最低位置1
        delay_us(1); 
    }   
    //读取8位后,主机需要变为发送模式,在第9位进行应答或不应答
    //此时CLK还是高电平状态,不过下面的应答会先将CLK拉低的 
    if (!ack)
    {
        //读1个字节,或读多个字节读到最后一个字节时,使用nACK
        //然后配合使用IIC停止信号
        IIC_NAck();//发送nACK
    }
    else
    {
        //读多个字节还没读完时,使用ACK,表示现在读的ok,还要继续读
        IIC_Ack(); //发送ACK 
    }       
    return receive;
}

读取一个字节,也是分8次循环,产生8个时钟信号,并读取SDA的高低电平信号,最后,根据要不要继续读下一个字节,发送第9位的Ack或nACK。

4.1 真实IIC波形详细分析

4.1.1 读取从机数据(单字节读)

这张图展示IIC读某个器件的寄存器的一个字节的真实波形(注:实际是读了2个不同寄存器的值,每个寄存器读了1个字节,所以,可以先只看前半部分哦~),我已对波形进行了详细的注解。

对照着图,再来温习一下各个信号的特点:

  • 起始信号:时钟线SCL为高时,数据线SDA由高到低
  • 停止信号:时钟线SCL为高时,数据线SDA由低到高
  • 数据信号:连续的8位,每一个SCL脉冲时钟对应的SDA,高电平为数据1,低电平为数据0
  • 应答信号:第9位(数据信号后),由对方产生的回应,0为产生回应,1为不产生回应

这幅图中,单片机先产生起始信号,然后发送7位器件地址+1位写标志(绿色的0),并等待从机回应(从机拉低SDA表示收到数据),接着发送8位寄存器地址,并等待从机回应。然后,单片机先再次产生起始信号,发送7位器件地址+1位读标志(绿色的1),并等待从机回应。从机收到读的信号后,从机开始发送8位数据,主机接收到数据后,主机发送nAck不应答信号(图中的Ack(1),主机将SDA拉高,从机则认为主机刚才没有收到它发送的数据,从机将不再继续发送),接着主机发送结束信号,读取完成。

此图后半部分是以相同方式读了另一个寄存器的值。

上图中,SCL信号都是由单片机产生,SDA信号由单片机和IIC器件(从机)共同产生,当需要对IIC器件的寄存器写时,单片机产生SDA数据,当需要读取IIC器件的寄存器数据时,改变传输方向,IIC器件产生SDA数据。

对于主机和从机什么时候控制SDA,还可以参考这个图帮助理解:

4.1.2 读取从机数据(多字节读)

上面是单字节读的波形,再来看看多字节的波形,前面的写器件地址写寄存器地址1与单字节读一样,这张图只显示了后面不一样的部分,主要区别在于单片机接收到数据1后,产生低电平的应答,从而可以继续读取数据2。

(注意,因为传感器这次测得的数据不一样,所以读出的数据也不一样哦~)

注:以上的IIC真实波形,是使用是硬件IIC,自己编写的软件IIC测得的波形,可能在两个信号的前后延时时间上稍有差别,但整体的时序逻辑肯定是一样的。

4.1.3 配置从机寄存器(单字节写与多字节写)

对于寄存器的配置,也就是IIC的写寄存器操作,我就不放图了,参考上面的“常用的数据收发方式(时序)”以及上面的IIC读寄存器的真实波形,IIC的写寄存器的真实波形,应该可以脑补出哦,哈哈~

最后

通过真实的IIC波形分析,对IIC通信逻辑有没有更加直观的认识呢?

<think>首先,用户的问题是关于IIC通信波形的分析:"我想分析IIC通信波形 请问IIC通信协议 波形分析 方法"。我需要参考系统提供的引用内容来构建回答。 回顾引用: - 引用[1]: 从IIC实测波形入手搞懂IIC通信。介绍IIC基础知识。 - 引用[2]: IIC通信波形分析,涉及触摸IC和IIC波形图。 - 引用[3]: IIC通信协议——硬件IIC,描述总线结构、特性等。 - 引用[4]: 模拟IIC软件代码和实际波形的分析,包括参数含义。 系统指令要求: - 所有行内数学表达式用$...$格式。 - 独立公式用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题,保证真实可靠。 - 最后添加相关问题部分。 用户的问题焦点是IIC通信波形的分析方法。所以,我需要结构化回答: 1. **介绍IIC通信协议基础**:简要解释IIC是什么,基于引用[3]。 2. **波形分析步骤**:详细描述如何分析IIC波形,参考引用[1]和[2]。 3. **工具和示例**:提到使用示波器等工具,参考引用[2]和[4]。 4. **常见波形解读**:解释起始条件、停止条件、ACK等。 5. **生成相关问题**:在最后添加相关问题部分。 确保使用中文,并添加引用标识。 结构化的回答大纲: - **引言**:简要介绍IIC通信。 - **IIC通信协议基础**:解释IIC的信号线、起始/停止条件等。 - **波形分析方法**: - 工具准备:示波器、逻辑分析仪。 - 关键事件识别:起始位、地址传输、ACK、数据传输、停止位。 - 波形解读示例。 - **实际应用**:参考引用[2]的触摸IC例子。 - **总结**:强调实践的重要性。 - **相关问题**:生成3-5个相关问题。 数学表达式:如果涉及公式,如时序计算,使用LaTeX格式。例如,时钟频率的计算:$f_{SCL}$。 现在,构建回答内容: 1. **引言**:基于用户问题,直接回应。 2. **基础部分**:引用[3]描述IIC总线。 3. **分析方法**:结合引用[1]和[2],描述如何从波形入手。 4. **波形解读**:解释具体波形元素,如SCL和SDA信号。 5. **工具和代码**:提到引用[4]的模拟IIC代码。 6. **相关问题**:生成相关问题。 最后,添加引用标识。 相关问题建议: 1. IIC通信中ACK和NACK的区别是什么? 2. 如何优化IIC通信的时序? 3. IIC通信协议在嵌入式系统中的应用案例? 4. 常见的IIC波形错误如何诊断? 5. 模拟IIC与硬件IIC波形上有何不同? 确保回答真实可靠:基于提供的引用内容。</think>### IIC通信协议波形分析方法 分析IIC通信波形是理解IIC协议的关键步骤,它能帮助您直观地验证通信是否正常、诊断时序问题,并优化系统性能[^1]。IIC(Inter-Integrated Circuit)总线是一种两线式串行通信协议,使用SCL(时钟线)和SDA(数据线)实现数据传输。它支持多主多从结构,但任意时刻只能有一个主机和一个从机通信[^3]。下面我将逐步介绍波形分析方法,确保内容清晰实用。 #### 1. **IIC通信协议基础** 在分析波形前,先理解IIC的基本元素: - **信号线**: - SCL(时钟线):由主机控制,用于同步数据传输。 - SDA(数据线):双向数据线,在SCL低电平时变化,高电平时采样。 - **关键事件**: - **起始条件(START)**:当SCL为高电平时,SDA从高电平跳变到低电平,表示通信开始。 - **停止条件(STOP)**:当SCL为高电平时,SDA从低电平跳变到高电平,表示通信结束。 - **ACK/NACK**:每个字节传输后,接收方在SCL的第9个周期拉低SDA表示ACK(确认),或保持高电平表示NACK(未确认)。 - **数据传输**:每个数据位在SCL上升沿或下降沿被采样,传输单位为字节(8位),高位在前。 - **时序参数**:包括时钟频率($f_{\text{SCL}}$)、建立时间($t_{\text{SU}}$)和保持时间($t_{\text{HD}}$),这些可通过波形测量计算。例如,时钟频率的计算公式为: $$ f_{\text{SCL}} = \frac{1}{T_{\text{SCL}}} $$ 其中$T_{\text{SCL}}$是SCL周期时间。 这些基础概念是波形分析的起点,实际波形会反映这些事件[^3]。 #### 2. **波形分析步骤** 分析IIC波形通常使用示波器或逻辑分析仪(如Saleae或Cypress套件),结合软件工具查看波形图[^2]。以下是系统化方法: **步骤1: 捕获波形** - **工具准备**:连接示波器探头到SCL和SDA线,设置触发模式为“边沿触发”,捕捉起始条件(SDA下降沿)。逻辑分析仪更高效,能自动解码数据[^1]。 - **示例设置**:参考触摸IC项目,使用Cypress套件直接显示波形图,直观观察SDA和SCL的同步变化[^2]。 **步骤2: 识别关键事件** 在波形图中,逐一解析事件: - **起始位**:寻找SCL高电平时SDA的下降沿(见下图示意)。 - **地址传输**:起始位后,主机发送7位或10位从机地址(例如,$1010xxx$表示特定设备),后跟读写位(0为写,1为读)。 - **ACK响应**:地址或数据字节后,第9个SCL周期检查SDA电平(低为ACK,高为NACK)。 - **数据传输**:每个字节后跟随ACK,数据在SCL上升沿采样。 - **停止位**:SCL高电平时SDA的上升沿。 **示例波形解读**(基于实测数据): - 正常波形:SCL周期性变化,SDA在SCL低电平时变化。例如,地址传输阶段,SDA的波形应与从机地址匹配。 - 错误诊断:如果ACK缺失(SDA保持高电平),可能表示从机未响应或地址错误;如果时序偏差(如$t_{\text{SU}}$太短),会导致数据采样失败[^1]。 **步骤3: 定量分析时序** - 测量关键参数: - 时钟频率:计算$T_{\text{SCL}}$(一个完整时钟周期的时间),使用公式$f_{\text{SCL}} = 1/T_{\text{SCL}}$。 - 建立时间($t_{\text{SU}}$):SDA数据在SCL上升沿前的稳定时间,应大于100ns(标准模式)。 - 保持时间($t_{\text{HD}}$):SDA数据在SCL上升沿后的保持时间。 - 工具辅助:逻辑分析仪软件(如Logic)能自动计算这些值,并标注错误[^4]。 **步骤4: 实践验证** - **模拟IIC代码参考**:使用软件模拟IIC时,波形应与硬件一致。例如,引用[4]中的代码参数(如地址和数据长度)会影响波形结构: ```c // 示例:IIC读取函数参数 I2C_Read(I2Cx, addr, start_Addr, Addr_Length, *buf, Data_Length); ``` 调整`Addr_Length`或`Data_Length`可观察波形变化[^4]。 - **真实案例**:在触摸IC项目中,通过波形图调整灵敏度,确保ACK响应正常[^2]。 #### 3. **常见问题与优化建议** - **典型错误**: - 起始/停止位缺失:导致通信无法启动或结束。 - 时序偏差:$f_{\text{SCL}}$过高(如>100kHz)可能导致采样错误。 - 总线冲突:多主系统中,SDA电平冲突(需检查仲裁波形)。 - **优化方法**:降低时钟频率、增加上拉电阻、使用硬件IIC减少软件延迟[^3]。 #### 总结 IIC波形分析的核心是结合理论协议和实测工具,从起始条件到数据字节逐一验证。实践中,多使用逻辑分析仪捕获和解码波形,能快速诊断问题。记住,IIC适合短距离、低速通信波形分析是确保可靠性的关键[^1][^3]。如需深入学习,参考实测波形教程[^1]或触摸IC应用案例[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值