IIC原理与应用.ppt
《IIC原理与应用.ppt》由会员分享,可在线阅读,更多相关《IIC原理与应用.ppt(53页珍藏版)》请在冰点文库上搜索。
I2C公用二总线结构,一、I2C总线规范简介,在器件(IC)之间,使用两根信号线(SDA和SCL)串行的方法进行信息传送的并允许若干兼容器件共享的二线总线,称为I2C总线。
1.I2C总线的概念,InterIntegratedCircuit,DECTcordlessphonebase-station,DigitalEnhancedCordlessTelecommunications,SDA(SerialDAta)线称为串行数据线,其上传输双向的数据;SCL(SerialCLock)线称为串行时钟线,其上传输时钟信号,用来同步串行数据线上的数据。
I2C总线上的器件,SDA和SCL引脚都是一个开漏输出端。
挂接在I2C总线上的器件(或IC),根据其功能可分为两种:
主控器件和从控器件。
主控器件:
控制总线存取,产生串行时钟(SCL)信号,并产生启动传送信号及结束传送信号的器件,总线必须由一个主控器件控制。
主控器件一般称主器件(主机)。
从控器件:
在总线上被主控器件寻址的器件,它们根据主控器件的命令来接收和发送数据。
从控器件一般称从器件(从机)。
I2C总线系统是一个允许多主的系统。
系统中的某一器件有四种可能的工作方式:
主发送方式、主接收方式、从发送方式和从接收方式。
在I2C总线上的所有器件是按照如下的数据传输协议协调工作的:
据此定义以下总线条件:
总线不忙,SCL=SDA=1,只有当总线不忙时,数据传输才能开始;,当串行时钟线为高电平时,串行数据线的变化将认为是传送的开始或停止;当串行时钟线为低电平时,才允许串行数据线发生变化;,数据传送期间,无论何时串行时钟线为高电平,串行数据线必须保持稳定。
开始数据传送,停止数据传送,起始信号(START),停止信号(STOP),数据有效(Datavalidity),应答(Acknowledge),2.7位的地址格式,主发送到从接收,主机发送,从机接收,传输的方向不会改变,从发送到主接收,主机在发送完第一个字节后,立即读从机。
第一次响应仍由从机产生,在第一次响应后主机变成接受器,从机变成发送器。
停止条件由主机发出。
复合格式,传输改变方向的时侯,起始条件和从机地址都会被重复,且R/W位取反。
如果主机作为接收,发送一个重复起始条件,它之前应该发送了一个不响应信号(A)。
仲裁和时钟发生,时钟同步,仲裁,3.I2C总线主要功能特点:
在主控器件和从控器件之间双向传送数据;无中央主控器件的多主总线;多主传送时,不发生错误;可以使用不同的位速率;串行时钟作为交接信号;可用于测试和诊断目的。
在单片机应用系统中,单主结构占绝大多数。
在单主系统中,I2C总线的数据传送状态要简单得多,没有总线竞争与同步问题,只有作为主器件的单片机对I2C总线器件的读/写操作。
这就简化了模拟软件的设计工作。
有I2C总线的单片机中,可以直接用I2C总线来进行系统的串行扩展;对于80C51系列单片机,大多数没有I2C总线接口功能,而是采用软件模拟双向数据传送协议的方法,来实现系统的串行扩展。
二、利用I2C总线扩展单片机的外部功能,1.利用模拟I2C扩展串行E2PROM,
(1)串行E2PROM24LC32的特点及引脚,24LC32是32Kb(4K8位)串行存取的电擦除可编程的只读存储器E2PROM。
特点:
芯片对快速写操作具有8个8B字节页面、或者64字节的高速缓存器,并具有二线串行接口。
在I2C上作从器件使用;,可在电源电压低到2.5V的条件下工作,芯片还有功率等待模式,以降低功耗;等待电流和额定电流分别为1A和3mA(写);,地址线允许8片24LC32连接到相同的总线上,得到256Kb位地址空间。
引脚:
A0、A1、A2:
芯片地址输入端,WP:
写保护端,
(2)器件的寻址和操作,控制字节和器件寻址,作为从器件,接收到的下两个字节定义了第一个数据字节的地址。
由于仅用A0A11,所以最高4位地址码必须为0。
但对于ATMEL公司的产品来说,无此规定。
地址的最高有效字节的最高有效位最先发送。
写操作,字节写,主器件发出开始条件以后,再发送R/W=0的控制字节到总线上。
这指示被寻址的从接收器的两个地址字节及一个数据字节将跟在第9个时钟周期产生的确认(应答)位之后。
0,主器件发送的下一个字节是字地址的高地址字节,应答后,接着是低地址字节,再次应答后,它们将被写入24LC32的地址指针。
随后主器件发送写入到被寻址的存储器里的数据字节。
24LC32应答后,主器件发出停止条件。
R/W=0时,将启动写操作。
页面写,写控制字节、字地址和第一个数据字节以与字节写相同的方式发送到24LC32。
但是替代产生停止条件,主器件可发送多达8页的8个数据字节(总共64个字节)。
24LC32先将这些数据字节暂存在片内的页面高速缓存器中。
一旦接收到主器件的停止条件后,则内部的写周期开始,这些数据字节将从页面高速缓存器中写入E2PROM阵列。
接收到每一个字节后,24LC32的低6位顺序地址指针在内部加1,高6位顺序地址指针保持不变。
如果主器件在产生停止条件以前要发送多于8个字节的数据(越过页边界写),地址计数器的低3位将会翻转,并且指针将加1,指向页面高速缓存器的下一页。
这样重复8次后或者直至高速缓存器存满时,主器件产生停止条件。
如果停止条件没有接收到,高速缓存器指针将翻转到第一页(字节0),这之后再接收到的数据将覆盖以前所获得的数据。
在发送期间的任何时刻都可传送停止条件。
应答查询,由于在写周期期间,器件将不会应答,所以,这一点可以用来决定写周期在什么时候完成。
一旦针对写命令的停止条件由主器件发出,从器件开始进行内部定时写周期,主器件的ACK查询被立即启动。
如果写周期器件仍然很忙,则ACK信号将不会产生;如果周期已经完成,则器件将产生ACK信号。
主器件将可以进行下一次的读或写操作。
读操作,读当前地址内容,当控制字的R/W位被置为“1”时,将启动读操作。
存在三种基本的读操作类型:
读当前地址内容、读随意地址内容及读顺序地址内容。
1,0,1,0,1,读当前地址内容24LC32内部包含一个自动加1的地址计数器,它保存被存取过的最后一个字节的地址。
如果以前存取的地址为n,下一次读操作则从n+1地址中读数据。
在接收到的从地址中的R/W为1的情况下,24LC32发送一个应答位,并且送出8位数据。
主器件发出非应答信号(NOACK),使从器件释放数据线,以便主器件发出一个停止条件,从而终止数据传送。
读随意地址内容,此方式允许主器件以任意方式读存储器任意地址的内容。
这种读操作须先置字地址,即主器件将字地址作为写操作的一部分送给24LC32。
在发送了字地址以后,主器件在应答位之后产生一个开始条件。
这样可以在内部地址计数器置数后终止写操作。
主器件再次发R/W为1的控制字。
24LC32将发出应答位,并发送出8位数据。
主器件将发送非应答信号,并产生一个停止条件,从而终止发送。
读顺序地址内容,读顺序地址内容方式与读随意地址内容方式的启动方法一样,但是在24LC32发送第一个数据字节后,主器件不发出终止发送的信号(发送应答信号)。
24LC32继续发送下一个地址的8位数据,其内部的地址指针在操作后自动加1。
地址指针允许在一次操作期间,连续顺序地读出整个存储器。
当主器件接收到最后一个字节后,主器件将产生非应答信号及一个停止条件,终止传送。
(3)80C51与串行E2PROM24LC32的接口和编程,80C51与串行24LC32的接口,80C51与串行E2PROM24LC32的接口原理图,模拟I2C总线的编程,利用模拟仿真的方法,编写通用子程序。
这些通用子程序包括:
启动、停止、发送应答位及非应答位、应答位检查、单字节数据接收与发送。
以下子程序中,设定单片机所使用的晶体振荡器为6MHz,即机器周期为2S。
若晶体振荡器不是6MHz,则可根据情况增减程序中的NOP指令即可。
汇编语言编写的子程序:
SDABITP1.7SCLBITP1.6,A.启动I2C总线子程序:
START:
SETBSDASETBSCLNOPNOPCLRSDANOPNOPCLRSCLNOPRET,B.停止I2C总线子程序:
STOP:
CLRSDASETBSCLNOPNOPSETBSDANOPNOPCLRSCLNOPRET,C.发送应答位子程序:
S_ACK:
CLRSDASETBSCLNOPNOPCLRSCLSETBSDARET,D.应答位检查子程序:
子程序出口时,SDA线的状态存入标志位F0中,若有ACK,F0=0,否则F0=1。
C_ACK:
SETBSDA;SDA为输入状态SETBSCL;第9个时钟脉冲开始NOPMOVC,SDA;读SDA线MOVF0,C;存入F0中CLRSCL;第9个时钟脉冲结束NOPRET,E.单字节数据发送子程序:
将累加器A中的待发送数据送上SDA线。
WRBYT:
MOVR7,#8;发送8位WRBYT1:
RLCA;将发送位移入C中JCWRBYT2;此位为1,转WRBYT2CLRSDA;此位为0,发送0SETBSCL;时钟脉冲开始NOPNOPCLRSCL;时钟脉冲结束DJNZR7,WRBYT1;未发送完,转WRBYT1RET,WRBYT2:
SETBSDA;此位为1,发送1SETBSCL;时钟脉冲开始NOPNOPCLRSCL;时钟脉冲结束CLRSDADJNZR7,WRBYT1;未发送完,转WRBYT1RET,F.单字节数据接收子程序:
从SDA线上读一个字节的数据,存入A中。
RDBYT:
MOVR7,#8;接收8位RDBYT1:
SETBSDA;SDA为输入状态SETBSCL;时钟脉冲开始MOVC,SDA;读SDA线MOVA,R6;取回暂存结果RLCA;移入新接收位MOVR6,A;将结果暂存R6CLRSCL;时钟脉冲结束DJNZR7,RDBYT1;未读完8位,转RDBYT1RET;读完8位,返回,2.利用I2C扩展I/O接口,PCF8574T是一种单片CMOS电路,具有I2C总线接口和8位准双向口。
在I2C总线系统中仅作从器件。
具有低的电流损耗,最大静态电流为10A;,能输出大的电流,并有锁存功能,可直接驱动LED发光管;,有中断逻辑线;,3根硬件地址引脚使I2C总线系统可挂接8只PCF8574。
器件的串行时钟的最高频率为400kHz,SDA:
串行数据线,双向。
SCL:
串行时钟线,输入。
P7P0:
8位准双向输入/输出口。
准双向口的每一位可作输出或输出。
上电复位时,口的每一位均为高电平。
某位在作输入前,应置为高电平。
A2A0:
地址输入线。
INT:
中断输出线,低电平有效。
PCF8574的每个I/O口都可单独用作输入或输出。
输入通过读模式将数据传送到MCU,输出通过写模式将数据发送到端口。
寻址,PCF8574和PCF8574A的控制字节的配置,写模式(输出),读模式(输入),中断,在输入模式中(读),口输入信号的上升或下降沿产生中断。
PCF8574应用和编程,PCF8574作扩展8位输入口,PCF8574读方式的连接,将开关的状态读入片内RAM30H单元中。
程序如下:
RD8:
ACALLSTART;开始条件MOVA,#41H;PCF8574为读方式ACALLWRBYTACALLC_ACK;检查ACK信号JBF0,$ACALLRDBYT;读数据MOV30H,AACALLC_ACKJBF0,$ACALLSTOPAJMP$,PCF8574作扩8位输出口,PCF8574写方式的连接,程序如下:
WR8:
ACALLSTART;开始条件MOVA,#40H;PCF8574为写方式ACALLWRBYTACALLC_ACK;检查ACK信号JBF0,$MOVA,#0FFH;改变不同的立即数,;PCF8574的指示灯;相应的亮熄ACALLWRBYTACALLC_ACK;检查ACK信号JBF0,$ACALLSTOP;停止条件AJMP$,PCF8574作扩展4位输入口和4位输出口,PCF8574高4位输入、低4位输出的连接,程序如下:
STA:
ACALLSTART;开始条件MOVA,#41H;PCF8574为读方式ACALLWRBYTACALLC_ACK;检查ACK信号JBF0,$ACALLRDBYT;读数据SWAPACPLAMOV30H,AACALLSTOPACALLSTART;开始条件MOVA,#40H;PCF8574为写方式,ACALLWRBYTACALLC_ACK;检查ACK信号JBF0,$MOVA,30HACALLWRBYTACALLDELAY;延时子程序ACALLSTOP;停止条件LJMPSTA,6.4外部中断源的扩展,扩展4个外部中断源的电路,中断源查询程序的流程图,INT0的中断服务程序如下:
PINT0:
PUSHPSW;保护现场PUSHACCJBP1.0,LOOP1;转向中断服务程序1JBP1.1,LOOP2;转向中断服务程序2JBP1.2,LOOP3;转向中断服务程序3JBP1.2,LOOP4;转向中断服务程序4INTEND:
POPACC;恢复现场POPPSWRETI,;LOOP1:
中断服务程序1AJMPINTENDLOOP2:
中断服务程序2AJMPINTENDLOOP3:
中断服务程序3AJMPINTENDLOOP4:
中断服务程序4AJMPINTEND从程序中可以看出,这里定义的扩展外中断源1的优先级最高,扩展外中断源4的优先级最低,所以查询的顺序从P1.0开始。