IIC总线的数据线总线(SDA)只能被拉低到2.8V左右

???32 系列 ōō? 使用总结 初次使用時可能会遇到的问题 刚开始调试时用示波器发现时钟线一直为高电平,而且程序停在了 /* ?W S ō2?1 ??5 PV */ P(!ō2????Z(ō2?1, ō2?????????????????ň????????)); 原因:是因为???? 模块和ō2?1 模块共用了??7 引脚所以使得ō2?1 没有正常启动 而且即使你没有用到???? 只是打開了???? 的时钟也会影响ō2?1 的启动。解决办法 是改用ō2?2 或者重定义ō2? 的时钟线和数据线总线到??8、9 引脚;或者关掉???? 的时 鍾 使用WQ32103???6 模拟2 的时候. 管脚配置成??ō???S??Y??ň 固然,???32 ō2? 硬件接口有设计不完善的地方例如下面就是我从 ???32 最新的 ?VV W 中總结出的,关于???32 ō2? 接口设计上的一些缺陷和如何避开这些 缺陷的推荐程序模型: (1)把ō2? 的中断优先级提升到最高 (2)把发送多於2 个字节的发送与接收封装成利用 ň?? 收发的函数而把对某ō2? 设 备接收和发送一个字节的函数单独封装为一个????ō?? (轮询)函數。 (3)在寻址某一ō2? ň??ō?? 时要先????? ō2? ??? 是否????,如果忙,则 等待指定时间如果还是忙就说明ō2? ??? 挂了(原洇99.9%是由于我们的ō2? 通信 时序并不十分尊守ō2? 规约,或者我们所封装的ō2? 通信模块没有加上防守代码(出错恢 复代码))这时要调鼡一个专门的用于通知 ō2? ??? 上的所有Z,让他们结束当 前内部的工作重新准备好(下雨了,收衣服啦)如下面的我的ō2? 模块的??? 切片: 该函数一定要用在主???的启动模块上,因为ō2?总线在充当?WV的???启动时 ?ň? 和??? 有可能组合出刚好符合ō2? 规约的时序組合,比如一个开始位(????? ???ňō?ō??),使得ō2? ??? 立即当在那里(因为当主??? 真正需要发出一个????? ???ňō?ō?? 時发现ō2? ??? 正处于??? 状态,而根据???32 手册的????? ???ňō?ō?? 说明可知一个起始条件将会使得 ō2? ??? 处于???? 状态, 丅面的 ō2?2??V??Y Y 的基本用法: (注: ō2?2??V??YW ?Y 应放在线程中,而不是放在上图中的位置这样会触发并 进入一个硬件错误处理向量中断Φ) 提示:摘自???32 手册: ō2?.??1.? 0 位(??)? ?V (?WV QS) ? ? ?V SS V. ? ?PV ] WSV ] V 硬件设计的一个小???(2。95节) (6)大部分的??? 的硬件ō2? 接口的工莋模式是中断(高端的会用ň??)+状态机; 因此状态机的编程概念要熟悉 (7)???32 ō2? 的硬件接口负责实现满足ō2? 总线的的规约,而我們(嵌入式编程开 发者)则是通过ō2? 控制寄存器和ō2? 的事件标志组合来启动状态机然后让状态机按 照由ō2? ??1 和??2 所组合志来嘚事件自动工作,并在发送或接收完成后通过???? 的方式或信号量的方式通知我们所写的读写函数操作已经完成,或者在操作中出现叻错误 如最常见的?? 错误(Z 在第9位上没有拉低?ň? 应答?WV。) (8)ō2? ??1 和??2 的功能分配(这是一个极易忽视的思考死角) 从???32 手册的ō2? VWV QT 中可以看到 ō2? 的??1,主要是反映 ō2? 通信的最基本的标志,要清除??1 的某个标志可以直接清除而ō2? 的??2 即是輔 助??1 的,他一般反映了ō2? 总一当前的工作状态如????,是主机模式还是从机模 式,等等关于??2 的很重要的一个编程模型是:要清除??1 的某些指定的标志位时, 比如?ňň?,先读??1 然后再读??2 将会清除掉已置位的?ňň?。 (9)?WV 在操作WPZ Z 时要先和他握一下手昰很好的防守编程模型 I2C I

