1、 I2C总线总线 i2C(InterIntegrated Circuit)总线: 它是PHILIPS公司开发的双向两线制串行总线,用于连接微控制器及其外围设备,属于器件总线。 i2C总线产生于80年代,最初为音频和视频设备开发,在彩色电视机中大规模应用,如今主要应用于电讯和影音产品,微控制器与各种功能模块的连接,器件之间的互连通信,在计算机服务器的管理中也大量应用。 应用实例图一单片机i2C总线应用实例图二 一。 i2C总线特点 简单性简单性( 2线,电路简单,编程方便) 有效性有效性 I2C功能器件包括:实时时钟、 LCD驱动、I/O扩展、AD转换器、LED调光、闪光器、LED调光、闪光器、
2、数字温度传感器、数字DIP开关; SDASCL单 片 机A单 片 机BSRAM或E2PROMA/D或D/A日 历时 钟其 他 I2C外 围 设 备SDASDASDASDASDASDASCLSCLSCLSCLSCLSCL i2C总线在总线在IC之间进行双向数据传送,之间进行双向数据传送,典型速度典型速度100Kbit/S,快速模式达,快速模式达400Kbit/S,后来增加了高速模式达,后来增加了高速模式达3.4Mbit/S。总线的长度可达总线的长度可达1000米。米。 i2C总线上的每个电路和模块都有唯总线上的每个电路和模块都有唯一的地址,像手机拨号一样。每一个一的地址,像手机拨号一样。每一个I
3、C都可以是主控器(或被控器),都可以都可以是主控器(或被控器),都可以是发送器(或接收器)。是发送器(或接收器)。 二。 I2C总线的工作原理: 数据传输的实质是: 通过实现数字逻辑的“与”逻辑 来传递二进制1和0的数据。 “1”高电平; “0”低电平。 端口 端口结果器件器件A的端口的端口器件器件B的端口的端口I2C总线接口的实现电路简图SDAIN=1时,时,T上拉通,上拉通,SDA=1;IN=0时,时,T下拉通,下拉通,SDA=0。多个并联,即实现了多个并联,即实现了“与与”逻辑。逻辑。0锁定总线,锁定总线,1释放总线。释放总线。SDASDAl 2.1 I2C总线的构成及信号类型: 一。构
4、成: 数据线数据线 SDA 时钟线时钟线 SCL二。数据传输的有效规则: 1. SCL高电平期间,高电平期间,SDA保持不变,数据有效。保持不变,数据有效。 2. SCL低电平期间,低电平期间,SDA改变,数据变化有效。改变,数据变化有效。 三。应用方式: 1. 标准硬件标准硬件 i2C 端口端口(硬核硬核)。 2. 软件模拟软件模拟 i2C 端口端口(可编程器件用软件实现可编程器件用软件实现)。 SDA SCL单片机EEPROM普通I/O口普通I/O口单片机EEPROMI2C总线的三种信号类型:的三种信号类型: 开始信号开始信号 SCL高电平时,高电平时,SDA产生高到低的产生高到低的下降沿
5、下降沿跳变跳变 结束信号结束信号 SCL高电平时,高电平时,SDA产生低到高的产生低到高的上升沿上升沿跳变跳变 应答信号应答信号 接收数据的器件在接收到接收数据的器件在接收到8bit数据后,向发送数据数据后,向发送数据的器件发出低电平信号,表示已收到数据的器件发出低电平信号,表示已收到数据(一帧共九位)。这个信一帧共九位)。这个信号由接收数据的器件发出。发送端收到应答信号后,作出分析判号由接收数据的器件发出。发送端收到应答信号后,作出分析判断。若未收到应答信号,则判断为受控单元出现故障。断。若未收到应答信号,则判断为受控单元出现故障。 I2C总线数据传送典型信号时序 4.0 s4.7 s4.0
6、 s4.7 s4.0 s4.0 sSCL/P1.0SDA/P1.1SCL/P1.0SDA/P1.1SDA/P1.1SCL/P1.0SCL/P1.0SDA/P1.1(a)启 动(b)终 止(c)发 送 0/发 送 应 答 位(d)发 送 1/发 送 非 应 答 位 串行总线上的数据传送时序图:串行总线上的数据传送时序图: 2.2 总线的工作原理时序图总线的工作原理时序图时钟线数据线下降沿开始位下降沿开始位上降沿结束位上降沿结束位数据位数据位应答位应答位时间轴总线数据传送的模拟 (1)总线数据传送的时序要求 为了保证数据传送的可靠性,标准的总线数据传送有着严格的时序要求,如总线上时钟信号的最小低电
7、平周期为4.7us,最小的高电平周期为4us等。 用单片机的普通I/O口模拟总线的数据传送时,单片机的时钟信号都能满足SDA、SCL上升沿、下降沿的时间要求,因此,在时序模拟时,最重要的是保证典型信号。(2) I2C总线的控制程序实现: /*I2C的启动程序*/ (时钟线高时,数据线上升沿) Void I2CStart (void) SDA = 1; /释放数据线SomeNOP(); /延时SCL = 1; /时钟线拉高SomeNOP(); /延时SDA = 0; /数据线拉低SomeNOP(); /延时SCL = 0; /时钟线拉低SomeNOP(); /延时 /*I2C的停止程序*/ (时
8、钟线高时,数据线上升沿) void I2CStop(void) SDA = 0;SomeNOP();SCL = 1;SomeNOP();SDA = 1;SomeNOP(); /*I2C的应答程序*/ void ACK(void) /Acknowledge信号SDA = 0; /发送0,应答SomeNOP(); SCL = 1;SomeNOP(); /产生时钟高电平SCL = 0;SomeNOP(); void NACK(void) /没有Acknowledge信号SDA = 1; /发送1,非应答SomeNOP();SCL = 1;SomeNOP(); /产生时钟高电平SCL = 0;Some
9、NOP();检测应答位 bit TestAck() bit ErrorBit;SDA=1;SCL=1;ErrorBit=SDA;SCL=0;return(ErrorBit); 写8位数据 bit Write8Bit(unsigned char input) unsigned char temp;for(temp=8;temp!=0;temp-) SDA=(bit)(input&0 x80);SCL=1;SCL=0;input=input1; 读8位数据 unsigned char Read8Bit() unsigned char temp,rbyte=0;for(temp=8;temp!=0;
10、temp-) SCL=1;rbyte=rbyte1;rbyte=rbyte|(unsigned char)(SDA);SCL=0;return(rbyte); l 控制字 ,起始信号后必须是发送控制字。控制字格式控制字格式,高高4位位为器件识别符(不同的芯片有不同的定义,EEPROM一般应为1010),接着3位为片选,也就是三个地址位,最后最后1位位为读写控制为读写控制位,当为位,当为1时为读操作,为时为读操作,为0时为写操作。时为写操作。顺序读的操作顺序读的操作:下图给出的是顺序读的时序图。应当注意的是:最后一个读图给出的是顺序读的时序图。应当注意的是:最后一个读操作的第操作的第9个时钟周期
11、不是个时钟周期不是“不关心不关心”。为了结束读操作,主。为了结束读操作,主机必须在第机必须在第9个周期间发出停止条件或者在第个周期间发出停止条件或者在第9个时钟周期内个时钟周期内保持保持SDA为高电平、然后发出停止条件。为高电平、然后发出停止条件。 顺序读的操作时序图:顺序读的操作时序图:读写控制位为1顺序写的操作顺序写的操作: 与上读操作类似,区别是控制字末位的读写控制位变成0。读写控制位为0I2C总线协议 写数据到从机主机发送器用10 位地址寻址从机接收器主机发送器用主机发送器用8位地址寻址从机接收器位地址寻址从机接收器1nd BYTE void Write24c02 (unsigned
12、char *Wdata,unsigned char RomAddress,unsigned char number) Start();Write8Bit(WriteDeviceAddress); TestAck();Write8Bit(RomAddress);TestAck();for(;number!=0;number-) Write8Bit(*Wdata);TestAck();Wdata+;Stop();DelayMs(10); I2C总线协议 写数据到从机主机发送器用8位地址寻址从机接收器I2C总线协议总线协议读从机数据读从机数据主机接收器用主机接收器用8位地址寻址从机发送器位地址寻址从
13、机发送器1nd BYTE先启动一个写命令,发送地址给从机。先启动一个写命令,发送地址给从机。 然后再次启动读命令,读数据。然后再次启动读命令,读数据。void Read24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes) Start();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(RomAddress);TestAck();Start(); /再次启动Write8Bit(ReadDviceAddress);TestAck();while(
14、bytes!=1) *RamAddress=Read8Bit();Ack();RamAddress+;bytes-;*RamAddress=Read8Bit();NoAck();Stop();I2C总线协议 读从机数据主机发送器用8位地址寻址从机接收器在主程序中的调用读写子程序 void main(void) Byte buf1=3,4,5,6,7,8;Byte buf2;Write24c02(buf1,0,6);Read24c02(buf2,0,6);if(buf11=buf21)LED1=0;if(buf12=buf22)LED2=0;if(buf13=buf23)LED3=0;if(bu
15、f14=buf24)LED4=0;while(1); I2C总线协议组合格式 : 主机用10 位地址寻址从机然后发送数据到这个从机并向这个从机读数据I2C新发展恩智浦(NXP)公司扩展的I2C控制网络: 结束语结束语 I2C总线的应用中的注意事项 : 1)严格按照时序图的要求进行操作。 2)总线必须上拉,即在没有控制时,总线为1。在与逻辑中理解为释放总线。 3)程序中为配合相应的传输速率,在对口线操作的指令后,用NOP指令做一定的延时。 (2) 总线典型信号的模拟子程序 启动信号子程序STA STA:SETBP1.0 ;总线启动子程序 SETB P1.1 NOP NOP CLRP1.1 NOP
16、 NOP CLRP1.0 RET附汇编语言模拟程序终止信号子程序STOP STOP: NOP;停止子程序 CLRP1.1SETBP1.0 NOP NOP SETB P1.1 NOP NOP CLR P1.0 RET附汇编语言模拟程序发送应答位子程序MACK MACK:CLR P1.1;应答子程序 SETB P1.0;准备发送 NOP NOP CLR P1.0 SETB P1.1 RET附汇编语言模拟程序发送非应答位子程序MNACK MNACK: CLRP1.0 CLR P1.1 SETB P1.1 ;非应答子程序 SETB P1.0 NOP NOP CLRP1.0 CLRP1.1 RET附汇编
17、语言模拟程序(3)总线模拟传送的通用子程序 总线数据模拟传送的通用软件包除了上述基本的启动、停止、发送应答位和发送非应 答 位 子 程 序 外 , 还 有 应 答 位 检 查( C A C K ) 、 发 送 一 个 字 节 数 据( W R B Y T ) 、 接 收 一 个 字 节 数 据( R D B Y T ) 、 发 送 n 个 字 节 数 据( W R N B Y T ) 、 接 收 n 个 字 节 数 据(RDNBYT)子程序。附汇编语言模拟程序 应答位检查子程序CACK 在应答位检查子程序(CACK)中,设置了标志位,CACK中用F0作标志位,当检查到正常应答位后,F0=0,否
18、则F0=1。 CACK: SETBP1.1 ;设P1.1为输入 SETB P1.0 ;准备读 CLR F0 MOV A,P1;读P1.1 JNBACC.1,GEND ;判断有无应答 SETB F0;P1.1为“1”,无应答,F0=1 GEND: CLR P1.0 ;P1.1为“0”,有应答,F0=0 NOP RET 发送一个字节数据(WRBYT)子程序 占用资源:R0,C。 WRBYT:MOVR0,#08H CLRP1.0 CLRC WLP: RLCA JCWR1 AJMPWR2 WLP1: DJNZR0,WLP RET WR1:SETBP1.1 SETBP1.0 NOP NOP CLRP1.
19、0 CLRP1.1 AJMPWLP1 WR2:CLRP1.1 SETBP1.0 NOP NOP CLRP1.0 AJMPWLP1 接收一个字节数据(RDBYT)子程序 RDBYT: MOV R0,#08H RLP:SETB P1.1 SETBP1.0 MOVA,P1 JNBACC.1,RD0 AJMPRD1 RLP1: DJNZR0,RLP RET RD0: CLRC MOVA,R2 RLCA MOVR2,A CLRP1.0 AJMPRLP1 RD1:SETB MOVA,R2 RLCA MOVR2,A CLRP1.0 AJMPRLP1 发送n个字节数据(WRNBYT)子程序 WRNBYT:PU
20、SH PSW MOVPSW,#18H MOVR3,NUMBYT LCALLSTA MOVA,SLA LCALLWRBYT LCALLCACK JBF0,WRNBYT MOVR1,MTD WRDA:MOV A,R1 LCALLWRBYT LCALLCACK LCALLWRBYT LCALLCACK JBF0,WRNBYT INCR1 DJNZR3,WRDA LCALLSTOP POPPSW RET 读取n个字节数据(RDNBYT)子程序 RDNBYT:PUSH PSW MOVPSW,#18 MOVR3,NUMBYT LCALLSTA MOVA,SLA LCALLWRBYT JBF0,RDNBYT
21、 RDN:MOVR1,#MRD RDN1:LCALLRDBY MOV R1,A DJNZR3,ACK LCALLMNACK LCALLSTOP POPPSW RET ACK: LCALLMACK INCR1 SJMPRDN1 第一篇 AD/DA-PCF8591 (1)AIN0AIN3:模拟输入端; (2)VSS:电源地线; (3)A0A2:地址输入端; (4)SDA:总线数据线; (5)SCL:总线的时钟输入端; (6)OSC:外部时钟输入端/内部时钟输出端; (7)EXT:时钟选择端。为1时,用外部时钟;为0时,用内部时钟; (8)AGND:模拟信号地; (9)VREF:基准电源输入端; (
22、10)AOUT:D/A转换模拟 12345678910111213141516PCF8591VSSAIN1AIN2AIN3A0A1VCCVREFAGNDEXTOSCSCLSDAAIN0A2AOUT 1. PCF8591的主要特性与引脚功能 2PCF8591的结构与应用原理 控制寄存器其控制字格式如下: D1、D0=00时:模拟量输入通道选择0通道 D1、D0=01时:模拟量输入通道选择1通道 D1、D0=10时:模拟量输入通道选择2通道 D1、D0=11时:模拟量输入通道选择3通道D7D6D5D4D3D2D1D000 D2:自动增量选择位,此位有效,A/D转换通道自动循环递增,每次A/D转换结
23、束都自动选择下一通道。 D3、D7:标志位,必须设置为“0”。 D5、D4:模拟量输入方式选择,分别为4路单端输入、3路差分输入、单端与差分混合、两路差分输入4种方式。 D5 D4 AIN0 AIN1 AIN2 AIN3 输入方式 0 0 (独立) (独立) (独立) (独立) 4路单端输入 0 1 (公共端) 3路差分输入 1 0 (独立) (独立) (AIN3) 单端与差分混合 1 1 (AIN1) (AIN3) 2路差分输入 D6:模拟量输出允许位,D6=1时激活模拟量输出3PCF8591的数据操作格式 (1)DAC数据操作格式 S:总线的启始信号(电平由高到低); SLAW:总线的8位
24、寻址字节(写); A:应答信号(低电平); CONBYT:PCF8591的控制字,D/A转换时控制字D6位置1; DATA0DATAn:待转换的二进制数; P:总线的终止信号(电平由低到高)。SSLAWADATA0ADATA1ACONBYTADATAnAP(2)ADC数据操作格式 S:总线的启始信号; SLAW:总线的8位寻址字节(写); A:应答信号; CONBYT:PCF8591的控制字; SLAR:总线的8位寻址字节(读); DATA0DATAn:A/D转换的结果; :非应答信号(高电平); P:总线的终止信号。SSLAWACONBYTASSLARDATA0DATAnAPAA4PCF85
25、91与8051的接口电路 P1.0P1.1+5V89C51LM385SCLSDAVREFEXTA0A1A2VSSAOUTAIN0AIN1AIN2AIN3PCF8591输入输出 5. 5. 程序程序 SLAW0EQU90H SLAR0EQU91H COMMAND0EQU40HORG0100H MAIN:MOV SP,#70H MOVSLA,#SLAR0MOV NUMBYT,#01HLCALLRDNBYTMOV 31H,MRDMOV MTD,#COMMAND0MOV SLA,#SLAW0MOV NUMBYT,#02HLCALLWRNBYTLJMP MAIN从通道0采集A/D信号,再通过D/A转换器将信号输出的程序如下: