历史上的今天
返回首页

历史上的今天

今天是:2025年04月22日(星期二)

正在发生

2019年04月22日 | I2C接口总结

2019-04-22 来源:eefocus

1 I2C总线的特点

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


2 I2C串行总线概述

I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。

I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。



I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。



每个接到I2C总线上的器件都有唯一的地址。主机与其他器件间的数据传送可以是由主机发送数据到其他器件,这时主机即为发送器。由总线上接收数据的器件即为接收器。


在多主机系统中,可能同时有几个主机企图启动总线传送数据。为了避免混乱,I2C总线要通过总线仲裁,以决定由哪一台主机控制总线。


3 总线的数据传输


3.1 数据位的有效性规定


I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。



3.2 起始和终止信号


SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。



起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。


连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号。对于不具备I2C总线硬件接口的有些单片机来说,为了检测起始和终止信号,必须保证在每个时钟周期内对数据线SDA采用两次。


接收器件收到一个完整的数据字节后,有可能需要完成一些其他工作,如处理内部中断服务等,可能无法立刻接收下一个字节,这时接收器件可以将SCL线拉成低电平,从而使主机处于等待状态。直到接收器件准备好接收下一个字节时,再释放SCL线使之为高电平,从而使数据传送可以继续进行。


3.3 数据传输格式


3.3.1 字节传送和应答


每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。



由于某种原因从机不对主机寻址信号应答时(如从机正在进行实时性的处理工作而无法接收总线上的数据),它必须将数据置于高电平,而由主机产生一个终止信号以结束总线的数据传送。


如果从机对主机进行了应答,但在数据传送一段时间后无法继续接收更多的数据时,从机可以通过对无法接收的第一个数据字节的“非应答”通知主机,主机则应发出终止信号以结束数据的继续发送。


当主机接收数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。这个信号是由对从机的“非应答”来实现的。然而,从机释放SDA线,以允许主机产生终止信号。


3.3.2  数据帧格式


I2C总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。


在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/),用“0”表示主机发送数据(T),“1”表示主机接收数据(R)。每次数据传送总是由主机产生的终止信号结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发起起始信号对另一从机进行寻址。


在总线的一次数据传送过程中,可以有以下几种组合方式:


    (1) 主机向从机发送数据,数据传送方向在整个传送过程中不变



注:有阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送。A表示应答,表示 非应答(高电平)。S表示起始信号,P表示终止信号。


(2)主机在发送完第一个字节后,立即读取从机数据



(3)在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正 好反向;



3.4总线的寻址


I2C总线协议有明确的规定:采用7位的寻址字节(寻址字节是起始信号后的第一个字节)。


3.4.1 寻址字节定义



D7~D1位组成从机的地址。D0位是数据传送方向位,为“0”时表示主机向从机写数据,为“1”时表示主机由从机读数据。


主机发送地址时,总线上的每个从机都将这7位地址与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据R/位将自己确定为发送器或接收器。


从机的地址由固定部分和可编辑部分组成。在一个系统中可能希望接入多个相同的从机,从机地址中可编程部分决定了可接入总线该类器件的最大数目。如一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个同样的器件,即可以有8个同样的器件接入到该I2C总线系统中。


3.4.2 寻址字节中特殊地址


固定地址编号0000和1111已被保留作为特殊用途



起始信号后的第一字节的8位为“0000 0000”时,称为通用呼叫地址。通用呼叫地址的用意在第二字节中加以说明。格式为:



第二字节为06H时,所有能响应通用呼叫地址的从机器件复位,并由硬件装入从机地址的可编程部分。能响应命令的从机器件复位时不拉低SDA和SCL线,以免堵塞总线。


第二字节为04H时,所有能响应通用呼叫地址并通过硬件来定义其可编程地址的从机器件将锁定地址中的可编程位,但不进行复位。


如果第二字节的方向位B为“1”,则这两个字节命令称为硬件通用呼叫命令。


在这第二字节的高7位说明自己的地址。接在总线上的智能器件,如单片机或其他微处理器能识别这个地址,并与之传送数据。硬件主器件作为从机使用时,也用这个地址作为从机地址。格式为:




在系统中另一种选择可能是系统复位时硬件主机器件工作在从机接收器方式,这时由系统中的主机先告诉硬件主机器件数据应送往的从机器件地址,当硬件主机器件要发送数据时就可以直接向指定从机器件发送数据了。



推荐阅读

史海拾趣

BERGQUIST公司的发展小趣事

随着产品技术的不断成熟和市场的逐步认可,BERGQUIST公司开始积极拓展市场。公司不仅在国内市场取得了显著成绩,还积极开拓国际市场,与众多知名电子企业建立了长期合作关系。通过不断提升产品质量和服务水平,BERGQUIST成功树立起了自己的品牌形象,成为热管理领域的佼佼者。

