《I2C串行接口技术课件.ppt》由会员分享,可在线阅读,更多相关《I2C串行接口技术课件.ppt(52页珍藏版)》请在三一办公上搜索。
1、串行接口技术,I2C串行总线I2C串行总线是Philips公司提出的一种板内芯片间串行总线。它用两根连线即可方便地实现外围器件扩展。I2C总线上数据传送的基本单位为字节,采用高位在前的格式。主从器件之间一次传输的数据称为一帧,由启动信号、若干个数据字节和应答位以及停止信号组成。,第6章 串行接口技术,I2C串行总线原理与应用 串行单总线原理与应用 串行模/数转换器 I2C总线键盘/显示器接口芯片ZLG7290 I2C总线串行8位数/模转换器MAX517 基于I2C总线的ADS1100型16位模/数转换器,I2C串行总线原理与应用,I2C串行总线的组成与工作原理 I2C串行总线的接口设计 I2C
2、串行总线器件 应用举例 实践与思考,I2C串行总线的组成与工作原理,I2C串行总线的基本特性I2C总线的数据传送,I2C串行总线的基本特性,I2C总线是Philips公司推出的一种串行总线,是具备多主机系统所需的包括总线仲裁和高低速器件同步功能的高性能串行总线。它具有如下基本特性。,I2C串行总线只有两根双向信号线I2C总线是一个多主机总线I2C总线的SDA和SCL是双向的,均通过上拉电阻接正电源I2C总线的总线仲裁,I2C串行总线只有两根双向信号线,一根是数据线SDA,另一根是时钟线SCL。所有连接到I2C总线上的器件的数据线都接到SDA线上,各器件的时钟线均接到SCL线上。I2C总线的基本
3、结构如图所示。,I2C总线是一个多主机总线,总线上可以有一个或多个主机,总线运行由主机控制。这里所说的主机是指启动数据的传送(发起始信号)、发出时钟信号、传送结束时发出终止信号的器件。通常,主机由各种单片机或其他微处理器充当。被主机寻访的器件叫从机,它可以是各种单片机或其他微处理器,也可以是其他器件,如存储器、LED或LCD驱动器、A/D或D/A转换器、时钟日历器件等。,I2C总线的SDA和SCL是双向的均通过上拉电阻接正电源,如图所示,当总线空闲时,两根线均为高电平。连到总线上的器件(相当于结点)的输出级必须是漏极或集电极开路的,任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及
4、SCL都是线“与”关系。SCL线上的时钟信号对SDA线上各器件间数据的传输起同步作用。SDA线上数据的起始、终止及数据的有效性均要根据SCL线上的时钟信号来判断。,在标准I2C普通模式下,数据的传输率为100Kbps,高速模式下可达400Kbps。连接的器件越多,电容值越大,总线上允许的器件数以总线上的电容量不超过400pF为限。,I2C总线的总线仲裁,在多主机系统中,可能同时有几个主机企图启动总线传送数据。为了避免混乱,I2C总线要通过总线仲裁,以决定由哪一台主机控制总线。首先,不同主器件(欲发送数据的器件)分别发出的时钟信号在SCL线上“线与”产生系统时钟:其低电平时间为周期最长的主器件的
5、低电平时间,高电平时间则是周期最短主器件的高电平时间。仲裁的方法是:各主器件在各自时钟的高电平期间送出各自要发送的数据到SDA线上,并在SCL的高电平期间检测SDA线上的数据是否与自己发出的数据相同。,I2C总线的数据传送,数据位的有效性规定 起始和终止信号数据传送格式 I2C总线的时序特性 I2C总线的寻址,数据位的有效性规定,I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定。只有在时钟线上的信号为低电平期间,数据线上的高电平或低电工状态才允许变化,如图所示。,起始和终止信号,根据I2C总线协议的规定,SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号
6、;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。起始和终止信号如图所示。,数据传送格式,(1)字节传送与应答,利用I2C总线进行数据传送时,传送的字节数是没有限制的,但是每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位),如图所示:,应答时序图,数据传送格式,(2)数据帧格式,在总线的一次数据传送过程中,可以有以下几种组合方式:,主机向从机发送数据,数据传送方向在整个传送过程中不变。,主机在第一个字节后,立即由从机读数据。,在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两
7、次读/写方向位正好反向。,注:有阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送。A表示应答,表示非应答(高电平)。S表示起始信号,P表示终止信号。,I2C总线的时序特性,为了保证数据传送的可靠性,标准I2C总线的数据传送有严格的时序要求。I2C总线的起始信号、终止信号、发送“0”及发送“1”的模拟时序如图所示。,典型信号时序图,I2C总线的时序特性,下表为I2C总线的时序特性。由表可见,除了SDA、SCL线的信号下降时间为最大值外,其他参数只有最小值。这表明在I2C总线的数据传送中,可以利用时钟同步机制展宽低电平周期,迫使主器件处于等待状态,使传送速率降低。,I2C总线
8、的寻址,I2C总线协议有明确的规定:采用7位的寻址字节(寻址字节是起始信号后的第一个字节)。,(1)寻址字节的位定义,D7D1位组成从机的地址。D0位是数据传送方向位,为“0”时表示主机向从机写数据,为“1”时表示主机由从机读数据。主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据R/W位将自己确定为发送器或接收器。从机的地址由固定部分和可编程部分组成。在一个系统中可能希望接入多个相同的从机,从机地址中可编程部分决定了可接入总线该类器件的最大数目。如一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个同样的器件,即可以有
9、8个同样的器件接入到该I2C总线系统中。,I2C总线的寻址,(2)寻址字节中的特殊地址,总线规定了一些特殊地址。其中两组固定地址编号0000和1111已被保留作为特殊用途,如表所示。,I2C总线的寻址,起始信号后第一字节的8位为“0000 0000”时,称为通用呼叫地址,即用于寻访接到I2C总线上所有器件的地址。通用呼叫地址的用意在第二字节中加以说明。格式为:,第二字节为06H时,所有能响应通用呼叫地址的从机器件复位,并由硬件装入从机地址的可编程部分。能响应命令的从机器件复位时不拉低SDA和SCL线,以免堵塞总线。,第二字节为04H时,所有能响应通用呼叫地址并通过硬件来定义其可编程地址的从机器
10、件将锁定地址中的可编程位,但不进行复位。如果第二字节的方向位B为“1”,则这两个字节命令称为硬件通用呼叫命令。也就是说这是由“硬件主器件”发出的。,I2C总线的寻址,所谓硬件主器件,就是不能发送所要寻访从器件地址的发送器,如键盘扫描器等。制造这种器件时无法知道信息应向哪儿传送,所以,它发出硬件呼叫命令,在这第二字节的高7位说明自己的地址。接在总线上的智能器件,如单片机或其他微处理器能识别这个地址,并与之传送数据。硬件主器件作为从机使用时,也用这个地址作为从机地址。格式为:,在系统中另一种选择可能是系统复位时硬件主机器件工作在从机接收器方式,这时由系统中的主机先告诉硬件主机器件数据应送往的从机器
11、件地址,当硬件主机器件要发送数据时,就可以直接向指定从机器件发送数据了。,I2C总线的寻址,(3)起始字节,起始字节是提供给没有I2C总线接口的单片机查询I2C总线时使用的特殊字节。于是单片机的速度与硬件接口器件的速度存在较大的差别,因此I2C总线上的数据传送要由一个较长的起始过程加以引导,如图所示。,起始引导字节,I2C串行总线的接口设计,I2C串行总线的接口设计分两种情况:一种是单片机自身带有I2C总线硬件接口,另一种是早期单片机不含I2C总线硬件接口。Philips公司推出的P89C66X系列单片机内含I2C总线逻辑,提供了符合I2C总线规范的串行接口,具有性能稳定、速度快、使用方便等优
12、点;而Philips公司推出的P8XC552、P8XC654以及P8XC652系列单片机不具有I2C总线逻辑,在外接I2C总线接口器件,需要模拟实现。,P89C66X系列单片机I2C总线接口 I2C总线模拟硬件接口软件设计,P89C66X系列单片机I2C总线接口,1.引脚设计,P89C66X系列单片机有44脚PLCC和LQFP两种封装,其中P1.6/SCL和P1.7/SDA分别为I2C总线的时钟线和数据线,且因为芯片内部采用漏级开路工艺,所以当用户将这两个引脚用做I2C总线接口时,需外接上拉电阻,如图所示。,P89C66X系列单片机I2C总线接口引脚图,P89C66X系列单片机I2C总线接口,
13、2.P89C66X系列单片机I2C总线的控制寄存器,P89C66X系列单片机内部与I2C总线有关的寄存器共有4个,通过对这4个寄存器的编程实现I2C总线功能,如表所示:,地址寄存器(S1ADR),该寄存器用于保存单片机本身的从地址,CPU可以对该寄存器进行读写操作。其中高7位为地址本身,最低位为通用地址识别标志GC。当单片机作为主器件存在时,该寄存器不起作用;当单片机作为从器件存在的时候,接收到的地址字节的高7位将与S1ADR的值相比较,如果相同则接收后面的数据信息。此外,如果通用地址识别标志GC为0,单片机不识别通用调用地址(如广播地址);GC为1时,单片机识别通用调用地址。,控制寄存器(S
14、1CON),该寄存器用于对I2C总线进行设置,各功能位含义如下:,ENS1:I2C总线使能位。当ENS1为0时,SDA和SCL输出为高阻状态;当ENS1为1时,I2C总线使能。STA:I2C总线起始条件标志位。当STA为0时,单片机不产生起始条件,当STA为1时,单片机首先利用硬件检测I2C总线状态。STO:I2C总线停止条件标志位。当STO为0时,单片机不产生停止条件;当STO为1时,如果单片机处于主模式,则立刻向I2C总线发送停止条件,如果单片机处于从模式,则可以从错误条件中恢复出来。STO位可由硬件清零。,控制寄存器(S1CON),SI:串行中断标志位。当SI标志位置位,并且EA和ES1
15、都置位时,产生一个中断请求。单片机就可以对接收到的数据进行处理,处理完成后,SI必须由软件清零。AA:声明应答标志位。当AA为1时,如果器件接收到自身的从地址(或广播地址),或者接收到一个完整的数据字节之后,将会在SCL的响应时钟脉冲期间保持SDA为低电平,即发送应答信号。当AA为0时,器件接收到一个完整的数据字节之后,在SCL的响应时钟脉冲期间保持SDA为高电平,即发送非应答信号。CR0、CR1和CR2:串行时钟速率选择位。这3位决定了器件在主模式下的串行时钟速率,其值与单片机工作频率有关,如下表所示。,控制寄存器(S1CON),I2C总线串行时钟速率选择,速率单位:kHz,状态寄存器(S1
16、STA),状态寄存器S1STA用于显示当前I2C总线的状态,该寄存器是只读的。寄存器的低3位始终为0,高5位为总线状态编码。总线共有26种可能的状态。每种状态都有一种固定的状态编码。总线每进入一个状态都会产生串行中断请求,并将SI置位,SI置位一个机器周期后,当前S1STA中代码有效。在SI由软件复位的一个机器周期之后,此代码仍然存在。,P89C66X系列单片机I2C总线接口的软件设计,(1)主模式程序设计。主模式程序设计包括以下几项:,申请占用总线;发送一个数据字节;向无子地址器件发送单字节数据;向无子地址读字节数据;向有子地址器件发送和接收多字节数据。,(2)从模式程序设计。从模式程序设计
17、包括:,设置总线;发送字节数据;接收字节数据。,3.P89C66X系列单片机I2C总线接口的软件设计,I2C总线模拟硬件接口软件设计,使用硬件接口进行I2C总线设计,要使用具有I2C总线硬件接口的单片机。对通常的单片机,要支持I2C总线,可以选择外接I2C总线芯片,但这要增加系统的整体成本,另一种解决方案是使用软件模拟,使用程序控制实现I2C总线的时序。首先可定义P1口任意两个引脚作为单片机I2C总线的SCL和SDA,然后再编程实现I2C功能。下面介绍一个主方式下的虚拟I2C总线软件包。,汇编软件包说明 软件包程序清单,汇编软件包说明,虚拟I2C总线操作平台软件包是用在单主I2C总线上,硬件接
18、口是SCL、SDA,使用单片机的I/O口来模拟SCL/SDA总线。根据I2C总线器件的特点,设计无子地址和有子地址子程序。,(1)软件包文件名。软件包文件名是VI2C_ASM.ASM,是I2C总线应用程序的底层子程序,使用前要定义好SCL和SDA。在标准80C51模式下,时钟频率不高于12MHz,若高于12MHz,则在程序中要相应增加NOP指令数。使用本软件包时,只需在程序的末尾加上$INCLUDE(VI2C_ASM.ASM)即可。(2)软件包的接口界面。IRDBYTE 无子地址读单字节数据(现行地址读)IWRBYTE 无子地址写单字节数据(现行地址写)IRDNBYTE 有子地址读N字节数据I
19、WRNBYTE 有子地址写N字节数据说明:现行地址读/写是专指无子地址的器件,不需给定子地址的读/写操作。,汇编软件包说明,(3)软件包占用的内部资源。R0、R1、R2、R3、ACC、CY。(4)使用前需定义的变量、常量。变量:SLA(器件从地址)、SUBA(器件子地址)、NUMBYTE(读/写的字节数)、ACK(位变量,从器件的应答标志,ACK为0表示从器件无应答)。常量:SDA与SCL总线接口位、MTD(发送数据缓冲区首址)、MRD(接收数据缓冲区首址)。,软件包程序清单,(1)启动I2C总线子程序(2)结束总线子程序(3)发送应答信号子程序(4)发送非应答信号(5)检查应答位子程序(6)
20、发送字节子程序(7)读取字节子程序(8)无子地址器件写字节数据(9)无子地址器件读字节数据(10)向器件指定子地址写N个数据(11)向器件指定子地址读取N个数据,启动I2C总线子程序,START:SETB SDA NOP SETB SCL;起始条件建立时间大于4.7s NOP NOP NOP NOP NOP CLR SDA NOP;起始条件锁定时大于4s NOP NOP NOP NOP CLR SCL;钳住总线,准备发送数据 NOP RET,结束总线子程序,STOP:CLR SDA NOP SETB SCL;发送结束条件的时钟信号 NOP;结束总线时间大于4s NOP NOP NOP NOP
21、SETB SDA;结束总线 NOP;保证一个终止信号和起始信号的空闲时间大于4.7s NOP NOP NOP RET,发送应答信号子程序,MACK:CLR SDA;将SDA置0 NOP NOP SETB SCL NOP;保持数据时间,即SCL为高时间大于4.7s NOP NOP NOP NOP CLR SCL NOP NOP RET,发送非应答信号,MNACK:SETB SDA;将SDA置1 NOP NOP SETB SCL NOP NOP;保持数据时间,即SCL为高时间大于4.7s NOP NOP NOP CLR SCL NOP NOP RET,检查应答位子程序,;返回值,ACK=1时表示有
22、应答CACK:SETB SDA NOP NOP SETB SCL CLR ACK NOP NOP MOV C,SDA JC CEND SETB ACK;判断应答位CEND:NOP CLR SCL NOP RET,发送字节子程序,;字节数据放入ACC;每发送一字节要调用一次CACK子程序,取应答位 WRBYTE:MOV R0,#08HWLP:RLC A;取数据位 JC WR1 SJMP WR0;判断数据位WLP1:DJNZ R0,WLP NOP RETWR1:SETB SDA;发送1 NOP SETB SCL NOP NOP NOP NOP NOP,NOP NOP NOP CLR SCL SJM
23、P WLP1WR0:CLR SDA;发送0 NOP SETB SCL NOP NOP NOP NOP NOP CLR SCL SJMP WLP1,读取字节子程序,;读出的值在ACC内;每取一字节要发送一个应答/非应答信号 RDBYTE:MOV R0,#08HRLP:SETB SDA NOP SETB SCL;时钟线为高,接收数据位 NOP NOP MOV C,SDA;读取数据位 MOV A,R2 CLR SCL;将SCL拉低,时间大于4.7s RLC A;进行数据位的处理 MOV R2,A NOP NOP NOP DJNZ R0,RLP;未够8位,再来一次 RET,无子地址器件写字节数据,;入
24、口参数:数据为ACC、器件从地址SLA;占用:A、R0、CYIWRBYTE:PUSH ACCIWBLOOP:LCALL START;起动总线 MOV A,SLA LCALL WRBYTE;发送器件从地址 LCALL CACK JNB ACK,RETWRB;无应答则跳转 POP ACC;写数据 LCALL WRBYTE LCALL CACK LCALL STOP RETRETWRB:POP ACC LCALL STOP RET,无子地址器件读字节数据,;入口参数:器件从地址SLA;出口参数:数据为ACC;占用 A、R0、R2、CYIRDBYTE:LCALL START MOV A,SLA;发送器
25、件从地址 INC A LCALL WRBYTE LCALL CACK JNB ACK,RETRDB LCALL RDBYTE;进行读字节操作 LCALL MNACK;发送非应信号RETRDB:LCALL STOP;结束总线 RET,向器件指定子地址写N个数据,;入口参数:器件从地址SLA、器件子地址SUBA、发送数据缓冲区MTD、发送字节数NUMBYTE;占用:A、R0、R1、R3、CY IWRNBYTE:MOV A,NUMBYTE MOV R3,A LCALL START;起动总线 MOV A,SLA LCALL WRBYTE;发送器件从地址 LCALL CACK JNB ACK,RETWR
26、N;无应答则退出 MOV A,SUBA;指定子地址 LCALL WRBYTE LCALL CACK MOV R1,#MTD,WRDA:MOV A,R1 LCALL WRBYTE;开始写入数据 LCALL CACK JNB ACK,IWRNBYTE;无应答重新开始 INC R1 DJNZ R3,WRDA;判断写完没有RETWRN:LCALL STOP RET,向器件指定子地址读取N个数据,;入口参数:器件从地址SLA、器件子地址SUBA、接收字节数NUMBYTE;出口参数:接收数据缓冲区MTD;占用:A、R0、R1、R2、R3、CY IRDNBYTE:MOV R3,NUMBYTE LCALL S
27、TART MOV A,SLA LCALL WRBYTE;发送器件从地址 LCALL CACK JNB ACK,RETRDN MOV A,SUBA;指定子地址 LCALL WRBYTE LCALL CACK LCALL START;重新起动总线 MOV A,SLA INC A;准备进行读操作 LCALL WRBYTE LCALL CACK JNB ACK,IRDNBYTE MOV R1,#MRD,向器件指定子地址读取N个数据,RDN1:LCALL RDBYTE;读操作开始 MOV R1,A DJNZ R3,SACK LCALL MNACK;最后一字节发非应答位 RETRDN:LCALL STOP
28、;并结束总线 RETSACK:LCALL MACK;发应答信号 INC R1 SJMP RDN1,I2C串行总线器件,带有I2C总线接口的单片机外围接口芯片,主要产品如表所示。虽然各种器件的原理和功能有很大的差异,但它们与单片机的连接是相同的,各种器件与单片机的连接如图所示。,常用I2C总线器件,连接图,串行E2PROM典型产品,AT24C系列的引脚设置如图所示,其型号与容量的关系为:,AT24CXX引脚图,AT24C01:128字节(1288位);AT24C02:256字节(2568位);AT24C04:512字节(5128位);AT24C08:1K字节(1K8位);AT24C16:2K字节
29、(2K8位)。,写入过程,AT24C系列E2PROM芯片地址的固定部分为1010,A2、A1、A0引脚接高、低电平后得到确定的3位编码,形成的7位编码即为该器件的地址码。单片机进行写操作时,首先发送该器件的7位地址码和写方向位“0”(共8位,即一个字节),发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为响应,单片机收到应答后就可以传送数据了。传送数据时,单片机首先发送被写入器件的存储区的首地址。收到存储器器件的应答后,单片机就逐个发送各数据字节,但每发送一个字节后都要等待应答。AT24C系列器件片内地址在接收到每一个
30、数据字节地址后自动加1,在芯片的“一次装载字节数”(不同芯片字节数不同)限度内,只需输入首地址。装载字节数超过芯片的“一次装载字节数”时,数据地址“上卷”,即前面的数据将被覆盖。当要写入的数据传送完后,单片机应发出终止信号以结束写入操作。写入n个字节的数据格式如下所示:,读出过程,单片机进行读操作时,首先发送该器件的7位地址码和写方向位“0”(“伪写”),发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为响应。然后,单片机再发送要读出器件的存储区的首地址。收到存储器器件的应答后,单片机要重复一次起始信号并发出器件地址和
31、读方向位(“1”),收到器件应答后就可以读出数据字节。每读出一个字节,单片机都要回复应答信号。当最后一个字节数据读完后,单片机应返回以“非应答”(高电平),并发出终止信号以结束读出操作。读出n个字节的数据格式如下所示:,应用举例,1.程序功能,从PCF8754 8位I/O口读取输入命令字,再根据命令字做如下操作。(1)若为FFH,则从PCF8754 8位I/O口输入地址,再根据此地址从ATC2402 中读取数据,再将读取存储器的地址和数据送SAA1064 4位LED显示,LED1、LED2显示地址,LED3、LED4显示读出的数据。(2)若为00H,则写ATC2402 E2PROM。(3)其他值,则进行I/O测试。,2.第(1)部分程序程序清单,实践与思考,1.按应用实例构建硬件系统,编辑、下载与运行程序,调试电路。2.设计一个校园打铃系统。(1)功能要求。采用图形LCD显示日期、时间与星期,且有节日显示标志。有温度检测功能。可设置30组闹铃时间。从AT24Wxx系列芯片中,选择一款合适的芯片作为闹铃时间数据的存储单元。(2)实践要求。撰写工程设计报告。制作电路,并调试电路。,