Circuit)总线是一种由PHILIPS公司开发的两线式串行总线用于连接微控制器及其外围设备。I2C总线产生于在80年代最初为音频和视频设备开发,如今主要在服务器管理中使用其中包括單个组件状态的通信。例如管理员可对各个组件进行查询以管理系统的配置或掌握组件的功能状态,如电源和系统风扇可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性方便了管理。

I2C总线最主要的优点是其简单性和有效性由于接口直接在组件之上,因此I2C总线占用的空间非常小减少了电路板的空间和芯片管脚的数量,降低了互联成本总线的长度可高达25英尺,并且能够以10Kbps的朂大传输速率支持40个组件I2C总线的另一个优点是,它支持多主控(multimastering) 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率当然,在任何时间点上只能有一个主控

2、总线的构成及信号类型
I2C总线是由数据线总线SDA和时钟SCL构成的串行总線,可发送和接收数据在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps各种被控制电路均并联在这条总线上,但就像电话机一样呮有拨通各自的号码才能工作所以每个电路和模块都有唯一的地址,在信息的传输过程中I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器)这取决于它所要完成的功能。CPU发出的控制信号分为地址码和控制量两部分地址码用来选址,即接通需要控制的电路确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。这样各控制电路虽然挂在同一條总线上,却彼此独立互不相关。


I2C总线在传送数据过程中共有三种类型信号 它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时SDA由高电平向低电平跳变,开始传送数据

结束信号:SCL为高电平时,SDA由低电平向高电平跳变结束传送数据。应答信号:接收数据的IC在接收到8bit数据后向发送数据的IC发出特定的低电平脉冲,表示已收到数据CPU向受控单元发出一个信号后,等待受控单元发出一个應答信号CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断若未收到应答信号,由判断为受控单元出现故障

在I2C总线通信的过程中,参与通信的双方互相之间所传输的信息种类归纳如下

  主控器向被控器发送的信息种类有:启动信号、停止信号、7位地址码、读/写控制位、10位地址码、数据字节、重启动信号、应答信号、时钟脉冲。

  被控器向主控器发送的信息种类有:应答信号、数據字节、时钟低电平

  下面对I2C总线通信过程中出现的几种信号状态和时序进行分析。

  I2C总线总线的SDA和SCL两条信号线同时处于高电平时规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态即释放总线,由两条信号线各自的上拉电阻把电平拉高

在時钟线SCL保持高电平期间,数据线总线SDA上的电平被拉低(即负跳变)定义为I2C总线总线的启动信号,它标志着一次数据传输的开始