Brite-Led Optoelectronics Inc公司的发展小趣事

在国内市场取得一定成绩后,Brite-Led开始将目光投向海外市场。公司制定了一系列市场拓展策略,包括参加国际展会、建立海外销售网络、与当地企业合作等。经过几年的努力,Brite-Led的产品逐渐打入国际市场,赢得了众多海外客户的青睐。同时,公司也在全球范围内建立了多个研发中心和生产基地,以更好地服务全球客户。

BUSSMANN公司的发展小趣事

随着汽车工业的快速发展,对熔断器的需求也急剧增加。Bussmann五兄弟敏锐地抓住了这一市场机遇,开始专注于汽车熔断器的研发和生产。他们深入研究汽车电路的特点,不断优化熔断器的设计和性能,使其能够更好地适应汽车的工作环境。凭借这一创新,Bussmann的汽车熔断器迅速占领了市场,为公司的发展奠定了坚实的基础。

DREMEL公司的发展小趣事

Dremio公司深知人才对于企业发展的重要性。因此,他们积极投资教育领域,支持数据科学和数据分析人才的培养。他们与多所高校合作,设立奖学金和实习项目,鼓励学生参与数据治理和云数据湖领域的研究和实践。同时,Dremio还建立了一个活跃的社区平台,为数据湖实践者提供交流和学习的机会。这些举措不仅为Dremio公司吸引了大量优秀人才,也推动了整个电子行业的发展。

Gennum ( Semtech )公司的发展小趣事
确保电路中的元件不会因过热而损坏或引发火灾。可以使用散热片、风扇等散热设备来降低元件温度。
中科银河芯(GXCAS)公司的发展小趣事
为了使三极管进入饱和区,需要给基极提供足够的电流。

问答坊 | AI 解惑

那个一个没有任何资料的液晶,如何调通

file:///C:/Documents%20and%20Settings/Administrator.79E68F10112A456/桌面/100_PANA/1.bmp老板今天扔给我一个液晶,说什么资料都没有! [ 本帖最后由 yjj 于 2009-8-12 13:25 编辑 ]…

查看全部问答>

这里有个小程序PIC12C508的,可能看有什么问题?

#include __CONFIG (INTRC & PROTECT & MCLREN & WDTEN); const unsigned char cs @ 0x1FF; void DelayUs( int  x)    // 32US {while(--x!=0)   { CLRWDT();     NOP();     unsigned ...…

查看全部问答>

瞬时无功理论谐波检测方法

瞬时无功理论谐波检测方法的资料下载,免费贡献给大家…

查看全部问答>

触摸屏控制器

最近要作一款控制器是TSC2006的触摸屏的驱动!请问和ADS7846控制器有什么区别!可以通用吗!如果有区别请大哥们描述的详细点!…

查看全部问答>

张帆的驱动开发群

我建了个驱动开发群,QQ群:11312034 本人是《Windows驱动开发技术详解》的作者张帆,希望一起交流。 …

查看全部问答>

高手帮忙解释一下定时器的时间怎么算的?!

比如下面这段代码:void main(void){WDTCTL = WDTPW + WDTHOLD; //停止看门狗定时器P1DIR |= 0x01; // 设P1.0为输出//TA1CTL = RT1SSEL_0 + MC_2 + TAIE; // ACLK, 定时器A计数模式,且开中断功能TA1CTL=TASSEL_2+ID_3+MC_1; //SMCLK(8KHZ). 8分频 ...…

查看全部问答>

反激式开关电源求助

小弟第一次做电源。是做反激电源。 下面是原理图和PCB图。但是不知道为什么总是不行。   UC3842总是达不到16V,而且单独给UC3842供电的话,有的时候3,6脚的波形都不对。 电阻,电容的值都是根据网上的材料来的。 求大虾,指导!…

查看全部问答>

2602型源表进行LIV测试扫描

正向电压测试 正向电压(VF)测试对激光二极管的正向直流特性进行校验,测量时扫描电流IF,测量激光二极管上的电压降。 一些大功率激光二极管可能要求电流扫描范围达到2~3A,步长一般在1mA。更多情况下,一般电流扫描至1A,步长为0.5mA或0.25mA。 ...…

查看全部问答>

c语言中数组初始化要用static ?求解释...

我正在看东南大学凌明老师的,  里面讲字符指针变量与字符数组的区别时提到, \"对数组初始化要用static, 对指针变量不用.\" 我自己在写程序时从来没有在数组初始化时前面加static呀...所以我很困惑...求达人解释…

查看全部问答>