I2C只用两条线(SDA和SCL)在连接到总线上的设备之间传送数据.每一个设备都由唯一的地址来识别(不管是微处理器、LCD驱动器、存储器或者键盘接口),并且可以依照设备的功能作为发送器或者接收器使用.LCD驱动器可能只是个接收器,而存储器可以发送和接受数据.除了发送器和接收器,当传送数据时设备还可以作为主机或者从机.主机就是初始化数据传输和产生时钟信号的设备,在那个时刻,任何被寻址的设备都是从机.

        I2C总线是一个多主机总线.意味着可以连接多个可以控制总线的设备到总线上.主机通常是微控制器,我们可以考虑以下两个连接到总线上的微处理器之间的数据传输的情况.

这个例子中突出了I2C总线中的主从和接收器-发送器之间的关系.注意这些关系不是固定的,仅依赖于当前时刻数据传输的方向.数据传输的过程如下:
1.假定微控制器A向微控制器B发送数据
微控制器A(主机)寻址微控制器B(从机)
微控制器A(主机-发送器)发送数据到微控制器B(从机-接收器)
微控制器A结束数据传输
2.假定微控制器A从微控制器B接收数据
微控制器A(主机)寻址微控制器B(从机)
微控制器A(主机-接收器)从微控制器B(从机-发送器)接收数据
微控制器A结束数据传输
甚至在这种情况下,主机(微控制器A)产生时序并终止传输.
在多个微控制器连接到I2C总线上时意味着可能有多个主机尝试初始化数据传输.为了避免由此引发的混乱,设计了一个仲裁机制.它依靠线与逻辑连接所有I2C接口道I2C总线.
如果有多个主机尝试发送信息到总线上,在其它产生"0"的情况下,首先产生"1"的主机会丢掷仲裁.仲裁时的时钟信号是用线与连接到SCL线的主机产生的时钟的同步结合.
I2C总线上的主机设备通常负责产生时钟,当传输数据时每个主机产生自己的时钟信号.只有在低速从设备控制时钟线或者仲裁发生时,主机的总线时钟才会被改变.
下表总结了I2C总线中的一些配置选择:

[1]这里也指被当作从机的主机
[2]时钟拉伸是部分从机的特性.如果在系统中没有从机可以拉伸时钟(将SCL拉低),主机一定需要设计处理程序
[3]'Bit banging'(软件模拟)多个主机系统应该考虑START字节

SDA和SCL信号
SDA和SCL都是双向线路,通过电流源或者上拉电阻连接到一个正向电压.(见下图)当总线空闲时,两条线都是高电平.连接到总线的设备的输出级必须是OD(漏极开路)或者OC(集电极开路)门才能执行线与功能.在标准模式下I2C总线传输数据可以达到100kb/s的速度,而在快速模式下达到400kb/s的速度,快速plus模式下是1Mb/s的速度,告诉模式下是3.4Mb/s的速度.总线的电容限制连接到总线上的接口数量.
对于一个单一主机的应用,如果总线上没有设备可以拉低时钟那么主机的SCL输出应该是push-pull(推挽)驱动设计.

SDA和SCL的逻辑电平
由于有各种不同的工艺的设备(CMOS NMOS 双极性)可以连接到I2C总线,低电平和高电平不是固定的而是依赖于相对应的VDD的电平.

数据有效性
在时钟为高期间SDA线上的数据必须稳定.只有在SCL线上的时钟信号低时数据线才可以改变高低状态.每个数据位传输都需要一个时钟产生.

开始和终止条件
所有的传输都由一个START(S)开始,有一个STOP(P)终止.
START条件是当SCL高时SDA从高到低
STOP条件是SCL高时SDA从低到高

开始条件和终止条件一直由主机产生.在开始条件后总线就处于忙状态.在终止条件后隔上一个固定时间总线就处于空闲状态.如果没有终止条件产生,而是一个重复的开始条件(Sr),那总线依旧是忙状态.这种情况下S和Sr在功能上是一样的.
如果连接到总线的设备包含了必须的接口硬件那么开始条件和终止条件的检测时很容易的.但是没有这样接口的微控制器在每个时钟周期内至少要采样两次SDA线来识别有没有电平变化.