启动信號是一种电平跳变时序信号,而不是一个电平信号启动信号是由主控器主动建立的,在建立该信号之前I2C总线必须处于空闲状态如图1所礻

  在时钟线SCL保持高电平期间,数据线总线SDA被释放使得SDA返回高电平(即正跳变),称为I2C总线的停止信号它标志着一次数据传输的终圵。

  停止信号也是一种电平跳变时序信号而不是一个电平信号,停止信号也是由主控器主动建立的建立该信号之后,I2C总线将返回涳闲状态


  在I2C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下在SDA上逐位地串行传送每一位数据。

  进行数据传送时在SCL呈现高电平期间,SDA上的电平必须保持稳定低电平为数据0,高电平为数据1

  只有在SCL为低电平期间,財允许SDA上的电平改变状态逻辑0的电平为低电压,而逻辑1的电平取决于器件本身的正电源电压VDD(当使用独立电源时)如图2所示。


  I2C总線上的所有数据都是以8位字节传送的发送器每发送一个字节,就在时钟脉冲9期间释放数据线总线由接收器反馈一个应答信号。

  应答信号为低电平时规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时规定为非应答位(NACK),一般表示接收器接收该字节没有成功

  对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低并且確保在该时钟的高电平期间为稳定的低电平。

  如果接收器是主控器则在它收到最后一个字节后,发送一个NACK信号以通知被控发送器結束数据发送,并释放SDA线以便主控接收器发送一个停止信号P,如图3所示   如果被控器需要延迟下一个数据字节开始传送的时间,则鈳以通过把时钟线SCL电平拉低并且保持使主控器进入等待状态。

  一旦被控器释放时钟线数据传输就得以继续下去,这样就使得被控器得到足够时间转移已经收到的数据字节或者准备好即将发送的数据字节。

  带有CPU的被控器在对收到的地址字节做出应答之后需要┅定的时间去执行中断服务子程序,来分析或比较地址码其间就把SCL线钳位在低电平上,直到处理妥当后才释放SCL线进而使主控器继续后續数据字节的发送,如图4所示

  在主控器控制总线期间完成了一次数据通信(发送或接收)之后,如果想继续占用总线再进行一次数據通信(发送或接收)而又不释放总线,就需要利用重启动Sr信号时序

  重启动信号Sr既作为前一次数据传输的结束,又作为后一次数據传输的开始利用重启动信号的优点是,在前后两次通信之间主控器不需要释放总线这样就不会丢失总线的控制权,即不让其他主器件节点抢占总线

  如果在某一I2C总线系统中存在两个主器件节点,分别记为主器件1和主器件2其时钟输出端分别为CLK1和CLK0,它们都有控制总線的能力

  假设在某一期间两者相继向SCL线发出了波形不同的时钟脉冲序列CLK1和CLK2(时钟脉冲的高、低电平宽度都是依靠各自内部专用计数器定时产生的),在总线控制权还没有裁定之前这种现象是可能出现的

  鉴于I2C总线的“线与”特性,使得时钟线SCL上得到的时钟信号波形既不像主器件1所期望的CLK1,也不像主器件2所期望的CLK2而是两者进行逻辑与的结果。

  CLKI和CLK2的合成波形作为共同的同步时钟信号一旦总線控制权裁定给某一主器件,则总线时钟信号将会只由该主器件产生如图5所示。

⑨总线冲突和总线仲裁
  假如在某I2C总线系统中存在兩个主器件节点,分别记为主器件1和主器件2其数据输出端分别为DATA1和DATA2,它们都有控制总线的能力这就存在着发生总线冲突(即写冲突)嘚可能性。

  假设在某一瞬间两者相继向总线发出了启动信号鉴于:I2C总线的“线与”特性,使得在数据线总线SDA上得到的信号波形是DATA1和DATA2兩者相与的结果该结果略微超前送出低电平的主器件1,其DATA1的下降沿被当做SDA的下降沿

  在总线被启动后,主器件1企图发送数据“101……”主器件2企图发送数据“100101……”。

  两个主器件在每次发出一个数据位的同时都要对自己输出端的信号电平进行抽检只要抽检的结果与它们自己预期的电平相符,就会继续占用总线总线控制权也就得不到裁定结果。

  主器件1的第3位期望发送“1”也就是在第3个时鍾周期内送出高电平。

  在该时钟周期的高电平期间主器件1进行例行抽检时,结果检测到一个不相匹配的电平“0”这时主器件1只好決定放弃总线控制杈;因此,主器件2就成了总线的惟一主宰者总线控制权也就最终得出了裁定结果,从而实现了总线仲裁的功能

  從以上总线仲裁的完成过程可以得出:仲裁过程主器件1和主器件2都不会丢失数据;各个主器件没有优先级别之分,总线控制权是随机裁定嘚即使是抢先发送启动信号的主器件1最终也并没有得到控制杈。

  系统实际上遵循的是“低电平优先”的仲裁原则将总线判给在数據线总线上先发送低电平的主器件,而其他发送高电平的主器件将失去总线控制权如图6所示。


  在特殊情况下如果需要禁止所有发苼在I2C总线上的通信活动,封锁或关闭总线是一种可行途径只要挂接于该总线上的任意一个器件将时钟线SCL锁定在低电平上即可。


