i2c协议以及其相关bug分析总结
学习i2c心得

I2C学习心得我最近刚做完I2C通信协议的编写与调试,下面介绍一下我从一开始理解夏老师的程序,修改程序,直到下板调试整个的学习过程,希望对大家学习I2C有一定的帮助。
一、分析源代码学习I2C,首先我们要知道I2C是一种串行接口,I2C通信是一种串行通信。
在实际的数字系统中,我们的数据经常是以并行的方式产生及存储的。
而将数据通过进行传输时,通常会是串行地发送和接收的。
比如我们常见的SPI,UART,I2C,USB,SATA等接口,均是串行接口。
因此,在数字系统中我们经常会遇到需要将串行数据接收下来转为并行数据存储,或者是将并行数据转换成串行数据发送出去的情况。
说白了,就是发送端要将数据排个队,一个一个地往外蹦,接收端接收到了这些数据又要将它们像串糖葫芦一个一个串起来,成为并行的数据。
那么我们要做的I2C协议,其实就是按照I2C总线协议的要求,将本地的数据串行地发送出去,或者将外部的数据串行地接收回来的这么一个过程。
由于以前从未搞过I2C方面的工作,我的第一步是从理解夏老师的程序开始的,通过浏览I2C设计实例,可以知道要设计一个I2C通信程序,我们需要一个主机和一个从机,如下图1所示,它们之间采用I2C协议进行串行通信,设计实例中的signal模块和EEPROM_WR模块是用来模拟主机发送方的,EEPROM_WR模块是一个可综合的EEPROM读写器模型,它通过SCL和SDA两根线与EEPROM器件进行通信,并且SCL与SDA上的信号必须满足I2C通信协议的要求。
EEPROM模块只是EEPROM的行为级模型,signal模块与EEPROM模块都是为了仿真需要而存在的。
先简单的介绍一下I2C总线特征。
只有在总线处于“非忙”状态时,才能开始数据传输。
在数据传输期间,只要时钟线为高电平,数据线都必须保持稳定,否则数据线上的任何变化都被当作“启动”或“停止”信号。
图1是总线状态的定义。
(1)总线非忙状态(A 段):数据线SDA 和时钟线 SCL 都保持高电平。
i2c 返回 io error

I2C(Inter-Integrated Circuit)是一种用于在微控制器和外部设备之间进行通信的串行通信协议。
它是一种两线制的通信协议,使用SCL (串行时钟)和SDA(串行数据)线进行通信。
在微控制器中,I2C 总线通常用于连接传感器、存储器、外围设备等外部设备。
然而,在使用I2C通信时,有时会遇到返回IO错误的问题,本文将从以下几个方面来分析I2C返回IO错误及其解决办法。
1. 错误的I2C设备位置区域在使用I2C通信时,一个常见的问题是错误的设备位置区域。
每个I2C 设备都有一个7位的位置区域,这个位置区域可以是静态的,也可以是可编程的。
在进行I2C通信时,首先要确保所访问的设备位置区域是正确的。
如果设备位置区域错误,就会导致IO错误的发生。
解决这个问题的方法是仔细查阅设备的数据手册,确认设备位置区域的正确性。
2. 电源供应问题另一个可能导致I2C返回IO错误的问题是电源供应问题。
I2C设备在通信时需要稳定的电源供应,如果电源不稳定,就会导致通信中断或错误。
为了解决这个问题,可以使用示波器或者多用表来监测设备的电源供应情况,确保电源稳定。
3. 总线冲突I2C总线上的设备是通过位置区域来进行通信的,当多个设备使用相同的位置区域或者占用同一总线时,就会发生总线冲突,导致IO错误的发生。
解决这个问题的方法是重新安排设备的位置区域,避免位置区域冲突,或者使用I2C总线的多主机模式来解决冲突问题。
4. 外部干扰在一些工业环境下,会有外部干扰源对I2C通信产生影响。
这些干扰源可能是电磁干扰、噪声干扰等。
为了解决这个问题,可以采取一些屏蔽措施,比如使用屏蔽电缆、屏蔽罩等来减少外部干扰。
5. 通信速率过快I2C通信的速率是可以调节的,但是如果通信速率过快,就会导致通信错误。
可以通过降低通信速率来解决这个问题,确保通信稳定。
总结I2C返回IO错误是一个常见的问题,但是通过仔细排查,可以找到并解决问题的根源。
IIC通信协议总结

