解析I2C通信协议

一、I2C的概念

1. I2C总线是PHLIPS公司推出的一种串行总线,I2C总线只有两根双向信号线。其中一根是数据线SDA,另一根是时钟线SCL


2. 每个接到I2C总线上的器件都有唯一的地址。发送数据到总线上的称为发送器,从总线上接收数据的器件称为接收器。


每个I2C总线上的器件的地址唯一,主机就是通过寻找唯一的地址来进行数据传输。当主机为发送器的时候,器件接收数据,当主机为接收器的时候,器件发送数据。

二、常用的串行扩展总线

  I2C(Inter Ic BUS)总线、单总线(1-WIRE BUS)、SPI(Serial Peripheral Interface)等。

三、I2C的六个信号

1. 起始信号

定义:SCL线为高电平期间,SDA线由高电平向低电平的变化。


void iic_start(void)
{
    SDA = 1;
    SCL = 1;
    delay_us(1);
    SDA = 0;
    delay_us(1);
    SCL = 0;
}
2. 终止信号
定义:SCL线为高电平期间,SDA线由低电平向高电平的变化。


void iic_stop(void)
{
    SDA = 0;
    SCL = 1;
    delay_us(1);
    SDA = 1;
    delay_us(1);
    SCL = 0;
}
3. 写数据信号

I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高低电平状态才允许变化。

bit iic_send_byte(unsigned char byte)
{
    unsigned char i;
    
    for(i = 0; i < 8; i++)
    {
        SDA = byte & 0x80;
        SCL = 1;
        delay_us(1);
        SCL = 0;
        byte <<= 1;
    }
    
    SCL = 1;
    SDA = 1;
    delay_us(1);
    if(0 == SDA)
    {
        ack = 1;
    }
    else
    {
        ack = 0;
    }
    
    SCL = 0;
    return ack;
}
4. 读数据信号
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高低电平状态才允许变化。


unsigned char iic_rcv_byte(void)
{
    unsigned char i;
    unsigned char temp = 0;
    unsigned char a;
    
    SDA = 1;
    for(i = 0; i < 8; i++)
    {
        SCL = 0;
        delay_us(1);
        SCL = 1;
        if(SDA)
        {
            a = 0x01;
        }
        else
        {
            a = 0;
        }
        
        temp |= (a << (7 - i));
        delay_us(1);
    }
    
    SCL = 0;
    
    return temp;
}
5. 应答信号
I2C总线协议规定,每传送一个字节数据,都要有一个应答信号以确定数据传送是否被对方接收。应答信号由接收设备产生,在SCL为高电平期间,接收设备将SDA拉低为低电平,表示数据传输正确。


void iic_ack(void)
{
    SDA = 0;
    SCL = 1;
    delay_us(1);
    SCL = 0;
}
6. 非应答信号

void iic_noack(void)
{
    SDA = 1;
    SCL = 1;
    delay_us(1);
    SCL = 0;
}


  • 21
    点赞
  • 117
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
I2C是基于主从架构的串行通信协议,用于在集成电路中进行芯片间的通信。Verilog是一种硬件描述语言,可用于设计和实现数字电路。 I2C Verilog源码解析指的是对实现I2C通信协议的Verilog代码进行分析。 I2C协议包括两根线:时钟线(SCL)和数据线(SDA)。其中,主设备负责发起通信并提供时钟信号,从设备根据时钟信号进行数据传输。 在Verilog源码中,需要实现I2C数据传输的主要部分包括包生成和接收、时钟生成和处理、地址传输和数据传输等。 包生成和接收部分需要实现I2C协议的起始标记、地址、数据和校验位等信息的发送接收。这部分主要涉及到状态机的设计和控制,根据不同的时钟信号和数据线的电平状态来控制数据传输的顺序和正确性。 时钟生成和处理部分需要生成I2C所需的时钟信号,确保时钟频率符合协议要求。同时,需要处理从设备的应答信号,以判断通信是否成功。 地址传输部分用于控制从设备的选择。根据通信需求,主设备会发送目标从设备的地址信息,从而选择对应的从设备进行数据传输。 数据传输部分负责实际的数据传输操作。根据I2C协议要求,主设备会在时钟信号的控制下,逐位传输数据。其中包括发送数据、接收数据以及发送接收的确认信息。 综上所述,I2C Verilog代码解析就是对实现I2C通信协议的Verilog代码进行分析,理解其中各个模块的功能和实现原理,以确保代码的正确性和可靠性。这需要对I2C协议的原理和Verilog语言的应用有一定的理解和掌握。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值