IIC开发于1982年当时是为了给电視机内的CPU和外围芯片提供更简易的互连方式。电视机是最早的嵌入式系统之一而最初的嵌入系统是使用内存映射(memory-mapped I/O)的方式来互连微控淛器和外围设备的。要实现内存映射设备必须并行连入微控制器的数据线总线和地址线,这种方式在连接多个外设时需大量线路和额外哋址解码芯片很不方便并且成本高。
为了节省微控制器的引脚和和额外的逻辑芯片使印刷电路板更简单,成本更低位于荷兰的Philips实验室开发了IIC(Inter-Integrated Circuit),它是由数据线总线 SDA和时钟线SCL两根线构成的串行总线可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送
IIC数据传输速率有標准模式(100 kbps)、快速模式(400 kbps)和高速模式(3.4 Mbps)另外一些变种实现了低速模式(10 kbps)和快速+模式(1 Mbps)

每一个I2C总线器件内部的SDA、SCL引脚電路结构都是一样的,引脚的输出驱动与输入缓冲连在一起其中输出为漏极开路的场效应管、输入缓冲为一只高输入阻抗的同相器。这種电路具有两个特点:

  • 由于 SDA、SCL 为漏极开路结构借助于外部的上拉电阻实现了信号的“线与”逻辑;
  • 引脚在输出信号的同时还能对引脚上嘚电平进行检测,检测是否与刚才输出一致为 “时钟同步”和“总线仲裁”提供硬件基础。

IIC数据传输的过程中数据帧的大小凅定为8位的字节,高位先发送

  • 主控器向被控器发送的信息种类有:
    启动信号、停止信号、7位地址码、读/写控制位、10位地址码(地址扩展)、数据字节、重启动信号、应答信号、时钟脉冲。

  • 被控器向主控器发送的信息种类有:
    应答信号、数据字节、时钟低电平(时钟拉伸)

IIC总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态此时各个器件的输出级场效应管均处在截止状态,即释放总线由两条信号线各自的上拉电阻把电平拉高。

SCL为高电平时SDA由高电平向低电平跳变,开始传送数据

SCL为高电平时SDA由低电岼向高电平跳变,结束传送数据

在IIC总线上,由主机发送一个开始信号启动一次通信后在首次发送停止信号之前,主机通過发送重新开始信号可以转换与当前从机的通信模式,或是切换到与另一个从机通信当SCL为高电平时,SDA由高电平向低电平跳变产生重噺开始信号,它的本质就是一个开始信号

IIC总线上的所有数据都是以8位字节传送的发送器每发送一个字节,就在第9个时钟脉冲期間释放数据线总线由接收器反馈一个应答信号。应答信号为低电平时规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收叻该字节;应答信号为高电平时规定为非应答位(NACK),一般表示接收器接收该字节没有成功

因此一个完整的字节数据传输需要9个时钟脈冲。如果从机作为接收方向主机发送非应答信号主机方就认为此次数据传输失败;如果是主机作为接收方,在从机发送器发送完一个芓节数据后向从机发送了非应答信号,从机就认为数据传输结束并释放SDA线。不论是以上哪种情况都会终止数据传输这时主机或是产苼停止信号释放总线或是产生重新开始信号,开始一次新的通信

在IIC总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下在SDA上逐位地串行传送每一位数据。进行数据传送时在SCL呈现高电平期间,SDA上的电平必须保持稳定只囿在SCL为低电平期间,才允许SDA上的电平改变状态

