《单片机速成第5章.ppt》由会员分享,可在线阅读,更多相关《单片机速成第5章.ppt(177页珍藏版)》请在三一办公上搜索。
1、第5章单片机串行口功能扩展,5.1 串行口的功能扩展概述5.2 51系列单片机与异步串行通信总线接口5.3 51系列单片机与同 步串行总线接口习题五,5.1串行口功能扩展概述随着单片机应用技术的发展,单片机的应用模式也在不断更新。一方面,单片机应用系统的规模越来越大,在其外围连接了种类繁多的外设;另一方面,单片机进入了计算机网络系统,工业控制系统多采用多机分布式系统。同时,单片机的嵌入式系统应用模式又使其体积越来越小,且器件引脚数目越来越少。近年来,串行接口设备凭借其控制灵活、接口简单、占用资源少等优点在工业测控、仪器仪表等领域被广泛应用。这些发展趋势加强了单片机串行通信的功能,使串行通信技术
2、成为了单片机应用技术的重要组成部分。,51系列单片机内部仅有一个可编程的全双工串行通信口,具有UART的全部功能。在单片机应用系统开发中,开发人员常面临单片机串行通信口不足的问题,需要对串行通信口进行扩展。在进行串行通信接口扩展设计时,必须根据需要选择标准接口,同时要考虑传输介质、电平转换、通信协议等问题。采用标准接口后,能够方便地把单片机与外设、测量仪器等有机地连接起来,构成一个测控系统。,5.251系列单片机与异步串行通信总线接口51系列单片机与异步串行通信接口简单,只要解决电平转换与驱动问题,就可方便地实现串行通信。异步串行通信接口主要有三类:RS 232接口;RS 449、RS 422
3、、RS 423接口;20 mA电流环接口。,5.2.1RS 232接口RS-232C是使用最早、应用最多的一种异步串行通信总线标准,它是美国电子工业协会EIA(Electronic Industry Association)于1962年公布、1969年最后修订而成的。RS表示 Recommended Standard,232是该标准的标识,C表示最后一次修订。RS-232C主要用于定义计算机系统的一些数据终端设备(DTE)和数据通信设备(DCE)之间接口的电气特性。CRT、打印机与CPU的通信大都采用RS-232C总线。,1.RS-232C接口的电平转换RS-232C标准是在TTL电路之前研制
4、的,它的电平不是+5 V和地,而是采用负逻辑,其逻辑电平为:逻辑“0”:+3 V+15 V逻辑“1”:-3 V-15 V因此,RS-232C不能和计算机的TTL电平直接相连,使用时必须加上适当的电平转换电路芯片,否则将使TTL电路烧坏。,常用的电平转换接口芯片是传输驱动器MC1488和传输接收器MC1489,它们是用于计算机(终端)与RS 232C总线间进行电平转换的接口芯片。MC1488:输入TTL电平,输出与RS 232C兼容,电源电压为15 V或12 V;MC1489:输入与RS 232C兼容,输出为TTL电平,电源电压为5 V。MC1488和MC1489的原理电路如图5.1所示。,图
5、5.1MC1488、MC1489电平转换原理图,另一种常用的电平转换芯片是MAX232,该芯片有两个传输驱动器和两个传输接收器。MAX232系列收发器的引脚及原理如图5.2所示。,图 5.2MAX系列收发器的引脚及原理电路,从图5.2可看出,MAX232系列收发器由电压倍增器、电压反相器、RS-232发送器和RS 232接收器四部分组成。电压倍增器利用电荷充电泵原理,用电容C1把+5 V电压变换成+10 V电压,并存放在C3上。第二个电容充电泵用C2将+10 V电压转换成-10 V电压,存储在滤波电容C4上。因此,RS-232只需+5 V单电源即可。这些芯片的收发性能与MC1488、MC148
6、9基本相同,只是收发器路数不同。,2.RS-232C总线标准接口RS-232C标准规定的数据传输率为50 b/s、75 b/s、100 b/s、150 b/s、300 b/s、600 b/s、1200 b/s、2400 b/s、4800 b/s、9600 b/s、19 200 b/s。驱动器允许有2500 pF的电容负载,通信距离将受此电容限制。例如,采用150 pF/m的通信电缆时,最大通信距离为 15 m,若每米电缆的电容量减小,则通信距离可以增加。传输距离短的另一原因是RS-232C 属单端信号传送,存在共地噪声和不能抑制共模干扰等问题。因此,它一般用于 20 m 以内的通信。,RS-2
7、32C总线标准规定了21个信号,有25条引脚线,常采用25芯D型插头座,提供一个主信道和一个辅助信道,在多数情况下主要使用主信道。对于一般异步双工通信,仅需几条信号线就可实现,如一条发送线、一条接收线及一条地线。RS-232C也有9芯标准D型插头座。RS-232C引脚排列如图5.3所示。,图 5.3RS-232C总线引脚排列(a)25芯排列;(b)9芯排列,25芯RS-232C引脚信号定义如表5.1所示。9芯RS-232C引脚信号定义如表5.2所示。,表5.1 25芯RS-232C引脚说明,表5.2 9芯RS-232C引脚说明,RS-232C定义了计算机系统的一些数据终端设备(DTE)和数据通
8、信设备(DCE)之间接口的电气特性。RS-232C提供的两个信道中,辅助串行信道提供数据控制和第二信道,但其传输速率比主信道要低得多。除了速率低之外两信道无异,但辅助信道通常很少使用。这里对主信道的信号再做详细说明。信号分为两类:一类是DTE与DCE交换的信息TxD和RxD;另一类是为了正确无误地传输上述信息而设计的联络信号。,3.RS-232C接口连线方式RS-232C标准规定有25条连接线,虽然其中大部分引脚线有信号定义,可以使用,但在一般的计算机串行通信系统中,仅9个信号(不包括保护地)经常使用。计算机与终端设备之间的连接方法如图5.4所示。最简单的RS-232C连接方式,只需交叉连接2
9、条数据线以及信号地线即可,如图 5.5 所示。,图 5.4RS-232C直接与终端设备连接,图 5.5RS-232C三线连接(a)三线连接;(b)简化的三线连接,在图5.5(a)中,将各自的RTS和DTR分别接到自己的CTS和DSR端,只要一方使自己的RTS和DTR为1,那么它的CTS、DSR也就为1,从而进入了发送和接收的就绪状态。这种接法常用于一方为主动设备,而另一方为被动设备的通信中,如计算机与打印机或绘图仪之间的通信。这样,被动的一方RTS与DTR常置1,因而CTS、DSR也常置1,使其常处于接收就绪状态。只要主动一方令线路就绪(DTR=1),并发出发送请求(RST=1),即可立即向被
10、动的一方传送信息。,图5.5(b)所示为更简单的连接方法。如果说图5.5(a)所示的连接方法在软件设计上还需要检测“清除发送(CTS)”和“数据设备就绪(DSR)”的话,那么图5.5(b)所示的连接方法则完全不需要检测这些信号,随时可进行数据发送和接收。,5.2.251单片机与PC机间的通信接口利用PC机配置的异步通信适配器,可以方便地完成PC机与51单片机的数据通信。1.接口电路采用MAX232芯片接口的PC机与51单片机串行通信接口电路如图5.6所示。MAX232芯片中有两路发送/接收器,与51单片机接口时,只选其中一路即可。连接时,应注意其发送与接收引脚的对应关系,否则可能造成器件或计算
11、机串口的永久性损坏。,图 5.6PC机与51单片机串行通信接口示例电路,2.PC机端通信软件设计1)通信协议波特率:1200 b/s;信息格式:8位数据位,1位停止位,无奇偶检验;传送方式:PC机采用查询方式收发数据,51单片机采用中断方式接收数据,查询方式发送数据;校验方式:累加和校验;,握手信号:采用软件握手。发送方在发送之前先发一联络信号(用“?”号的ASCII码,接收方接到“?”号后,回送一个“”号作为应答信号),随后依次发送数据块长度(字节数),发送数据,最后发送校验和。接收方在收到发送方发过来的校验和后,与自己所累加的校验和相比较。若相同,则回送一个“0”,表示正确传送并结束本次通
12、信过程;若不相同,则回送一个“F”,并使发送方重新发送数据,直到接收正确为止。为了给出一个完整的通信程序,下面分别给出C语言PC机端和汇编语言单片机端的通信程序。,2)PC机发送文件子程序首先介绍通过串口发送一个文件的函数Sendf(),规定欲发送的这个文件存在当前盘上。为了便于说明问题,只传送总字节小于256个字符的文件。Sendf()函数的程序流程图如图5.7所示。,图 5.7PC机发送文件子函数流程,PC机发送文件子函数Sendf()的程序清单如下:Void sendf(char*fname)FIlE*fp;char ch;int handle,count,sum=0;if(fpfope
13、n(fname,r)=NULL)printf(不能打开输入文件!n);,exit(1);Handle=fileno(fp);*取得文件句柄*count=filelength(handle):*取得文件总字节数*printf(准备发送文件.n);do ch=?;*发送联络信号*sport(ch);while(rport()!);*直到接到应答信号为止*sport(count);*发送总字节数*,rep:for(;count;count-)ch=getc(fp);*从文件中取一个字符*sum=sum+ch;*累加校验和*if(ferror(fp)printf(读文件有错误n);Break;spor
14、t(ch);*从串口发一个字符*sport(sum);*发送累加校验和*,if(rport()=F)count=filelength(handle);*发送错误则重发*Sum=0;fseek(fp,count,1);*文件指针回退COUNT字节*goto rep;elsefclose(fp);printf(发送文件结束n);,3)PC机接收文件子程序接收函数Receivef()采用查询方式从串口接收一个总字节数小于256个字符的文件,接收的文件也存于当前盘上。接收文件子函数Receivef()的程序流程图如图5.8所示。,图 5.8PC机接收文件子函数流程图,PC机接收文件子函数Receive
15、f()的程序清单如下:void receivef(char*fname)FILE*fp;char ch;int count,temp,sum=0;remove(fname);*盘上有同名文件将被删掉*if(fpfopen(fname,w)=NULL)printf(不能打开输出文件n);exit(1);,printf(接收文件名:sn,fname);while(rport()!?);*收到联络信号?*sport($);ch:;sport(ch);*发应答信号*temprport();*收总字节数*count=temp;,rep:for(;count;count-)chrport();*从串口接收
16、一个字符*putc(ch,fp);*将一个字符写入文件*samsum+ch;*累加校验和*if(ferror(fp)printf(写文件有错误n);exit(1);,if(rport()!sum)ch=F;sport(ch);*校验和有错误,发F*count=temp;sum=0;fseek(fp,count,1);*文件指针回退COUNT个字节*goto rep;,elsech=0;sport(ch);*校验和正确,发0*fclose(fp);printf(接收文件结束n);,4)PC机主程序(函数)有了上述发送和接收文件两个子函数之后,就可以在主函数中使用它们了。主函数的工作是在完成串口初
17、始化后,根据键入的命令来决定是发送文件还是接收文件。主函数流程图如图5.9所示。,图 5.9PC机主函数流程图,PC机主函数清单如下:main(int argc,char*argv)while(argc!=3)printf(命令行命令不正确,请重新键入命令!n);exit(1);,bioscom(0,0 x83,0);*串口初始化*if(tolower(*argv1)=s)sendf(argv2);else if(tolower(*argv1)=r)receivef(argv2);,这里采用的是带参主函数main(int argc,char*argv)。其中,argc是一个整型变量,argv
18、是一个字符型指针数组。利用main()函数的参数可以使主程序从系统得到所需数据(也就是说,带参函数可直接从DOS命令行中得到参数值,当然,这些值是字符串)。当程序运行时(在DOS下执行.EXE文件),可以根据输入的命令行参数进行相应的处理。例如,执行程序mypro时,若要从当前盘上将名为f1.c的文件从串口发送出去,则需键入下述命令:mypro s fl.c,其中,mypro是源文件mypro.c经编译连接后生成的可执行文件mypro.exe。键入命令:mypro r f2.c 可以从串口接收若干字符,并写入当前盘上名为f2.c的文件中。,3.单片机通信软件设计1)单片机查询发送子程序程序将片
19、外RAM从1000H开始的小于256字节的数据从串行口发送出去,发送的数据字节数在R7中,用R6作累加和寄存器。程序流程图如图5.10所示。,图 5.10单片机查询发送流程图,单片机查询发送子程序如下:SEND:MOV A,#3FH MOV SBUF,A JNB TI,$CLR TI;发?号JNB RI,$CLR RIMOV A,SBUF,CJNE A,#2EH,SEND;应答信号是MOV A,R7;则发字节数MOV R3,A;暂存总字节数MOV SBUF,AJNB TI,$CLR TI MOV R6,#00HMOV DPTR,#1000HSEND1:MOVX A,DPTR,MOVS BUF,
20、A;发送一个字符 JNB TI,$CLR TI ADD A,R6;计算校验和MOV R6,AINC DPTR DJNZ R7,SEND1 MOV A,R6MOV SBUF,AJNB TI,$CLR TI;发送校验和,JNB RI,$CLR RIMOV A,SBUFCJNE A,#46H,SEND2;如收到应答是F,即46H,则重发数据RETSEND2:MOV DPTR,#1000HMOV R6,#00HMOV A,R3MOV R7,AAJMP SEND1,2)单片机接收中断服务子程序在中断服务子程序中,为了区别所接收的信号是联络信号还是字节数,是数据还是校验和,需要设立不同的标志位。为此,在可
21、位寻址的RAM中设定0003H存储不同的标志位:00H为接收联络信号标志位;01H为接收字节数标志位;02H为接收数据标志位;03H为接收文件结束标志位。在初始化时,这些位均为0。程序流程图如图5.11所示。,图 5.11单片机接收中断服务子程序流程图,在中断服务子程序中,将接收到的字节数存入R7中,接收的数据存入片外RAM从1000H开始的单元中。单片机接收中断服务子程序如下:RECE:CLR ESCLR RIJB 00H,RECElMOV A,SBUFCJNE A,#3FH,RECE2;收到的不是?号则退出,MOV A,#2EHMOV SBUF,AJNB TI,$CLR TI;发送应答信号
22、,即2EHSETB 00HSETB ESRETIRECE2:MOV A,#24HMOV SBUF,AJNB TI,$CLR TI;发送应答信号$,即24HSETB ES,RETIRECE1:JB 01H,RECE4MOV A,SBUF;接收字节数MOV R7,AMOV R3,A;暂存总字节数SETB 01HSETB ESRETIRECE4:JB 02H,RECE5,MOV A,SBUF;接收一字符MOVX DPTR,A;存入片外RAM中ADD A,R6MOV R6,AINC DPTRDJNZ R7,RECE7SETB 02HRECE7:SETB ESRETIRECE5:MOV A,SBUF,C
23、JNE A,06H,RECE8;06H为R6的字节地址MOV A,#4FH;校验和不正确,重发数据MOV SBUF,AJNB TI,$CLR TI;校验正确发0,即4FHSETB 03HSETB ESRETIRECE8:MOV DPTR,#1000HMOV R6,#00H,MOV A,R3MOV R7,A MOV A,#46HMOV SBUF,AJNB TI,$CLR TI;校验不正确发F,即46HCLR 02HSETB ESRETl,3)单片机主程序主程序流程图如图5.12所示。,图 5.12单片机主程序流程图,单片机主程序如下:ORG 0000H AJMP MAINORG 0023HAJM
24、P RECEORG 0040HMAIN:MOV SP,#60HMOV SCON,#50H;串口初始化,MOV TMOD,#20HMOV TH1,#0F3HMOV TL1,#0F3HMOV PCON,#00H;设置波特率SETB TR1;启动定时器1SETB EA;开放中断SETB ES;开放串行中断 L3:CLR 00H,CLR 01HCLR 02H CLR 03HMOV R6,#00HMOV DPTR,#1000HL2:JB 03H,L1SJMP L2L1:ACALL SENDAJMP L3,5.2.3RS-449/RS-422/RS-423/RS-485标准接口 虽然RS-232应用广泛,
25、但因其推出较早,在通信系统中存在以下缺点:数据传输速率慢,传输距离短,未规定标准的连接器,接口处各信号间易产生串扰。鉴于此,EIA制定了新的标准RS 449/RS 422/RS-423/RS 485,这些标准除了与RS-232C兼容外,在提高传输速率、增加传输距离、改善电气性能方面有了很大改进。,1.RS-449接口RS-449是1977年公布的标准接口,在很多方面可以代替RS-232C使用,两者的主要差别在于信号在导线上的传输方法不同。RS-232C是利用传输信号与公共地的电压差;RS-449是利用信号导线之间的信号电压差,可在1200 m的24 AWG双绞线上进行数字通信。RS-449可以
26、不使用调制解调器,它比RS-232C传输速率高,通信距离长,且由于RS-449系统用平衡信号差传输高速信号,因而噪声低,又可以多点或者使用公共线通信,故RS-449通信电缆可与多个设备并联。,2.RS-422A、RS-423A接口 RS-422A给出了通信电缆、驱动器和接收器的要求,规定双端电气接口型式,其标准是双端线传送信号。它通过传输驱动器将逻辑电平变换成电位差,完成发送端的信息传递;通过传输接收器,把电位差变换成逻辑电平,完成接收端的信息接收。RS-422A比RS-232C传输距离长、速度快,传输速率最大可达100 kb/s,在此速率下电缆的允许长度为12 m;如果采用低速率传输,则最大
27、距离可达1200 m。,RS-422A与TTL进行电平转换最常用的芯片是传输驱动器MC3487和传输线接收器MC3486。这两种芯片的设计都符合EIA标准,RS-422A采用+5 V电源供电。RS-422A的接口电路如图5.13所示。发送器MC3487将TTL电平转换为标准的RS-422A电平;接收器MC3486将RS-422A接口信号转换为TTL电平,采用差分输入输出。,图 5.13 RS-422A接口电平转换电路,美国电子工业协会于1987年提出了RS-423A总线标准,它与RS-422A一样,也给出了RS-449中对于通信电缆、驱动器和接收器的要求。RS-423A给出了不平衡信号差的规定
28、,而RS-422A给出的是平衡信号差的规定。RS-423标准接口的最大传输速率为100 kb/s,电缆的允许长度为90 m。而差分输入对共模干扰信号有较高的抑制作用,这样就提高了通信的可靠性。,RS-423A用-6 V表示逻辑“1”,用+6 V表示逻辑“0”,可以直接与RS-232C相接。采用RS 423A标准可以获得比RS-232C更佳的通信效果。RS-423A也需要进行电平转换,常用的驱动器和接收器分别为MC3488A和MC3486。其接口电路如图5.14所示,采用差分输入,单端输出。,图 5.14RS-423A接口电平转换电路,3.RS-485接口RS-485接口是20 mA电流环路串行
29、通信接口,也是目前串行通信广泛使用的一种接口电路。其最大的优点是低阻传输,对电气噪声不敏感,而且易于实现光电隔离,非常适于长距离串行通信。RS-485有两线制和四线制两种接口。,在两线制接口中,两根线组成一个输入电流回路,同时也是输出电流回路,由逻辑开关控制。它不能同时实现串行数据的收发工作,串行通信只能处于半双工状态,但它在线路铺设中只需两根线,因此线路简单、成本低,适于串行通信流不太大的场合。在四线制接口中,发送正、发送负、接收正、接收负四根线组成一个输入回路,一个输出电流回路。当发送数据时,根据数据的逻辑1、0有规律地使回路形成通、断状态。,RS-485接口芯片很多,常用的有MAX481
30、E和MAX488E。这两种芯片的主要区别是前者为半双工,后者为全双工。除这两种芯片外,和MAX481E相同的系列芯片还有MAX483E/485E/487E/1487E。和MAX488E相同的有MAX490E。它们的结构及引脚如图5.15所示。,图 5.15MAX481E和MAX488E的结构及引脚图(a)MAX481E;(b)MAX488E,由半双工接口芯片MAX481E构成的RS 485两线制接口电路如图5.16所示。由全双工接口芯片MAX488E构成的RS 485四线制接口电路如图5.17所示,图 5.16MAX481E构成的RS-485两线制接口电路图,图 5.17MAX488E构成的R
31、S-485四线制接口电路图,5.351系列单片机与同步串行总线接口在单片机应用系统中,越来越多的外围器件都配置了同步串行扩展总线接口,如EPRAM、A/D、D/A及集成智能传感器等。从20世纪90年代开始,众多的单片机厂商陆续推出了带同步串行总线接口的单片机,如Philips公司的8XC552和LPC76X系列带I2C总线接口,Motorola公司的M68HC05和M68HC11,ATMEL公司的AT89S8252,以及新一代的基于RISC的AVR系列单片机都集成有SPI接口。目前,同步串行通信总线应用越来越多,主要有I2C、PI、单总线(1 wire)、Microwire等。,5.3.1I2
32、C总线I2C总线(Inter IC Bus)全称为芯片间总线,是由Philips公司推出的一种基于两线制的同步串行总线,被广泛应用于消费类电子产品、通信产品、仪器通信及工业系统总线中。,1.I2C总线工作原理I2C总线采用两线制,由数据线SDA和时钟线SCL构成。I2C总线为同步传输总线,数据线上信号完全与时钟同步。数据传送采用主从方式,即主器件(主控器)寻址从器件(被控器),启动总线,产生时钟,传送数据及结束数据的传送。SDASCL总线上挂接的单片机(主器件)或外围器件(从器件)的接口电路都应具有I2C总线接口,所有器件都通过总线寻址,而且所有SDASCL同名端相连,如图5.18所示。,图
33、5.18I2C总线应用系统的组成,按照I2C总线规范,总线传输中将所有状态都生成相应的状态码,主器件能够依照这些状态码自动地进行总线管理。Philips公司、Motorola公司和MAXIM公司推出了很多具有I2C总线接口的单片机及外围器件,如24C系列E2PROM,A/D和DA转换器PCF8951,MAX521和MAX5154,LCD驱动PCF8576等。用户可以根据数据操作要求,通过标准程序处理模块完成I2C总线的初始化和启动,就能完成规定的数据传送。,2.总线器件的寻址方式在一般的并行接口扩展系统中,器件地址都是由地址线的连接形式决定的,而在I2C总线系统中,地址是由器件类型及其地址引脚
34、电平决定的,对器件的寻址采用软件方法。I2C总线上的所有外围器件都有规范的器件地址。器件地址由7位组成,它与一位方向位共同构成了I2C总线器件的寻址字节。寻址字节(SLA)的格式如表5.3所示。,表5.3寻址字节格式,器件地址(DA3,DA2,DA1,DA0)是I2C总线外围器件的固有地址编码,器件出厂时就已经给定。例如,I2C总线E2PROM AT24C02的器件地址为1010,4位LED驱动器SAA1064的器件地址为0111。引脚地址(A2,A1,A0)是由I2C总线外围器件引脚所指定的地址端口,A2、A1和A0在电路中可接电源、接地或悬空,根据其连接状态形成地址代码。数据方向位(RW)
35、规定了总线上的单片机(主器件)与外围器件(从器件)的数据传送方向。RW=1,表示接收(读);RW=0,表示发送(写)。,3.总线的电气结构与驱动能力 如图5.19所示,I2C总线接口内部为双向传输电路。总线端口输出端为漏极开路,故总线上必须有上拉电阻。上拉电阻RP与电源电压VDD和总线串接电阻有关,可参考有关数据手册,通常取510 k。,图 5.19I2C总线接口的电气结构,I2C总线上的外围扩展器件都是CMOS器件,属于电压型负载。总线上的器件数量不是由电流负载能力决定的,而是由电容负载决定的。I2C总线上每个节点器件的接口都有一定的等效电容,这会造成信号传输的延迟。通常I2C总线的负载能力
36、为400 pF(通过驱动扩展可达4000 pF),据此可计算出总线长度及连接器件的数量。总线上每个外围器件都有一个器件地址,扩展器件时也要受器件地址空间的限制。I2C总线传输速率为100 kbs,新规范中传输速率可达400 kbs。,4.I2C总线上的数据传送1)数据传送I2C总线上每传送一位数据都与一个时钟脉冲相对应。在时钟线高电平期间,数据线上必须保持稳定的逻辑电平状态,高电平为数据“1”,低电平为数据“0”。只有在时钟为低电平时,才允许数据线上的电平状态变化。,I2C总线上数据传送的每一帧数据均为一字节。但启动I2C总线后,传送的字节数没有限制,只要求每传送一字节后,对方回答一个应答位。
37、总线传送完一字节后,可以通过对时钟的控制来使传送停止。例如,当某个外围器件接收N字节后,需要一段处理时间,以便接收以后的字节数据。这时可以在应答信号后,使SCL变为低电平,控制总线暂停;如果单片机要求总线暂停,则也可使时钟线保持低电平,控制总线暂停。,在发送时,首先发送的是数据的最高位。每次传送开始时有起始信号,结束时有停止信号。I2C总线的数据传送过程如图5.20所示。,图 5.20I2C总线的数据传送过程,2)总线信号I2C总线上与数据传送有关的信号有起始信号(S)、终止信号(P)、应答信号(A)、非应答信号(A)以及总线数据位。现分述如下:起始信号(S):在时钟SCL为高电平时,数据线S
38、DA出现由高到低的下降沿,被认为是起始信号。只有出现起始信号以后,其他命令才有效。,终止信号(P):在时钟SCL为高电平时,数据线SDA出现由低到高的上升沿,被认为是终止信号。随着终止信号的出现,所有外部操作都结束。起始信号和终止信号如图5.21所示。这两个信号都是由主器件产生的,总线上带有I2C总线接口的器件很容易检测到这些信号。但对于不具备I2C总线接口的一些单片机来说,为了准确地检测这些信号,必须保证在总线的一个时钟周期内对数据线至少进行两次采样。,图 5.21I2C总线的起始信号和终止信号,应答信号(A):I2C总线传送数据时,每传送一个字节数据后都必须有应答信号,与应答信号相对应的时
39、钟由主器件产生。这时,发送方必须在这一时钟上释放总线,使其处于高电平状态,以便接收方在这一位上送出应答信号。应答信号产生的时序如图5.22所示。应答信号在第9个时钟位上出现,接收方输出低电平为应答信号。,图 5.22I2C总线上的应答信号,非应答信号(A):每传送完一字节数据后,在第9个时钟位上接收方输出高电平为非应答信号。由于某种原因而使接收方不产生应答时(如接收方正在进行其他处理而无法接收总线上的数据),则必须释放总线,将数据线置高电平,然后主控器可通过产生一个停止信号来终止总线数据传输。当主器件接收来自从器件的数据时,接收到最后一个字节数据后,必须给从器件发送一个非应答信号(A),使从器
40、件释放数据总线,以便主器件发送停止信号,从而终止数据传送。,总线数据位:在I2C总线启动后或应答信号后的第18个时钟脉冲对应一个字节的8位数据传送。在数据传送期间,只要时钟线为高电平,数据线上必须保持稳定的逻辑电平状态,否则数据线上的任何变化都被当作起始或停止信号。,3)数据传送格式按照I2C总线规范,起始信号表明一次数据传送的开始,其后为寻址字节,在寻址字节后是按指定读、写操作的数据字节与应答位。在数据传送完成后,主器件必须发送停止信号。在起始信号与停止信号之间传输的数据字节数由单片机决定。,其中:SLA R为寻址字节(读);Data1Data n为从器件被读出的n个字节。主器件发送停止信号
41、前应发送非应答信号A,向从器件表明读操作要结束。主器件的读、写操作:在一次数据传输过程中需要改变传送方向的操作,此时起始位和寻址字节都会重复一次,但两次读、写方向正好相反。数据传送格式如下:,其中:Sr为重复起始信号,数据字节的传送方向决定于寻址字节的方向位;SLA WR和SLA RW分别表示写读寻址字节或读写寻址字节。,5.无I2C总线硬件控制接口的51单片机使用I2C总线时的接口模拟在使用I2C总线器件时,首先考虑带有I2C总线硬件控制接口的芯片,例如Philips公司的P87C591,CYPRESS公司的CY7C646XX等芯片。这些芯片有I2C总线硬件控制接口,只需按技术要求连接即可。
42、不带有I2C总线硬件控制接口的51单片机与I2C总线器件接口需采用软件模拟方法来实现数据传输。,1)单片机与I2C总线的硬件连接用不带I2C接口的51单片机控制I2C总线时,利用软件进行模拟,需在两条I/O线上形成SCL和SDA,与I2C总线的SCL和SDA直接相连,再加上拉电阻(5.1 k)即可。硬件接口如图5.23所示。,图 5.2351单片机与I2C器件连接,2)单片机对I2C总线的控制程序图5.23所示的单片机应用系统中只有一个CPU,这种单主系统采用I2C总线技术时,总线上只有单片机对I2C总线从器件的访问,没有总线的竞争等问题,这种情况下只需要模拟主发送和主接收时序。基于上述考虑,
43、硬件选用P1.6和P1.7作为时钟线SCL和数据线SDA,晶振采用6 MHz。软件提供一组模拟程序,包括启动(STA)、停止(STOP)、发送应答位(MACK)、发送非应答位(NMACK)、应答位检查(CACK)、发送一字节数据(WRBYT)、接收一字节数据(RDBYT)、发送N字节数据和接收N字节数据(RDNBYT)9个子程序。有了这组模拟子程序,即可实现I2C总线上的数据传输。,设计模拟子程序时,需模拟I2C总线典型信号时序。I2C总线数据传送时,有起始(S)、终止(P)、发送0代表应答(A)、发送1代表非应答(A)等信号。按照典型I2C总线传送速率的要求,这些信号、时序如图5.24(a)
44、、(b)、(c)和(d)所示。,图 5.24I2C总线数据传送典型信号时序(a)起始位;(b)终止位;(c)应答位;(d)非应答位,对于I2C总线的典型信号,可以用指令操作来模拟其时序过程。若51单片机的系统时钟为6 MHz,相应的单周期指令的周期为2 s,则有模拟起始(STA)、终止(STOP)、发送应答(MACK)、发送非应答(NMACK)的4个模拟子程序及5个调用上述模拟子程序的I2C总线数据传送子程序。5个数据传送子程序为有应答位检查(CACK)、发送一字节(WRBYTE)、接收一字节(RBYTE)、发送N字节(WRNBYTE)和接收N字节(RDNBYTE)。,(1)启动位I2C总线子
45、程序STA:STA:SETBSDASETB SCL NOP;起始条件建立时间大于4.7sNOPNOPCLR SDANOP;起始条件锁定时间大于4.7sNOPNOPCLR SCL;钳住总线,准备发送数据RET该程序产生了图5.24(a)所示的起始信号。,(2)停止位I2C总线子程序STOP:STOP:CLR SDASETB SCL;发送停止条件的时钟信号NOP;停止总线时间大于4.7sNOPNOPSETB SDA;停止总线NOPNOPNOPCLR SDACLR SCLRET该程序产生了图5.24(b)所示的停止信号。,(3)发送应答位信号子程序MACK:MACK:CLR SDASETB SCLN
46、OP;保持数据时间,即SCL为高,时间大于4.7sNOPNOPCLR SCLSETB SDARET该程序产生了图5.24(c)所示的应答信号。,(4)发送非应答位信号子程序NMACK:NMACK:SETBSDASETB SCL NOP;保持数据时间,即SCL为高,时间大于4.7sNOPNOPCLR SCLCLR SDARET该程序产生了图5.24(d)所示的非应答信号。,在使用上述子程序时,如果单片机的时钟不是6 MHz,则应调整NOP指令个数,以满足时序要求。(5)应答位检查子程序CACK。在应答位检查子程序(CACK)中,设置了标志位。CACK中用F0作标志位,当检查到正常应答位后,F0=
47、0;否则F0=1。CACK:SETB SDA;置SDA为输入方式SETB SCL;使SDA上数据有效,CLR F0;预设F0=0NOPMOV C,SDA;输入SDA引脚状态JNC CEND;检查SDA状态,正常应答转CEND,且F0=0SETB F0;无正常应答,F01CEND:CLR SCL;子程序结束,使SCL=0RET,(6)发送一字节数据子程序WRBYTE。该子程序是向虚拟I2C总线的数据线SDA上发送一字节数据的操作。调用该子程序前,将要发送的数据送入A中。占用资源:R0,C。WRBYTE:MOVR0,#08H;8位数据长度送R0中WLP:RLC A;发送数据左移,使发送位入CJC
48、WR1;判断发送1还是0,发送1转WRl,AJMP WR0;发送0转WR0WLP1:DJNZ R0,WLP;8位是否发送完,未完转WLPRET;8位发送完结束 WR1:SETB SDA;发送1程序段SETB SCLNOPNOPNOPCLR SCL,CLR SDAAJMP WLP1WR0:CLR SDA;发送0程序段SETB SCLNOPNOPNOPCLR SCLAJMP WLP1,(7)从SDA上接收一字节数据子程序RDBYTE。该子程序用来从SDA上读取一字节数据,执行本程序后,从SDA上读取的一字节数据存放在R2或A中。占用资源:R0、R2和C。,RDBYTE:MOV R0,#08H;8位
49、数据长度送R0中RLP:SETB SDA;置SDA为输入方式SETB SCL;使SDA上数据有效MOV C,SDA;读入SDA引脚状态MOV A,R2;读入0程序段,由C拼装入R2中RLC AMOV R2,ACLR SCL;使SCL=0可继续接收数据位DJNZ R0,RLP;8位读完了吗?未读完转RLPRET,(8)向被控器发送N字节数据子程序WRNBYTE。在I2C总线数据传送中,主控器常常需要连续地向外围器件发送多个字节数据,本子程序是用来向SDA线上发送N字节数据的操作。该子程序的编写必须按照I2C总线规定的读写操作格式进行。如主控器向I2C总线上某个外围器件连续发送N个数据字节时,其数
50、据操作格式如下:,其中,SLA W为外围器件寻址字节(写)。按照上述操作格式所编写的发送N字节的通用子程序(WRNBYTE)如下:WRNBYTE:MOVR3,NUMBYTE LCALL,STA;启动I2C总线 MOV A,SLA;发送SLAW字节 LCALL WRBYTE LCALL CACK;检查应答位,JB F0,WRNBYTE;非应答位则重发MOV R1,#MTDWRDA:MOV A,R1LCALL WRBYTELCALL CACKJB F0,WRNBYTEINC R1DJNZ R3,WRDALCALL STOPRET,在使用本子程序时,占用资源为R1和R3,但需调用STA、STOP、W