1、总线是由总线是由Philips公司于公司于20世纪世纪80年代提出的串行通讯接口规年代提出的串行通讯接口规范,使用两条线范,使用两条线串行数据线串行数据线(SDA)、串行时钟线、串行时钟线(SCL)在连接在连接到该总线上的器件之间传送信息。总线上的每个器件均可设置一唯到该总线上的器件之间传送信息。总线上的每个器件均可设置一唯一地址,并能根据所设的功能起到发送器或接收器的作用。除了作一地址,并能根据所设的功能起到发送器或接收器的作用。除了作为发送器和接收器,在执行数据传输时,器件还可以设定为主控器为发送器和接收器,在执行数据传输时,器件还可以设定为主控器和被控器。由主控器和被控器。由主控器(简称
2、主机简称主机)启动总线上的数据传输,并产生数启动总线上的数据传输,并产生数据传输所需的时钟信号。此时,任何被其寻址的器件均为被控器据传输所需的时钟信号。此时,任何被其寻址的器件均为被控器(从机从机),这意味着多个有能力控制总线的器件都可以连接到总线上。,这意味着多个有能力控制总线的器件都可以连接到总线上。总线进行数据传送时,时钟信号总线进行数据传送时,时钟信号SCL为高电平期间,数据为高电平期间,数据线线SDA上的信号必须保持稳定,只有在上的信号必须保持稳定,只有在SCL上的信号为低电平时,上的信号为低电平时,SDA上的电平才允许发送变化。上的电平才允许发送变化。l 起始和终止信号都由主机发出
3、。在起始信号产生后,总线处于被起始和终止信号都由主机发出。在起始信号产生后,总线处于被占用的状态;在终止信号产生后,总线处于空闲状态。占用的状态;在终止信号产生后,总线处于空闲状态。l 接收器件接收到一个完整的字节后,有可能需要完成一些其它工接收器件接收到一个完整的字节后,有可能需要完成一些其它工作,如处理内部中断服务等,可能无法立即接收下一个字节,这时作,如处理内部中断服务等,可能无法立即接收下一个字节,这时接收器可以将接收器可以将SCL线拉成低电平,从而使主机处于等待状态,直到线拉成低电平,从而使主机处于等待状态,直到接收器准备好接收下一个字节时,再释放接收器准备好接收下一个字节时,再释放
4、SCL线使之为高,从而使线使之为高,从而使数据传送继续进行。数据传送继续进行。每一个字节必须保证每一个字节必须保证8位长度。数据传送时,先传最高位位长度。数据传送时,先传最高位(MSB),每一个被传送的字节后面都必须跟随一个应答位。,每一个被传送的字节后面都必须跟随一个应答位。l 如果从机由于某种原因不对主机寻址信号进行应答时,它必须将如果从机由于某种原因不对主机寻址信号进行应答时,它必须将SDA线置高,而由主机产生一个终止信号以结束总线的数据传送。线置高,而由主机产生一个终止信号以结束总线的数据传送。l 如果从机应答了主机,接着便开始数据传送。假如数据传送一段如果从机应答了主机,接着便开始数
5、据传送。假如数据传送一段时间后从机无法继续接收数据时,从机通过对无法接收的第一个数时间后从机无法继续接收数据时,从机通过对无法接收的第一个数据字节的据字节的“非应答非应答”通知主机,主机则发出终止信号以结束数据传通知主机,主机则发出终止信号以结束数据传送。送。l 总线上传送的数据信号,既包括地址信号,又包括真正总线上传送的数据信号,既包括地址信号,又包括真正的数据信号,都必须是整数字节。的数据信号,都必须是整数字节。l 起始信号后必须传送一个从机地址起始信号后必须传送一个从机地址(7bit)+数据传送方向位数据传送方向位(1bit),其中,其中0表示主机发、表示主机发、1表示主机收。每次数据传
6、送表示主机收。每次数据传送总是由主机产生的终止信号结束。总是由主机产生的终止信号结束。l 若主机希望继续占用总线进行新的数据传送,可以不产生若主机希望继续占用总线进行新的数据传送,可以不产生终止信号,马上再次发出起始信号终止信号,马上再次发出起始信号+地址信号,对另一从机进地址信号,对另一从机进行寻址。行寻址。a、主机向从机发送数据,数据传送方向在整个传送、主机向从机发送数据,数据传送方向在整个传送过程中不变:过程中不变:b、主机在第一个字节后立即从从机读数据、主机在第一个字节后立即从从机读数据c、在传送过程中,当需要改变传送方向时,起始信、在传送过程中,当需要改变传送方向时,起始信号和从机地
7、址都被重复产生一次,但两次读写方向号和从机地址都被重复产生一次,但两次读写方向正好相反。正好相反。l 主机发送地址时,总线上的每个从机都把这主机发送地址时,总线上的每个从机都把这7位地址与自己位地址与自己的地址比较,如果相同,则认定自己正被主机寻址,根据的地址比较,如果相同,则认定自己正被主机寻址,根据R/T位来确定自己是发送或接收数据。位来确定自己是发送或接收数据。l 从机的地址由固定部分和可编程部分组成。在一个系统中从机的地址由固定部分和可编程部分组成。在一个系统中可能希望接入多个相同从机,从机地址中可编程部分决定了可能希望接入多个相同从机,从机地址中可编程部分决定了可接入总线的该类器件的
8、最大数目。如果一个从机的可接入总线的该类器件的最大数目。如果一个从机的7位寻址位寻址位有位有4位固定,位固定,3位可编程的话,则该位可编程的话,则该I2C总线系统中可以接入总线系统中可以接入的相同器件不超过的相同器件不超过8个。个。(2)寻址字节中的特殊地址)寻址字节中的特殊地址 固定地址编号固定地址编号0000和和1111已被保留作为特殊已被保留作为特殊用途。用途。引导过程由起始信号、起始字节、应答位、引导过程由起始信号、起始字节、应答位、重复起始信号(重复起始信号(Sr)组成。)组成。I2C总线在总线在8051单片机上的实现单片机上的实现部分部分51单片机固化单片机固化I2C接口,如接口,
9、如8XC552等,对于没有等,对于没有I2C总线的单片机,有两种方法:总线的单片机,有两种方法:1)可使用扩展器件可使用扩展器件PCD8584扩展出扩展出I2C总线接口;总线接口;2)采用软件模拟采用软件模拟I2C总线总线的时序来完成接口功能,下图是采用方法的时序来完成接口功能,下图是采用方法2)的典型电路的典型电路连接结构。连接结构。80C51I2C器件器件R1R2P1.0P1.1SCL SDAVCCSDA BIT P1.0SCL BIT P1.1BSTART:SETB SDA;Make sure data is highSETB SCL;Set clock highNOPNOPCLR SD
10、A;Down edge occurs on SDA during high clock for START NOPNOPCLR SCL;Start data transmissionRETSDA BIT P1.0SCL BIT P1.1BSTOP:CLR SCLCLR SDA ;Make sure data line is lowNOPNOPSETB SCL ;Set clock line highNOPNOPSETB SDA ;Data goes high while clock high for STOPNOPNOPRETvoid Start()SDA=1;SCL=1;Delay();SD
11、A=0;Delay();SCL=0;void Stop()SDA=0;SCL=0;Delay();SCL=1;Delay();SDA=1;void SendAck(bit ck)if(ck)SDA=0;else SDA=1;Delay();SCL=1;Delay();SCL=0;SDA=1;/ACK后要对总后要对总线进行释放线进行释放Delay();bit WaitAck()SDA=1;Delay();SCL=1;Delay();if(SDA)/SDA为为1收到非应答收到非应答SCL=0;Stop();return 0;else/SDA为为0收到应答收到应答SCL=0;return 1;AT2
12、4C01:128字节(1288位)AT24C02:256字节(2568位)AT24C04:512字节(5128位)AT24C08:1K字节(1K8位)AT24C16:2K字节(2K8位)U2写地址:写地址:1010 000 0(0 xa0)U2读地址:读地址:1010 000 1(0 xa1)U3写地址:写地址:1010 100 0(0 xa8)U3读地址:读地址:1010 100 1(0 xa9)void SendByte(uchar b)uchar i;for(i=0;i8;i+)b=b1;/b字节按位左移,最高位移入字节按位左移,最高位移入CYSCL=0;/只有只有SCL为低电平时,数据
13、才可以变化为低电平时,数据才可以变化SDA=CY;Delay();SCL=1;/将将SCL拉高,拉高,SDA上的数据发送出去上的数据发送出去Delay();SCL=0;/将将SCL再次拉低,准备下一次发送再次拉低,准备下一次发送uchar RcvByte()uchar i,k=0;SCL=0;Delay();SDA=1;for(i=0;i8;i+)SCL=1;/SCL为高时,为高时,SDA上才有有效的数据上才有有效的数据 Delay();k=(k1)|SDA;/把把SDA当前值当前值(0或或1)添在字节添在字节k的末位的末位 SCL=0;/将将SCL拉低,准备下一个拉低,准备下一个bit的传送
14、的传送 Delay();return k;“1001”AIN3-AIN0:模拟信号输入端:模拟信号输入端A3-A0:引脚地址端:引脚地址端VDD、VSS:电源端:电源端(2.56V)OSC:外部时钟输入端,内部时钟输出端:外部时钟输入端,内部时钟输出端EXT:内:内/外部时钟选择,使用内部时钟外部时钟选择,使用内部时钟时时EXT接地接地AGND:模拟信号地:模拟信号地AOUT:D/A转换输出端转换输出端VREF:参考电源:参考电源对于模对于模/数转换来说,作为主机的单片机是在读数据,因数转换来说,作为主机的单片机是在读数据,因此遵循此遵循I2C读操作的规律:读操作的规律:主机机先发送器件的主机
15、机先发送器件的7位地址码和写方向位位地址码和写方向位0,在获得从,在获得从机应答后,发出控制字节,说明器件的一些工作参数。收到应机应答后,发出控制字节,说明器件的一些工作参数。收到应答后,主机重复一次起始信号并发出器件地址和读方向位答后,主机重复一次起始信号并发出器件地址和读方向位1,收到器件应答后就开始读出数据字节。当读完最后一个字节,收到器件应答后就开始读出数据字节。当读完最后一个字节后,主机应返回后,主机应返回“非应答非应答”,并发出终止信号以结束读出操作,并发出终止信号以结束读出操作。D7D6D5D4D3D2D1D0控制字节用于实现器件的各种功能,如模拟信号由哪几个控制字节用于实现器件
16、的各种功能,如模拟信号由哪几个通道输入等。控制字节存放在控制寄存器中。总线操作时为主通道输入等。控制字节存放在控制寄存器中。总线操作时为主控制器发送的第二个字节。其格式如下:控制器发送的第二个字节。其格式如下:D1D0 A/D通道编号:通道编号:00-通道通道0、01-通道通道1、10-通道通道2、11-通道通道3D2 自动增益标志位自动增益标志位(有效位为有效位为1)D3 未使用,固定为未使用,固定为0D5D4 模拟量输入方式选择:模拟量输入方式选择:00-四路单端输入、四路单端输入、01-三路差三路差分输入、分输入、10-单端与差分混合输入、单端与差分混合输入、11-两路差分输入两路差分输
17、入D6 模拟输出允许标志位模拟输出允许标志位(为为1则允许则允许AOUT引脚输出引脚输出)D7 未使用,固定为未使用,固定为0对于数对于数/模转换来说,作为主机的单片机是在写数据,因模转换来说,作为主机的单片机是在写数据,因此遵循此遵循I2C总线写操作的规律:总线写操作的规律:主机进行写操作时,首先发送器件的主机进行写操作时,首先发送器件的7位地址码和写方向位地址码和写方向位位0,在获得从机应答后,发出控制字节,说明器件的一些,在获得从机应答后,发出控制字节,说明器件的一些工作参数。收到应答后,主机可以开始发送数据,每发一个字工作参数。收到应答后,主机可以开始发送数据,每发一个字节后都要等待应答。节后都要等待应答。