如果被控器需要延迟下一个数据字节开始传送的时间,则可以通过把时钟线SCL電平拉低并且保持使主控器进入等待状态。一旦被控器释放时钟线数据传输就得以继续下去,这样就使得被控器得到足够时间转移已經收到的数据字节或者准备好即将发送的数据字节。

带有CPU的被控器在对收到的地址字节做出应答之后需要一定的时间去执行中断服务孓程序,来分析或比较地址码其间就把SCL线钳位在低电平上,直到处理妥当后才释放SCL线进而使主控器继续后续数据字节的发送

1.3.8. 总线冲突和总线仲裁

假如在某IIC总线系统中存在两个主器件节点,分别记为主器件1和主器件2其输出数据分别为DATA1和DATA2,它们都有控淛总线的能力这就存在着发生总线冲突(即写冲突)的可能性。

假设在某一瞬间两者相继向总线发出了启动信号鉴于:I2C总线的“线与”特性,使得在数据线总线SDA上得到的信号波形是DATA1和DATA2两者相与的结果

在总线被启动后主器件1企图发送数据“101……”,主器件2企图发送数据“100……”

两个主器件在每次发出一个数据位的同时都要对自己输出端的信号电平进行抽检,只要抽检的结果与它们自己预期的电平相符就会继续占用总线,总线控制权也就得不到裁定结果

主器件1的第3位期望发送“1”,也就是在第3个时钟周期内送出高电平在该时钟周期的高电平期间,主器件1进行例行抽检时结果检测到一个不相匹配的电平“0”,这时主器件1只好决定放弃总线控制杈;因此主器件2就荿了总线的惟一主宰者,总线控制权也就最终得出了裁定结果从而实现了总线仲裁的功能。

从以上总线仲裁的完成过程可以得出:仲裁過程主器件1和主器件2都不会丢失数据;各个主器件没有优先级别之分总线控制权是随机裁定的。

系统实际上遵循的是“低电平优先”的仲裁原则将总线判给在数据线总线上先发送低电平的主器件,而其他发送高电平的主器件将失去总线控制权

如果在某一I2C总线系統中存在两个主器件节点分别记为主器件1和主器件2,其时钟输出端分别为CLK1和CLK2它们都有控制总线的能力。

假设在某一期间两者相继向SCL线發出了波形不同的时钟脉冲序列CLK1和CLK2在总线控制权还没有裁定之前这种现象是可能出现的。

鉴于IIC总线的“线与”特性使得时钟线SCL上得到嘚时钟信号波形,既不像主器件1所期望的CLK1也不像主器件2所期望的CLK2,而是两者进行逻辑与的结果

CLKI和CLK2的合成波形作为共同的同步时钟信号,一旦总线控制权裁定给某一主器件则总线时钟信号将会只由该主器件产生

在特殊情况下,如果需要禁止所有发生在I2C总线仩的通信活动封锁或关闭总线是一种可行途径,只要挂接于该总线上的任意一个器件将时钟线SCL锁定在低电平上即可

原理上讲,使用上拉电阻来设置逻辑1会限制总线的最大传输速度而速度是限制总线应用的因素之一。这也说明为什么要引入高速模式(3.4 Mbps)在发起一次高速模式传输前,主设备必须先在低速的模式下(例如快速模式)发出特定的“High Speed Master”信号为缩短信号的周期和提高总线速度,高速模式必须使用额外的I/O缓冲区另外,总线仲裁在高速模式下可屏蔽掉

在 IIC 通信中,主设备决定了时钟速度因为时钟脉冲信号是甴主设备显式发出的。但是当从设备没办法跟上主设备的速度时,从设备需要一种机制来请求主设备慢一点这种机制称为时钟拉伸,洏基于I?C结构的特殊性这种机制得到实现。当从设备需要降低传输的速度的时候它可以拉下时钟线,逼迫主设备进入等待状态直到從设备释放时钟线,通信才继续

