IIC接收和发送信息时序

IIC总线收发信息框架分析

I2C协议特点

1.只有两条总线,一条时钟线SCL,一条数据线SDA,所有挂载在总线上的设备共用一个时钟信息。
2.每个挂载在总线上的设备都是使用软件根据它的地址来识别。
3.I2C是电平触发方式,在时钟信号SCL电平高时数据SDA是稳定的,也就是在电平高时进行数据的接收与发送,在电平低时进行数据的准备,即在电平低时可以进行数据的改变。
4.I2C有3种类型的信号值得注意:(1)开始信号:SCL为高电平时,SDA从高电平向低电平跳变,此时代表要开始传输数据(2)结束信号:SCL为高电平时,SDA由低电平向高电平跳变,此时代表结束传输数据(3)响应信号ACK:由于I2C总线是以8bit为单位进行数据的收发的,所以,接收器在接收到8位数据后,需要进行响应以表示自己准确无误的接收到数据,则需要在第9个时钟周期,发送ACK响应信号,即拉低SDA的电平。
从开始信号和结束信号的定义我们也不难看出为何SCL电平为高时信号是稳定的,因为此时数据线进行任何数据的改变都将被视为开始或者结束信号。
在这里插入图片描述

IIC发送信息框架伪代码

有了I2C的硬件层与协议层的基本概述后,首先进行发送数据伪代码的编写,如下所示:

void i2c_send(unsigned char *buf,unsigned char reg, int len){
         开始信号;
         发送器地址(包括读写标志,这里是写标志);
         接收应答;
         发送数据存放的寄存器地址;
         接收应答;
         while(1){
                     发送数据;
                     接收应答;
                               }
        终止信号;
}

//
对于上述伪代码的的每一个动作,我们都可以通过封装一个函数来实现。
开始信号:

void I2c_start(void){
        将数据置1;
        将时钟置1;
        延时;
        将数据置0;
        延时;
        将时钟置0;//空闲时间将时钟置为低电平(视情况而定)
}

终止信号:

void I2C_stop{
        将数据置0;
        将时钟置1;
        延时;
        将数据置1;
        延时;
        将时钟置0;//空闲时间将时钟置为低电平(视情况而定)
}

发送数据:

void I2C_send_byte(unsigned char data){
        int i;
        将时钟置零;//时钟为低开始准备数据
        for (i=0;i<8;i++){
              if(data[i])
                   将数据置1;
               else
                   将数据置零
               延时;//等待准备的数据稳定
               将时钟置1;//数据稳定之后接收方便可开始读取
               延时;
               将时钟置0;
        }
}

接受应答:

unsigned char I2C_rec_ack(void){
        unsigned char ack = 0;
        data_in();
        将时钟信号置0;//等待从机开始准备应答信号
        延时;//等待从机准备好数据
        将时钟信号置1;//开始读取数据;
        延时;
        ack = data_get_in();
        将时钟置0;
        return data;
}

如下是读取数据伪代码的编写,比发送信息稍微要复杂那么一些,其实也就是多出来一道步骤:

void i2c_send(unsigned char *buf,unsigned char reg, int len){
         开始信号;
         发送要读取数据的从机的地址(包括读写标志,这里是写标志);
         接收应答;
         发送要读取数据的寄存器的地址;
         接收应答;
         开始信号;
         发送要读取数据的从机的地址(包括读写标志,这里是读标志);
         接受应答;
         while(1){
                     读取数据;
                     if(接受完毕)
                          nack;
                     else
                          ack;
                               }
        终止信号;
}

读取数据:

unsigned char I2C_rev_byte(void){
       unsigned char data = 0;
       data_in();
        将时钟置零;//时钟为低开始准备数据
        for (i=0;i<8;i++){
               延时;//等待要读取的数据稳定
               将时钟置1;//数据稳定之后便可开始读取
               延时;等数据稳定一段时间再读取 
               data>>1;
               data |= data_get_in();
               将时钟置0;
        }
}

以上就是总体的I2C伪代码的大致框架,具体的代码需要结合具体的芯片来进行编写。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IIC(Inter-Integrated Circuit)是一种串行通信协议,广泛应用于各种电子设备之间的数据传输。IIC协议是由飞利浦公司(现在的恩智浦公司)开发的,其优点是通信线路简单,只需要两根线(SDA和SCL)即可实现双向数据传输,同时还具有高可靠性和高效率的特点。 IIC传输数据的时序非常重要,主要包括起始条件、地址匹配、数据传输和停止条件等几个方面。以下是IIC传输数据的时序具体内容: 1. 起始条件 在IIC通信开始前,必须先发送起始条件。起始条件是指在SCL为高电平时,SDA由高电平跳变到低电平的过程。这个过程表示IIC总线上有一个主设备要进行通信了。主设备是通过控制SDA和SCL线的电平来完成这个动作的。 2. 从设备地址和读/写位 发送起始条件之后,主设备会发送从设备地址和读/写位信息到总线上。从设备地址是一个7位的二进制数,最高位为0,表示这是一个从设备地址。第0位是R/W位,它用来表示主设备是要向从设备写入数据,还是要从从设备读取数据。当R/W为0时,表示主设备要向从设备写入数据;当R/W为1时,表示主设备要从从设备读取数据。 3. 地址匹配 IIC总线上的每个设备都有一个唯一的地址,主设备在发送从设备地址之后,会等待从设备的应答信号。如果从设备地址匹配成功,从设备会拉低SDA线,发送应答信号,表示它已经准备好进行数据传输了。如果从设备地址匹配失败,从设备不会发送应答信号,表示它不接受主设备的通信请求。 4. 数据传输 如果地址匹配成功,主设备就可以开始发送数据或读取数据了。在数据传输过程中,每发送一个字节,都需要从设备发送一个应答信号。如果主设备要向从设备写入数据,主设备会在SCL为高电平时,将一个数据字节发送到SDA线上。从设备接收到数据后,会发送一个应答信号,表示已经成功接收到主设备发送的数据。如果主设备要从从设备读取数据,主设备会在SCL为高电平时,从SDA线上读取一个数据字节。读取完毕后,主设备会发送一个应答信号,表示已经成功接收到从设备发送的数据。 5. 停止条件 在数据传输完成之后,主设备需要发送停止条件。停止条件是指在SCL为高电平时,SDA由低电平跳变到高电平的过程。这个过程表示IIC总线上的通信已经结束了。如果主设备要进行下一次通信,需要先发送起始条件。 总之,IIC传输数据的时序非常重要,主要包括起始条件、地址匹配、数据传输和停止条件等几个方面。只有在时序控制得当的情况下,IIC通信才能正常进行,实现设备之间的数据传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值