IIC通信协议一.概述二.硬件结构三:数据的传输开始和停止条件的确定:在I2C总线传输过程中,将两种特定的情况定义为开始和停止条件(见图3):当SCL保持“高”时,SDA由“高”变为“低”为开始条件;当SCL保持“高”且SDA由“低”变为“高”时为停止条件。
开始和停止条件均由主控制器产生。
使用硬件接口可以很容易地检测到开始和停止条件,没有这种接口的微机必须以每时钟周期至少两次对SDA取样,以检测这种变化。
传输注意事项:1.SDA线上的数据在时钟“高”期间必须是稳定的,只有当SCL线上的时钟信号为低时,数据线上的“高”或“低”状态才可以改变。
因此在IIC总线上胡数据传输过程中,数据信号线SDA的变化只能发生在SCL为低电平的期间内。
从上图中可以清楚的看到这一点。
响应信号ACK宽度为1位,紧跟在8个数据位后面,所以发送1字节的数据需要9个SCL时钟脉冲。
响应时钟脉冲也是由主机产生的,主机在响应时钟脉冲期间释放SDA线,使其处在高电平(见图16—3上面的信号)。
而在响应时钟脉冲期间,接收方需要将SDA拉低,使SDA在响应时钟脉冲高电平期间保持稳定的低电平(见图16—3中间结束的信号)。
低电平用ACK表示,代表有应答;高电平用nACK表示,代表无应答。
应答信号在I2C总线的数据传输过程中起着非常重要的作用,它将决定总线及连接在总线上设备下一步的状态和动作。
一旦在应答信号上发生错误,例如接收方不按规定返回或返回不正确的应答信号,以及发送方对应答信号的误判,都将造成总线通信的失败。
2.输出到SDA线上的每个字节必须是8位,高位在前,低位在后。
每次传输的字节不受限制,但每个字节必须要有一个应答ACK。
如果一接收器件在完成其他功能(如一内部中断)前不能接收另一数据的完整字节时,它可以保持时钟线SCL为低,以促使发送器进入等待状态;当接收器准备好接受数据的其它字节并释放时钟SCL后,数据传输继续进行。
3.数据传送具有应答是必须的。
I2C总线——总结

I2C总线——总结I2C总线是一种串行数据通信协议,用于连接集成电路之间进行通信。
它由Phillips公司于1982年首次提出,并在随后的几十年中得到广泛应用和发展。
I2C总线采用两根线(SDA和SCL)进行通信,具有简单、高效的特点,适用于较短距离的通信。
首先,I2C总线的架构包括两个主要组成部分:主设备和从设备。
主设备通常是微控制器或其他控制器,负责发起和控制通信。
从设备是主设备的外围设备,例如传感器、电池芯片、存储器等。
主设备通过发送信号来控制从设备,并接收从设备发送的响应信号。
在I2C通信中,数据以字节为单位传输,每个字节都包含8位。
通信的起始由主设备发起,并发送设备地址标识。
从设备必须匹配该地址才能进入通信状态。
在通信过程中,主设备发送读取或写入指令,然后发送或接收数据。
每个数据字节都由从设备发送确认信号,以确保数据的准确接收。
除了基本的读写操作,I2C总线还支持一些高级功能,例如时钟同步、主从模式切换和热插拔功能。
这些功能使得I2C总线适用于各种应用场景,包括电子设备、通信系统、工业控制和汽车电子等。
然而,尽管I2C总线具有许多优点,但也存在一些限制和挑战。
首先,I2C总线在传输速度方面不如其他通信协议(如SPI和CAN)。
其次,长距离传输可能受到电压下降、信号失真和干扰等因素的影响。
此外,I2C总线的主设备需要额外的控制逻辑和处理能力,这可能增加系统的复杂性和成本。
综上所述,I2C总线是一种非常常用和实用的串行通信协议。
它具有简单、高效的特点,适用于较短距离的设备间通信。
通过多主机配置和高级功能支持,I2C总线可以满足各种应用的需求。
然而,需要根据具体的应用场景和要求来选择合适的通信协议,以确保系统的性能和可靠性。
关于I2C的总结