首先,主设备发一个START信号然后其它设备开始监听总线以准备接收数据。接着主设备发送一個7位设备地址加一位的读写操作的数据帧。当所有从设备接收数据后比对地址自己是否目标设备。如果比对不符设备进入等待状态,等待STOP信号的来临;如果比对相符设备会发送一个应答信号——ACK作回应。

当主设备收到应答后便开始传送或接收数据数据帧大小为8位。主设备发送数据从设备应答;相反从设备发送数据,主设备应答当数据传送完毕,主设备发送一个STOP信号向其它设备宣告释放总线,其它设备回到初始状态

为了消除IIC总线系统中主控器与被控器的地址选择线,最大限度地简化总线连接线IIC总线采用了独特的寻址约定,规定了开始信号后的第一个字节为寻址字节用来寻址被控器件,并规定数据传送方向

在IIC总线系统中,寻址字节由七位地址位(咜占据了D7-D1位)和一位方向位(为D0位)组成方向位为0时表示主控器将数据写入被控器,为 1时表示主控器从被控器读取数据主控器发送开始信号後,立即发送寻址字节这时总线上的所有器件都将寻址字节中的7位地址与自己器件地址比较。如果两者相同则该器件认为被主控器寻址,并发送应答信号被控器根据读/写位确定自身是作为发送器还是接收器。

主器件作为被控器时其7位从地址在IIC总线地址寄存器中给定,为纯软件地址而非单片机类型的外围器件地址完全由器件类型与引脚电平给定。IIC总线系统中没有两个从机的地址是相同的。主控器鈈应该传输一个和它本身的从地址相同的地址

7位I2C总线可以挂接127个不同地址的I2C设备,0号”设备”作为群呼地址.

地址的分配方法有两种:

  • 含CPU嘚智能器件地址由软件初始化时定义,但不能与其它的器件有冲突
  • 不含CPU的非智能器件由厂家在器件内部固化,不可改变

高7位为地址碼,其分为两部分:

  • 高4位属于固定地址不可改变由厂家固化的统一地址;
  • 低三位为引脚设定地址,可以由外部引脚来设定(并非所有器件嘟可以设定);

常用IIC接口通用器件的器件地址是由种类型号以及寻址码组成的共7位。如格式如下:
器件类型由:D7-D4 共4位决定的这是由半导公司生产时就已固定的了,也就是说这4位已是固定的用户自定义地址码:D3-D1共3位。这是由用户自己设置的通常的作法如EEPROM这些器件是由外蔀IC的3个引脚所组合电平决定的(用常用的名字如A0,A1,A2)。这也就是寻址码所以为什么同一IIC总线上同一型号的IC只能最多共挂8片同种类芯片的原洇了。

  1. 主机在检测到总线为“空闲状态”(即 SDA、SCL 线均为高电平)时发送一个启动信号“S”,开始一次通信的开始
  2. 主机接着发送一個命令字节该字节由 7 位的外围器件地址和 1 位读写控制位 R/W组成(此时 R/W=0为写)
  3. 相对应的从机收到命令字节后向主机回馈应答信号 ACK(ACK=0)
  4. 主机收箌从机的应答信号后开始发送第一个字节的数据
  5. 从机收到数据后返回一个应答信号 ACK
  6. 主机收到应答信号后再发送下一个数据字节
  7. 当主机发送朂后一个数据字节并收到从机的 ACK 后,通过向从机发送一个停止信号P结束本次通信并释放总线从机收到P信号后也退出与主机之间的通信
    注意:①主机通过发送地址码与对应的从机建立了通信关系,而挂接在总线上的其它从机虽然同时也收到了地址码但因为与其自身的地址鈈相符合,因此提前退出与主机的通信;②主机的一次发送通信其发送的数据数量不受限制。主机是通过 P 信号通知发送的结束从机收箌 P 信号后退出本次通信;③主机的每一次发送后都是通过从机的 ACK 信号了解从机的接收状况,如果应答错误则重发

  1. 主机发送启动信號后,接着发送命令字节(其中 R/W=1)
  2. 对应的从机收到地址字节后返回一个应答信号并向主机发送数据
  3. 主机收到数据后向从机反馈一个应答信号
  4. 从机收到应答信号后再向主机发送下一个数据
  5. 当主机完成接收数据后,向从机发送一个“非应答信号(ACK=1)”从机收到ACK=1 的非应答信号後便停止发送
  6. 主机发送非应答信号后,再发送一个停止信号释放总线结束通信
    注意:主机所接收数据的数量是由主机自身决定,当发送“非应答信号/A”时从机便结束传送并释放总线(非应答信号的两个作用:前一个数据接收成功停止从机的再次发送)。

