I2C时序分析和基础知识总结
- 格式:ppt
- 大小:1.45 MB
- 文档页数:30
I2C总线信号时序总结I2C(Inter-Integrated Circuit)总线是一种串行通信协议,它用于在集成电路之间进行短距离的数据交换。
I2C总线信号时序对于正确实现I2C通信非常重要。
本文将详细总结I2C总线信号时序,包括起始条件、数据传输、停止条件等。
1.总线状态2.起始条件起始条件是指从I2C主设备(Master)向I2C从设备(Slave)发送数据之前的一系列信号。
起始条件由两个信号组成:SCL(时钟)和SDA(数据)。
当SCL为高电平时,SDA发生一个下降沿,表示开始传输数据。
3.数据传输在数据传输阶段,数据位通过SCL时钟控制的边缘传输。
这个过程类似于同步串行通信协议。
数据的传输在I2C总线上是以字节为单位进行的,每个字节有8位(bit)。
数据传输过程中,SCL和SDA的状态发生变化的规则如下:-当SCL为低电平时,数据线SDA可以发生变化。
此时SDA数据线的电平变化将被忽略。
-当SCL为高电平时,SDA数据线的电平变化将被读取或写入。
4.读取数据在I2C总线上进行数据读取时,接收设备通常在时钟的上升沿读取数据。
主设备将在SCL为高电平时将数据传输到SDA数据线上。
而从设备将在SCL下降沿读取数据。
5.写入数据在I2C总线上进行数据写入时,发送设备通常在时钟的下降沿写入数据。
主设备在SCL为高电平时,将数据传输到SDA数据线上。
从设备将在SCL下降沿写入数据。
6.停止条件停止条件是指在I2C通信完成后,由主设备发送的一系列信号。
停止条件由两个信号组成:SCL(时钟)和SDA(数据)。
当SCL为高电平时,SDA发生一个上升沿,表示结束传输。
对于I2C总线信号时序的更详细说明可以如下:-在起始条件中,SCL先于SDA变为高电平。
SDA变化的任何时间必须在SCL变高之前完成。
起始条件的结束是在SCL为高电平时,SDA发生一个下降沿。
-在数据传输阶段,数据的传输是由主设备控制的,每个字节8位。
i2c 时序状态
I2C总线是一种串行数据总线,用于连接微控制器(MCU)和外部设备。
它的时序状态包括:
- 启动信号:SCL为高电平的时候,SDA由高电平向低电平跳变。
- 结束信号:SCL为高电平的时候,SDA由低电平向高电平跳变。
- 数据传送时序:由于一个I2C总线上可以挂多个设备,因此开始信号后,要先发送7bit的从设备地址;第8个bit表示读或者写,该信号由主机发送;然后从机会发送ACK 的应答信号;之后才是要发送的数据,数据发送完,从机再发送ACK信号。
- 空闲状态:由I2C的启动条件可知,I2C总线在空闲时需要总线的SDA和SCL两条信号线同时处于高电平。
- 总线仲裁:I2C总线上可能挂接有多个器件,有时会发生两个或多个主器件同时想占用总线的情况,这种情况叫做总线竞争。
在使用I2C总线时,必须严格遵循其时序要求,以确保数据传输的可靠性和准确性。
如需了解更多关于I2C总线的信息,可以补充相关背景后再次向我提问。
单片机的重点知识1<IIC协议>:1、IIC协议说明:I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
AT24C02的芯片地址如下图,1010为固定,A0,A1,A2正好与芯片的1,2,3引角对应,为当前电路中的地址选择线,三根线可选择8个芯片同时连接在电路中,当要与哪个芯片通信时传送相应的地址即可与该芯片建立连接,我所使用的实验板上三根地址线都为0。
最后一位R/W为告诉从机下一字节数据是要读还是写,0为写入,1为读出。
AT24C02的芯片地址(0xa0为写,0xa1为读)任一地址写入格式任一地址读取数据格式2、程序详解IO口模拟IIC:起始和终止信号:SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
void start()//起始信号{SDA=1;Delay_us(10);SCL=1;Delay_us(10);SDA=0;Delay_us(10);Void stop()//终止信号{SDA=0;Delay_us(10);SCL=1;Delay_us(10);SDA=1;Delay_us(10);}数据传送格式(1)字节传送与应答每一个字节必须保证是8位长度。
数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。
如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据。
Void ack()//应答信号{uchar i;SCL=1;Delay_us(10);While((SDA==1)&&(i==250)) i++;//如果SDA=0则表示已经应答或者等待一会,就默认已经应答SCL=0;Delay();}Void noack()//非应答信号{SDA=1;Delay();SCL=1;Delay();//SCL有变化时,SDA保持不变,即非应答SCL=0;Delay();}void init()//初始化信号{scl=1;sda=1;}/////////////////////写一个字节//////////////////////void iicwr_byte(uchar dat){uchar i;scl=0; //只有在时钟线上的信号为低电平时,数据线上的高电平或低电平才允许变化(补:时钟线为高电平时,才能进行读写) delay();for(i=0;i<8;i++)//每一个字节,必须保持8位的数据长度{if(dat&0x80)//数据传送时,先传送最高位MSB{sda=1;}else{sda=0;}dat=dat<<1;//左移delay();scl=1; //时钟线为高电平时,才能进行读写delay();scl=0; //进行数据读写时,拉低时钟线,以保持数据稳定,有效delay();}sda=1; //每传送完一位就将数据线释放,以便下一位数据的传送;delay();}//////////////////////读一个字节////////////////////// uchar iicre_byte(){uchar i,dat;scl=0;delay();sda=1; //数据线释放delay();for(i=0;i<8;i++){scl=1; //时钟线为高电平时,才能进行读写delay();dat=dat<<1;//判断8次,移位7次if(sda==1){dat++;//自增,个位加1}scl=0;//拉低时钟线,以保证数据的稳定,和读出数据的正确性 delay();}return dat;}//////////////////////写操作/////////////////////void write_byte(uchar address,uchar dat)//指定地址写一个字节数据{init(); //初始化start();iicwr_byte(0xa0);//写器件地址(a是地址固定部分(1010),0的前三位是选择位,第四位0为写;若第四位为1,则是读;)ack();iicwr_byte(address);//写器件内部存储器地址ack();iicwr_byte(dat);//数据ack();stop();}//////////////////////读操作////////////////////uchar read_byte(uchar address) //指定地址读一个字节数据{uchar dat;start();iicwr_byte(0xa0);ack();iicwr_byte(address);ack();start();iicwr_byte(0xa1);//读ack();dat=iicre_byte();//读出的给datstop();return dat;}写好以下的几个函数:void start();//起始信号Void stop();//终止信号Void ack(); //应答信号Void noack();//非应答信号void init(); //初始化信号void iicwr_byte(uchar dat);//写一个字节uchar iicre_byte(); //读一个字节void write_byte(uchar address,uchar dat);//写操作uchar read_byte(uchar address); //读操作就距离成功使用IIC协议就行数据传输,只剩一步之遥了。
I2C总线信号时序分析在I2C总线通信的过程中,参与通信的双方互相之间所传输的信息种类归纳如下。
主控器向被控器发送的信息种类有:启动信号、停止信号、7位地址码、读/写控制位、10位地址码、数据字节、重启动信号、应答信号、时钟脉冲。
被控器向主控器发送的信息种类有:应答信号、数据字节、时钟低电平。
下面对I2C总线通信过程中出现的几种信号状态和时序进行分析。
①总线空闲状态。
I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。
此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。
②启动信号。
在时钟线SC L保持高电平期间,数据线SDA上的电平被拉低(即负跳变),定义为I2C总线总线的启动信号,它标志着一次数据传输的开始。
启动信号是一种电平跳变时序信号,而不是一个电平信号。
启动信号是由主控器主动建立的,在建立该信号之前I2C总线必须处于空闲状态,如图1所示。
图1 I2C总线上的启动信号和停止信号③停止信号。
在时钟线SC L保持高电平期间,数据线SDA被释放,使得SDA返回高电平(即正跳变),称为I2C总线的停止信号,它标志着一次数据传输的终止。
停止信号也是一种电平跳变时序信号,而不是一个电平信号,停止信号也是由主控器主动建立的,建立该信号之后,I2C总线将返回空闲状态。
④数据位传送。
在I2C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SC L串行时钟的配合下,在SDA上逐位地串行传送每一位数据。
进行数据传送时,在SCL呈现高电平期间,SDA上的电平必须保持稳定,低电平为数据0,高电平为数据1。
只有在SCL为低电平期间,才允许SDA上的电平改变状态。
逻辑0的电平为低电压,而逻辑1的电平取决于器件本身的正电源电压VDD(当使用独立电源时),如图2所示。
图2 I2C总线上的数据位传送⑤应答信号。
I2C总线上的所有数据都是以8位字节传送的,发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。
i2c 高速模式时序I2C(Inter-Integrated Circuit)是一种串行通信协议,用于连接微控制器和外围设备。
高速模式是I2C协议的一种工作模式,它提供了更高的数据传输速率。
本文将介绍I2C高速模式的时序,包括起始条件、数据传输和停止条件等。
一、起始条件在I2C高速模式下,起始条件是指主设备(如微控制器)向从设备发送起始位的过程。
起始条件包括以下几个步骤:1. 主设备将SCL(时钟线)拉低,表示开始通信。
2. 主设备将SDA(数据线)从高电平拉低,表示起始位。
3. 主设备保持SCL为低电平,等待从设备响应。
二、数据传输在I2C高速模式下,数据传输是指主设备向从设备发送数据或接收数据的过程。
数据传输包括以下几个步骤:1. 主设备将数据位(包括地址和数据)依次发送到SDA线上。
2. 主设备在每个数据位发送后,将SCL拉高一段时间,等待从设备读取数据。
3. 从设备在接收到数据位后,发送应答位(ACK)到SDA线上,表示成功接收到数据。
4. 主设备在接收到应答位后,继续发送下一个数据位,直到所有数据都发送完毕。
5. 主设备在发送完最后一个数据位后,将SCL拉高一段时间,等待从设备读取数据。
三、停止条件在I2C高速模式下,停止条件是指主设备向从设备发送停止位的过程。
停止条件包括以下几个步骤:1. 主设备将SCL拉低,表示结束数据传输。
2. 主设备将SDA从低电平拉高,表示停止位。
3. 主设备保持SCL为高电平,等待下一次通信。
I2C高速模式的时序图如下所示:起始条件:SCL为高电平时,SDA从高电平拉低数据传输:SCL拉高一段时间,等待从设备响应;从设备发送应答位,表示接收成功停止条件:SCL为高电平时,SDA从低电平拉高需要注意的是,I2C高速模式的时序与标准模式的时序略有不同。
高速模式的时序更为紧凑,可以实现更高的数据传输速率。
然而,高速模式对于电路设计和信号完整性要求更高,需要更精确的时钟和数据线控制。
I2C通信时序图解析⼀、I2C协议简介 I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被⼴泛地使⽤在系统内多个集成电路(IC)间的通讯。
关于I2C协议的更多内容,可阅读《I2C总线协议》,本博⽂主要分析I2C波形图,对于I2C的基础知识不在做介绍。
⼆、I2C协议标准代码2.1 起始信号&停⽌信号 起始信号:当 SCL 线是⾼电平时 SDA 线从⾼电平向低电平切换。
停⽌信号:当 SCL 线是⾼电平时 SDA 线由低电平向⾼电平切换。
2.1.1 起始信号代码void I2C_Start(void){I2C_SDA_High(); //SDA=1I2C_SCL_High(); //SCL=1I2C_Delay();I2C_SDA_Low();I2C_Delay();I2C_SCL_Low();I2C_Delay();}2.1.2 停⽌信号代码void I2C_Stop(void){I2C_SDA_Low();I2C_SCL_High();I2C_Delay();I2C_SDA_High();I2C_Delay();}2.2 发送⼀个字节 CPU向I2C总线设备发送⼀个字节(8bit)数据u8 I2C_SendByte(uint8_t Byte){uint8_t i;/* 先发送⾼位字节 */for(i = 0 ; i < 8 ; i++){if(Byte & 0x80){I2C_SDA_High();}else{I2C_SDA_Low();}I2C_Delay();I2C_SCL_High();I2C_Delay();I2C_SCL_Low();I2C_Delay();if(i == 7){I2C_SDA_High(); /* 释放SDA总线 */}Byte <<= 1; /* 左移⼀位 */I2C_Delay();}} 2.3 读取⼀个字节 CPU从I2C总线设备上读取⼀个字节(8bit数据)u8 I2C_ReadByte(void){uint8_t i;uint8_t value;/* 先读取最⾼位即bit7 */value = 0;for(i = 0 ; i < 8 ; i++){value <<= 1;I2C_SCL_High();I2C_Delay();if(I2C_SDA_READ()){value++;}I2C_SCL_Low();I2C_Delay();}return value;}2.4 应答2.4.1 CPU产⽣⼀个ACK信号void I2C_Ack(void){I2C_SDA_Low();I2C_Delay();I2C_SCL_High();I2C_Delay();I2C_SCL_Low();I2C_Delay();I2C_SDA_High();}2.4.2 CPU产⽣⼀个⾮ACK信号void I2C_NoAck(void){I2C_SDA_High();I2C_Delay();I2C_SCL_High();I2C_Delay();I2C_SCL_Low();I2C_Delay();}2.4.3 CPU产⽣⼀个时钟,并读取器件的ACK应答信号uint8_t I2C_WaitToAck(void){uint8_t redata;I2C_SDA_High();I2C_Delay();I2C_SCL_High();I2C_Delay();if(I2C_SDA_READ()){redata = 1;}else{redata = 0;}I2C_SCL_Low();I2C_Delay();return redata;}三、I2C通信时序图解析 有了上边的I2C总线标准代码的基础,下⾯我们进⼊本博⽂所要讲解的内容,怎么分析I2C的时序图,以O2Micro的OZ9350为例,OZ9350是⼀款模拟前端(AFE)的IC器件。
I2C 总线在单片机操作中用到的很多。
特别是以I2C总线进行数据和命令传输的器件,比如AT24C02存储芯片等。
特此做了相关操作过程中经常用到的操作和一些操作的解释。
相信看完之后,肯定会对I2C总线有深刻的理解。
I2C总线操作(从高位开始进行读写操作)写操作时序启动之后先进行一个字节的指令写入操作,然后进行应答;在进行字节数据的传送;然后再进行应答;I2C读操作时序基本上与写操作相同,不同的是读操作只需进行指令的写入,不写数据(应该不绝对),最后主机产生非应答信号,结束数据的读取;在对E2PROM(24C02)进行操作时,写入写操作指令后,然后写入需要操作的存储器地址号,最后写入数据。
且每个存储器地址只能赋值一次,重复对该存储器地址赋值会使前一个数据丢失。
读操作过程中需对将指令改写为读指令,在读取数据时需要写入指令指明需要读出数据时的存储器地址号下面是对24C02的写操作和读操作void write_add(uchar address,uchar date){start();write_byte(0xa0); //写指令respons();write_byte(address); //写入要操作的存储器地址respons();write_byte(date); //写入存储器数据respons();stop();}uchar read_add(uchar address){uchar date;start();write_byte(0xa0); //写入指令respons();write_byte(address); //写入读取操作时,要读取的存储器地址respons();stop();start();write_byte(0xa1); //写入指令,进行读操作respons();date=read_byte(); //进行读取数据norespons();stop();return date;}void main(){init();write_add(23,0xcc); //写入存储器地址号为23中,数据为0xcc delay1(100);P1=read_add(23); //读入存储器地址号为23中的数据,并将数据赋值给P1口,通过数码管显示while(1); //停留在此处}I2C串行总线的操作程序起始信号(时钟线为高,数据线由高变低):void AT24C04_Start(){SDA = 1; //拉高数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时SDA = 0; //产生下降沿 Delay5us(); //延时SCL = 0; //拉低时钟线}结束信号:(时钟线为高,数据线由低变高)void AT24C04_Stop(){SDA = 0; //拉低数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时SDA = 1; //产生上升沿 Delay5us(); //延时}字节传输:(每个字节为8位,一个字节带一个相应位)发送数据:void AT24C04_SendByte(BYTE dat){BYTE i;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最高位SDA = CY; //送数据口SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线,以便下一次传送数据 Delay5us(); //延时}AT24C04_RecvACK();}接收数据:BYTE AT24C04_RecvByte(){BYTE i;BYTE dat = 0;SDA = 1; //使能内部上拉,准备读取数据for (i=0; i<8; i++) //8位计数器{dat <<= 1;SCL = 1; //拉高时钟线Delay5us(); //延时dat |= SDA; //读数据SCL = 0; //拉低时钟线以便下一个数据传送 Delay5us(); //延时}return dat;数据响应:每次数据传输成功后,接收器件发送一个应答信号,当第九个信号产生时,产生应答信号的器件将SDA拉低。
iic标准时序
IIC(Inter-Integrated Circuit)是一种双线串行总线,也被称为I2C(发音为"I-squared C")。
它是由Philips公司开发的一种简单、双向、二线制同步串行总线。
IIC标准时序包括起始信号、数据传输、停止信号等步骤。
以下是IIC标准时序的基本步骤:
1.起始信号:当SCL线为高电平,SDA线由高电平跳变为低电平时,表示开始传输数据。
2.数据传输:在起始信号后,可以进行数据传输。
数据传输遵循以下规则:
在SCL线为高电平时,SDA线上的数据必须在稳定的电平状态,并且在SCL 线为低电平时,数据允许改变。
SDA线的数据在时钟信号SCL为高电平时保持稳定,在SCL为低电平时,数据可以改变。
3.停止信号:当SCL线为高电平,SDA线由低电平跳变为高电平时,表示停止传输数据。
4.应答信号:如果接收数据的设备能够正确接收数据,它将在SCL线的高电平期间将SDA线拉低,表示应答。
如果设备不能接收数据或发生错误,它不会拉低SDA线,表示非应答。
5.时钟同步:在数据传输过程中,主设备会生成时钟信号SCL,并用于同步数据传输。
从设备根据主设备的时钟信号来响应。
6.数据长度:一个IIC数据包中可以有1字节的数据,也可以有多个字节的数据。
多字节的数据必须以最高有效字节(MSB)在前的方式进行传输。
注意,上述是基本时序和规则,具体应用可能有所不同。
根据实际设备和具体需求,可能需要进一步了解和应用相关的具体参数和设置。
I2C总线时序详解I2C总线位传输由于连接到I2C 总线的器件有不同种类的工艺(、、双极性),逻辑0(低)和逻辑1(高)的电平不是固定的,它由电源VCC的相关电平决定,每传输一个数据位就产生一个时钟脉冲。
数据的有效性SDA 线上的数据必须在时钟的高电平周期保持稳定。
数据线的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变。
I2C位传输数据有效性起始和停止条件SCL 线是高电平时,SDA 线从高电平向低电平切换,这个情况表示起始条件;SCL 线是高电平时,SDA 线由低电平向高电平切换,这个情况表示停止条件。
起始和停止条件一般由主机产生,总线在起始条件后被认为处于忙的状态起始和停止条件,在停止条件的某段时间后总线被认为再次处于空闲状态。
如果产生重复起始条件而不产生停止条件,总线会一直处于忙的状态,此时的起始条件(S)和重复起始条件(Sr)在功能上是一样的。
I2C总线数据传输字节格式发送到SDA 线上的每个字节必须为8 位,每次传输可以发送的字节数量不受限制。
每个字节后必须跟一个响应位。
首先传输的是数据的最高位(MSB),如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟线SCL 保持低电平,迫使主机进入等待状态,当从机准备好接收下一个数据字节并释放时钟线SCL 后数据传输继续。
应答响应数据传输必须带响应,相关的响应时钟脉冲由主机产生。
在响应的时钟脉冲期间发送器释放SDA 线(高)。
在响应的时钟脉冲期间,接收器必须将SDA 线拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平。
通常被寻址的接收器在接收到的每个字节后,除了用CBUS 地址开头的数。
I2C总线数据传输和应答据,必须产生一个响应。
当从机不能响应从机地址时(例如它正在执行一些实时函数不能接收或发送),从机必须使数据线保持高电平,主机然后产生一个停止条件终止传输或者产生重复起始条件开始新的传输。
IIC操作时序详细介绍I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。
I2C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。
例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。
可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。
1 I2C总线特点I2C总线最主要的优点是其简单性和有效性。
由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。
总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。
I2C总线的另一个优点是,它支持多主控(multimastering),其中任何能够进行发送和接收的设备都可以成为主总线。
一个主控能够控制信号的传输和时钟频率。
当然,在任何时间点上只能有一个主控。
2 总线的构成及信号类型I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。
在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。
各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。
CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。
这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
I2C总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。