关于I2C的总结
这两天在看I2C,为了加深印象,把我遇到的一些问题写出来吧。
1
最先遇到的问题是AT24C02的操作时序,AT24C02内部有一个指针,指向
储存空间的某一个字节,另外AT24C系列支持页操作,对于AT24C02一个页
是8字节,也就是说地址的高5位是页地址,在同一次写入中,页地址不变,
低3位地址一次增加,当增加到7之后再加1就变成0了,而由于页地址不变,相当于指针回到了页首,如果继续写那前面的内容会被覆盖。
写数据的时序,
先是I2C的开始信号,发送设备地址,之后写入希望写入的数据地址,然后依
次写入数据。
当然,可以只写一个字节的数据。
对于读取,是不存在页的概念的,时序是先发送启动信号,然后发送设备地
址(注意,是写设备的时候的地址,也就是说最低位是1),接着发送数据地址,完了之后重新发送一次启动信号,接着就可以读取了,读取完一个字节的数据
后要发送一个ACK,对于最后一个字节的数据要发送一个NACK来告诉
AT24C数据已经接收完毕,之后发送结束信号断开连接即可。
也可以只接收一
个数据,这时候一个ACK都没有,第一次接收好直接发送一个NACK。
24C02的内部有连续的子地址空间,对这些空间进行n个字节的连续读/写时,都具有地址自动加1功能。
只要设定好要读/写的器件内起始子地址及字节数,
就能完成整个操作。
注意:对于24C02连续写的字节数不应超过页容量8,一
次连续写所形成的总线传送结束后(主机发出停止信号后),24C02执行内部擦写过程,大约需要10ms左右,24C02不再应答主器件的任何请求。
24C02内。
STM8LI2C程序第二次数据通信失败的问题分析