1.8. 总线死锁原因分析

I2C总线写操作过程中主机在产生启动信号后控制SCL产生8个时钟脉冲,然后拉低SCL信号为低电平在这个时候,从机输出应答信号将SDA信号拉为低电平。如果这个时候主机异常复位SCL就会被释放为高电平。此时如果从机没有复位,就会继续I2C的应答将SDA一直拉為低电平,直到SCL变为低电平才会结束应答信号。而对于主机来说复位后检测SCL和SDA信号,如果发现SDA信号为低电平则会认为I2C总线被占用,會一直等待SCL和SDA信号变为高电平这样,主机等待从机释放SDA信号而同时从机又在等待主机将SCL信号拉低以释放应答信号,两者相互等待I2C总線进人一种死锁状态。同样当I2C进行读操作时,从机应答后输出数据如果在这个时刻主机异常复位而此时从机输出的数据位正好为0,也會导致I2C总线进入死锁状态

解决方案通常有如下几种:

  • 将从机的电源设计为可控,当发生总线死锁的时将从机复位
  • 可以在从机的程序中加叺监测功能如果总线长时间被拉低则释放对总线的控制
  • 在主机中增加I2C总线恢复程序。每次主机复位后如果检测到SDA被拉低,则控制SCL产生<=9個时钟脉冲(针对8位数据的情况)每发送一个时钟脉冲就检测SDA是否被释放,如果SDA已经被释放就再模拟产生一个停止信号这样从机就可以完荿被挂起的读写操作,从死锁状态中恢复过来这种方法有一定的局限性,因为大部分主机的I2C模块由内置的硬件电路来实现软件并不能夠直接控制SCL信号模拟产生需要的时钟脉冲

任何IIC设备都有一个7位地址,理论上现实中只能有127种不同的IIC设备。实际上已有IIC的设备種类远远多于这个限制,在一条总线上出现相同的地址的IIC设备的概率相当高为了突破这个限制,很多设备使用了双重地址——7位地址加引脚地址(external configuration pins)IIC 标准也预知了这种限制,提出10位的地址方案
10位的地址方案对 IIC协议的影响有两点:

  • 地址帧为两个字节长,原来的是一个字節;
  • 第一个字节前五位最高有效位用作10位地址标识约定是“11110”。

物理结构上IIC系统由一条串行数据线总线SDA和一条串行时钟線SCL组成。主机按一定的通信协议向从机寻址和进行信息传输在数据传输时,由主机初始化一次数据传输主机使数据在SDA线上传输的同时還通过SCL线传输时钟。信息传输的对象和方向以及信息传输的开始和终止均由主机决定

每个器件都有一个唯一的地址,而且可以是单接收嘚器件(例如:LCD驱动器)或者可以接收也可以发送的器件(例如:存储器)发送器或接收器可以在主模式或从模式下操作,这取决于芯爿是否必须启动数据的传输还是仅仅被寻址

我要回帖

更多关于 数据线总线 的文章

 

随机推荐