(2)I2c总线SDA\SCL以及开始终止条件的更多相关文章

  1. I2C总线协议的软件模拟实现方法

    I2C总线协议的软件模拟实现方法 在上一篇博客中已经讲过I2C总线通信协议,本文讲述I2C总线协议的软件模拟实现方法. 1. 简述 所谓的I2C总线协议的软件模拟实现方法,就是用软件控制GPIO的输入 ...

  2. I2C总线通信

    UART 属于异步通信,比如电脑发送给单片机,电脑只负责把数据通过TXD 发送出来即可,接收数据是单片机自己的事情.而 I2C 属于同步通信, SCL 时钟线负责收发双方的时钟节拍, SDA 数据线负 ...

  3. I2C总线完全版——I2C总线的结构、工作时序与模拟编程

    I2C总线的结构.工作时序与模拟编程 I2C总线的结构.工作时序与模拟编程I2C总线(Inter Integrated Circuit)是飞利浦公司于上个世纪80年代开发的一种"电路板级&q ...

  4. [I2C]I2C总线协议图解

    转自:http://blog.csdn.net/w89436838/article/details/38660631 1  I2C总线物理拓扑结构      I2C 总线在物理连接上非常简单,分别由S ...

  5. I2C总线信号时序总结

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

  6. (5)I2C总线的10bit地址以及通用广播地址

    其实,10bit地址我没用过,通用广播地址更没用过.通用广播地址应该是在多个mcu之间用i2c进行通信时使用的.虽说没用到,但还是做了翻译,说不定以后有机会用到: 10bit地址 10bit的寻址扩展 ...

  7. (4)I2C总线的7bit从机地址

    时钟拉伸(Clock stretching)clock stretching通过将SCL线拉低来暂停一个传输.直到释放SCL线为高电平,传输才继续进行.clock stretching是可选的,实际上 ...

  8. (3)I2C总线的字节格式,时钟同步和仲裁

    字节格式 发送到SDA线上的每个字节必须是8位.每次传输的字节数量是不受限制的.每个字节后必须跟着一个ACK应答位.数据从最高有效位(MSB)开始传输.如果从机要执行一些功能后才能接收或者发送新的完整 ...

  9. I2C总线之(二)---时序

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

随机推荐

  1. AngularJS(4)-服务(Service)

    1.$location服务 $location 服务,它可以返回当前页面的 URL 地址 2.$http服务 $http 是 AngularJS 应用中最常用的服务. 服务向服务器发送请求,应用响应服 ...

  2. 使用PHP导出Word文档的原理和实例

    PHP操作Word文档的方法有很多,这里再为大家提供一种方法. 原理   一般,有2种方法可以导出doc文档,一种是使用com,并且作为php的一个扩展库安装到服务器上,然后创建一个com,调用它的方 ...

  3. C99标准中的部分新特性

    我有点怀疑我会不会C语言了. 1.变长数组(VLA) ; scanf("%d", &n); int arr[n]; 2.数组初始化 ] = {[] = , [] = , [ ...

  4. Extjs 更新数据集Ext.PagingToolbar的start参数重置的处理

    问题:当翻页后,比如当前是第二页,start参数此时是5(初始为0),当切换左侧分类时,我们期望的是从所选分类下明细记录的第一条开始显示,结果发现不是这样,依然是从新数据的第二页开始显示,就是说ext ...

  5. Oracle删除所有表

    Oracle 清理用户所有的表 PLSQL中执行语句 select 'drop '||object_type||' '||object_name||';' from user_objects; 结果集 ...

  6. 分别取商和余数:divmod(a, b)

    使用函数:divmod(a, b)可以实现分别取商和余数的操作: >>> divmod(123,3) (41, 0) >>> divmod(200,6) (33, ...

  7. 从某一日期开始过day天的日期

    一个SX问我的,我就写了写......从2010.1.1开始,给了一组测试数据3的话输出2010.1.4星期1,所以说2010.1.1是星期五,总星期就是 (day+5)%7==0?7:(day+5) ...

  8. c#中virtual, abstract和override的区别和用法

    virtual是把一个方法声明为虚方法,使派生类可重写此方法,一般建立的方法是不能够重写的,譬如类A中有个方法protected void method(){ 原代码....;}类B继承自类A,类B能 ...

  9. MySQL JDBC的setFetchSize

    MySQL JDBC的setFetchSize http://uuhorse.iteye.com/blog/2163582 http://blog.sina.com.cn/s/blog_6706203 ...

  10. android activity在横竖屏切换的时候不重新调用onCreate方法

    在安卓系统中,横竖屏切换会默认重新调用onCreate等生命周期方法,如果此时有一些临时数据没有保存下来,很有可能会导致该数据丢失. 因此我们可以进行以下设置,来避免恒切换时重新调用onCreate方 ...