/* Transmit data */ I2C_SendData(I2C1, Slave_Buffer_Rx[Tx_Idx++]); break; /******* Slave receiver **********/ /* check on EV1*/ case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED: break;
/* Set LED2 */ STM_EVAL_LEDOn(LED2);
} Event = I2C_GetLastEvent(I2C1); switch (Event) {
/******* Slave transmitter ******/ /* check on EV1 */ case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED: Tx_Idx = 0; break;
客户对 I2C 中断处理程序进行了修改,对应的代码如下,黄色部分标出了客户修改的代码: case (I2C_EVENT_SLAVE_STOP_DETECTED): /* write to CR2 to clear STOPF flag */ //I2C1->CR2 |= I2C_CR2_ACK; I2C1->CR2 |= (I2C_CR2_ACK + I2C_CR2_STOP);
3. 程序中的出错现象
客户的程序调时发现相同的数据连续从主控发给从机,只有第一次的通信波形是好的,第二次通信时设备地址可正常发送,
从机也有应答,但当第一 byte 数据发送完成后,主机收不到从机的应答信号。
I2C通讯可能问题分析
I2C 总线比较简单,可能的问题主要出在时序上,一般设计者即使忽略也不太会有麻烦,但是有几个指标一定要认真考虑:1、总线驱动能力。
上拉电阻和负载电容决定了总线在某一速率下的稳定性。
当输出为高时,电流通过上拉电阻对负载电容充电。
上拉越大,电容越大,所需要的时间就越长,如果超过了通信周期的10%,那么这个上升沿就太缓了,相应的建立时间会受到影响,I2C规范的最大负载电容是400pF,快速模式下是100pF。
如果输出为低,电流通过上拉电阻被I2C master 器件吸取,(注意根据I2C规范,最小只有3毫安的吸取电流)那么这个吸取电流在上拉电阻上的压降就决定了输出低电平能达到的范围,如果不能达到0.3VDD以下,就会有误采样。
有人说加大上拉电阻是不妥当的,要具体分析吸取电流、负载电容、上拉电平和通信速率才能决定(普通模式和快速模式是不一样的)。
2。
总线空闲时间(bus free time)。
它的定义是从上一次通信的停止到下一次通信的开始的间隔时间。
通常一些I2C器件的要求是4.7微秒,也有要20微秒的,比如某种激光器内嵌的PROM。
对CPU来说,它往往是I2C的master 器件,由于运行速度很快,这个指标如果不注意的话就会达不到,导致I2C总线不响应。
另外要注意的是CPU内部的I2C停止时刻标志位置位和硬件总线上的I2C停止标志(clock 为高时数据从低到高的跳变)时刻往往是不一致的。
有的芯片有15-20个微秒的差别,所以要用示波器量出来为准。
3。
总线保持时间。
I2C的总线建立和保持与有的时序定义不一样。
建立时间是指从数据跳变沿到时钟上升沿的间隔;而保持时间是指从时钟下降沿到数据下一个跳变沿的间隔。
通常建立时间都能保证,保持时间一般为0纳秒。
但是有的器件做不到,一般为900纳秒;还有的虽然宣称是0纳秒,时间也要近1微秒(比如说TI的某器件)仅供参考!a.完全不能进行读写:(1) 通信协议不正确:有很多的I2C设备,并不支持所有的I2C协议,同时也不是一个比较标准的I2C设备;软件的通信时序不正确。
浅析I2C及相关问题解决
浅析I2C及相关问题解决作者:罗莉来源:《电脑知识与技术》2019年第12期摘要:在实际应用过程中,I2C电路的关注相对较少,原因就在于其外围电路相对简单,但也容易出现不少的问题,对于电路设计来说,能读懂I2C上的传输数据,能够按照I2C要求的规范构建电路系统,无疑对于分析解决问题具有十分重要的作用。
本篇通过在设计过程中出现的问题实例,讨论在I2C应用的一些注意点。
关键词:I2C;开始信号;结束信号; ACK;电平中图分类号:TP391 文献标识码:A文章编号:1009-3044(2019)12-0266-02开放科学(资源服务)标识码(OSID):1 I2C总线的概念及工作原理1.1 I2C总线定义I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。
1.2 I2C总线特点I2C能使一个系统中各部分电路连接非常简单,省去许多I/O接口,简化了电路,提高了可靠性。
同时,它允许包含多个主控。
在I2C定义中,主控就是任何能够进行发送和接收的设备。
主控能够控制信号的传输和时钟频率。
同时,也规定同一套系统中同一时间点I2C上只能有一个主控。
1.3 I2C总线种类I2C 总线上数据的传输速率分为标准模式(100kbit/s)、快速模式(400kbit/s)及高速模式(3.4Mbit/s)。
目前我们大部分产品主要使用的总线模式仍为标准模式。
1.4 I2C总线工作原理I2C总线是串行总线,由数据线SDA和时钟SCL构成。
它可以在CPU与被控IC之间、IC与IC之间进行双向传送。
总线上所有被控制单元均采用并联方式连在一起,其中每个电路或者模块都有且只有一个地址。
在信息的传输过程中,并联的这些模块电路根据它所要完成的功能,既可以作为主控器(或发送器),又可以作为被控器(或接收器)。
在I2C上主控发出的控制信号一般包含地址码和数据两部分,其中地址码用来选择需要控制的模块电路,并确定控制的种类;数据则指定调整的类别及数量。
I2C不通的分析思路
[DESCRIPTION]在camera porting的过程中,有很多原因会导致Camera I2C不通此篇FAQ的目的是为camera i2c没通的情况,提供一个大概的思路[SOLUTION]I2C不通,有两种原因,一种是device端(也就是我们的camera sensor)本身就没有回ACK,另一中就是在master端(也就是我们的baseband端),如果我们的,master端就本身异常。
那么I2C不通就不足为奇了我们可以从kernel log里面搜索I2C的关键字,无非是“I2C_TIMEOUT”和“I2C_ACKERR”。
如果您搜索到了I2C_ACKERR,那么问题多半在slave端,您需要检查您的上电时需是否符合sensor spec 的规范,和模组厂的工程师或者sensor厂的工程师一起修改sensor的上电时需,如果您搜索到的是I2C_TIMEOUT,那么问题多半在master端。
[DESCRIPTION]I2C as the bridge which communicate during the image sensor and BB. It used to send and rececive command / data interaction with its fundamental role, especially importante in the porting process, i2c is the first step when porting a new sensor.[SOLUTION]I2C ACK error scenario as follows:Condition1: pin reverse(HW)1) SCL and SDA pin is reversed.2) So I2C controller only send out address waveform.Condition2: Slave device is not connected to host(HW)1) SCL/SDA default level is high2) I2C controller only send out address waveform.3) Slave can not response actionCondition 3: Slave address is wrong(SW)1) The same as not exitCondition 4: Slave device is connected to host but not in right ststus.1) Slave is busy, can not process host date.2) Continue sending dummy data to draw back slave status3) Reset slave device.Condition 5: This case include slave is not power on1) Check the power supply of device.Conidtion 6: This case include slave is not enable1) Check if the chip select is active.Condition 7: Some special device need work in WR mode.1) need use WR mode after send the Camera ID Command. If not suit it the device will send ACK error to Baseband.client->addr|=I2C_RS_FLAG|I2C_WR_FLAG;[DESCRIPTION]在开机过程中,感觉开机的时间过长,发现是search sensor导致的。
I2C时序分析和基础知识总结
I2C时序分析和基础知识总结I2C(Inter-Integrated Circuit)是一种串行通信协议,用于在集成电路之间传输数据。
它由Philips公司在1980年代初开发,并在现代的许多嵌入式系统中得到了广泛应用。
本文将对I2C的时序分析和基础知识进行总结。
一、I2C的基础知识1.主从结构:I2C通信有一个主设备和一个或多个从设备,主设备控制整个通信过程,从设备接收和响应主设备的命令。
2.总线:I2C使用双线制,包括一个双向的数据线(SDA)和一个时钟线(SCL)。
所有设备都通过这两条线连接在一起形成一个总线。
3.地址:每个从设备在总线上都有一个唯一的7位或10位地址,用于识别设备。
4. 传输速率:I2C的传输速率通常有标准模式(100Kbps)、快速模式(400Kbps)和高速模式(3.4Mbps)三种选择。
5. 触发方式:I2C通信可以通过主设备发出开始条件(start condition)和停止条件(stop condition)来触发。
二、I2C的时序分析I2C通信的时序分析主要涉及到以下几个关键的时刻:1. 开始条件(Start Condition):主设备拉低SDA线,然后拉低SCL线,在总线上发出一个开始信号。
2.地址传输:主设备发送从设备的地址,从设备通过检测总线上的地址匹配来判断自己是否被选中。
3.数据传输:在总线上的每个时钟周期内,数据(0或1)被传输。
4. 停止条件(Stop Condition):主设备释放SDA线,然后拉高SCL线,在总线上发出一个停止信号。
5. 确认位(ACK bit):在数据传输后,接收设备会发送一个ACK位,以确认接收到数据。
6. 重复启动条件(Repeated Start Condition):主设备可以在传输过程中发出一个重复启动信号,以重新寻址或不释放总线。
对于每个操作,如读取或写入数据,都需要经历上述的流程,主设备通过时钟线控制整个通信的时序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
i2c协议以及其相关bug分析总结篇一:I2C协议以及其相关bug分析总结_袁刚20XX1202一、I2C通信协议 ................................................ ................................................... (2)1、I2C 协议:............................................... . (2)2、I2C时序 ................................................ . (3)3、I2C协议中文版本 ................................................ .. (7)二、I2C协议中遇到的BUG分析 ................................................ .. (8)1、项目A72A中时序问题 ................................................ (8)2、T03 Light sensor 无ACK问题................................................. (8)3、S26I 电池以及F01电池问题................................................. (9)4、现象ACK后面的半高的小毛刺分析 ................................................ (10)5、T05C G-sensor无数据问题 ................................................ .. (11)三、I2C协议使用注意事项 ................................................ .. (12)1、I2C level shift 普通MOS以及level shift IC (12)2、I2C使用注意事项以及bug总结 ................................................ (15)文档整理人:袁刚 20XX年12月2日一、I2C通信协议1、I2C 协议:I2C 总线支持任何 IC 生产过程( NMOS、CMOS、双极性)。
两线的串行数据 SDA 和串行时钟SCL 线在连接到总线的器件间传递信息,每个器件都有一个唯一的地址识别(无论是微控制器、LCD驱动器、存储器或键盘接口),而且都可以作为一个发送器或接收器,由器件的功能决定,很明显LCD驱动器只是一个接收器,而存储器则既可以接收又可以发送数据。
除了发送器和接收器外器件,在执行数据传输时也可以被看作是主机或从机,如下表 1。
主机是初始化总线的数据传输并产生允许传输的时钟信号的器件,此时任何被寻址的器件都被认为是从机。
表格1① I2C总线的一些特征:只要求两条总线线路:一条串行数据线 SDA 一条串行时钟线 SCL每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机从机关系软件设定地址主机可以作为主机发送器或主机接收器它是一个真正的多主机总线如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏串行的 8位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s 高速模式下可达 /s片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整连接到相同总线的 IC 数量只受到总线的最大电容400pF 限制②I2C总线的传输:I2C 总线是一个多主机的总线,这就是说可以连接多于一个能控制总线的器件到总线,由于主机通常是微控制器,让我们考虑以下数据在两个连接到 I2C 总线的微控制器之间传输的情况。
这突出了 I2C 总线的主机-从机和接收器-发送器的关系,应当注意的是,这些关系不是持久的,只由当时数据传输的方向决定传输数据的过程如下:A、假设微控制器 A 要发送信息到微控制器 B微控制器 A(主机)寻址微控制器 B(从机)微控制器 A(主机)发送器发送数据到微控制器 B(从机)接收器微控制器 A 终止传输B、如果微控制器 A 想从微控制器 B 接收信息微控制器 A(主机)寻址微控制器 B 从机微控制器 A(主机)接收器从微控制器 B(从机)发送器接收数据微控制器 A 终止传输在 I2C 总线上产生时钟信号通常是主机器件的责任。
当在总线上传输数据时,每个主机产生自己的时钟信号,主机发出的总线时钟信号只有在以下的情况才能被改变:慢速的从机器件控制时钟线并延长时钟信号,或者在发生仲裁时被另一个主机改变。
③I2C数据传输中得信号:I2C总线在传送数据过程中共有三种类型信号开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的从机在接收到8bit数据后,向发送数据的主机发出特定的低电平脉冲,表示已收到数据。
主机向受控单元发出一个信号后,等待受控单元发出一个应答信号,主机接收到应答信号后,根据实际情况作出是否继续传递信号的判断。
若未收到应答信号,由判断为受控单元出现故障。
④I2C数据的有效性:只有在SDA数据必须在时钟的高电平周期保持稳定,数据线的高或低电平状态只有在 SCL 线的时钟信号是低电平时才能改变。
图1⑤I2C总线的优点:极低的电流消耗抗高噪声干扰电源电压范围宽工作的温度范围广故障诊断和调试都很简单故障可被立即寻迹在系统中增加或删除 IC 不会影响总线的其他电路2、I2C时序I2C的时序主要可以分为:总线空闲状态、启动信号、停止信号、数据传输位、应答信号、插入等待时间、重启动信号、时钟同步、总线冲突和总线仲裁、总线封锁状态。
①总线空闲状态。
I2C总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。
此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。
②启动信号在时钟线SCL保持高电平期间,数据线SDA上的电平被拉低(即负跳变),定义为I2C总线的启动信号,它标志着一次数据传输的开始。
启动信号是一种电平跳变时序信号,而不是一个电平信号。
启动信号是由主控器主动建立的,在建立该信号之前I2C 总线必须处于空闲状态,如图2图2③停止信号在时钟线SCL保持高电平期间,数据线SDA被释放,使得SDA返回高电平(即正跳变),称为I2C总线的停止信号,它标志着一次数据传输的终止。
如图2停止信号也是一种电平跳变时序信号,而不是一个电平信号,停止信号也是由主控器主动建立的,建立该信号之后,I2C总线将返回空闲状态。
④数据位传送在I2C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。
进行数据传送时,在SCL呈现高电平期间,SDA上的电平必须保持稳定,低电平为数据0,高电平为数据1。
只有在SCL为低电平期间,才允许SDA上的电平改变状态。
逻辑0的电平为低电压,而逻辑1的电平取决于器件本身的正电源电压VDD(当使用独立电源时),如图3所示。
图3⑤应答信号I2C总线上的所有数据都是以8位字节传送的,发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。
应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。
对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。
如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P,如图4所示。
图4⑥插入等待时间。
如果被控器需要延迟下一个数据字节开始传送的时间,则可以通过把时钟线SCL电平拉低并且保持,使主控器进入等待状态。
一旦被控器释放时钟线,数据传输就得以继续下去,这样就使得被控器得到足够时间转移已经收到的数据字节,或者准备好即将发送的数据字节。
带有CPU的被控器在对收到的地址字节做出应答之后,需要一定的时间去执行中断服务子程序,来分析或比较地址码,其间就把SCL线钳位在低电平上,直到处理妥当后才释放SCL线,进而使主控器继续后续数据字节的发送,如图5所示。
篇二:I2C协议总结I2C协议总结串行总线I2C由数据线SDA和时钟线SCL构成,可实现完善的双工同步数据传输,能方便的构成多机系统和外围器件扩展系统,I2C采用器件地址的硬件设置方法,通过软件进行寻址。
I2C总线系统中,以共同挂接的I2C总线作为通信手段的每个器件均构成I2C总线的一个器件节点。
根据节点是否带有智能,可将这些节点分为主器件节点和外围器件节点。
主器件节点可作为主控器,用来对总线进行主动控制。
在一次通信过程中,由主控器负责向总线上发送启动信号、同步时钟信号、被控器件地址码、重启动信号和停止信号等。
而被控器(即受控器件)可分别由这两种节点充当。
如果在系统中同时存在2个或2态。
由于I2C引入了同步时钟和总线仲裁机制,即使出现总线冲突也不会造成信息丢失。
发生总线冲突时,为了避免信息丢失,需要进行总线仲裁以决定谁是主控器。
总线仲裁是通过裁定SDA线上的控制权来解决的。
时钟同步是连接到SCL线上的所有器件进行“线与”实现的。
只要有一个器件向SCL输出低电平,SCL就为低电平。
因此SCL线的低电平时间由时钟低电平期最长的器件决定,而高电平时间由时钟高电平期最短的器件决定,由此形成了时钟的同步。
下图所示为一次完整的通信过程的时序。
图1 i2c总线数据传送时序(注:图中,SCL线上1~7位为7位地址码,第8位为读写位R\~D,第9位为ACK应答位,紧接着的为第一个数据字节,然后是一位应答位,后面继续第2个数据字节。
)如图所示,主控器在检测到总线空闲(数据线SDA和时钟线SCL同时处于高电平状态)时,首先发送一个启动信号S,它标志着一次数据传输的开始。
之后主控器发送一个地址字节包括7位地址码和一个读写位。
被控器收到地址字节后反馈一个应答信号ACK=0,主控器接收到ACK后开始发送第一个数据字节,被控器接收到第一个数据字节后,由反馈一个应答信号ACK=0。
主控器收到应答信号后开始传送第二个数据字节。
依次循环,主控器发送完数据后,就发送一个停止信号P,并释放总线,使得总线返回空闲状态。