7.4.2 MCS-51系列单片机的串行接口及其通信功能
图7-41 异步串行通信的传送格式
1.异步串行通信协议
为确保通信过程的实现,通信双方或多方必须遵守一定的协议。通信协议也叫通信规程,是指通信双方在信息传输格式上的一种约定。数据通信中,在收/发器之间传送的是一组二进制的“0”、“1”位串,它们在不同的位置可有不同的含义,有的只是用于同步,有的代表了通信双方的地址,有的是一些控制信息,有的则是通信中真正要传送的数据,还有的是为了差错控制而附加上去的冗余位。这些都需要在通信协议中事先约定好,以形成一种收/发双方共同遵守的格式。在逐位传送的串行通信中,接收端必须能识别每个二进制位从什么时刻开始,这就是位定时。通信中一般以若干位表示一个字符,除了位定时外,还需要在接收端能识别每个字符从哪位开始,这是字符定时。异步串行通信时,每个字符作为一帧独立的信息,可以随机出现在数据流中,即每个字符出现在数据流中的相对时间是任意的。一个字符一旦开始出现后,字符中各位则是以预先固定的时钟传送,因此异步通信方式的“异步”主要体现在字符与字符之间,至于同一字符内部的位与位间却是同步的。可见,为了确保异步通信的正确性,必须找到一种方法,使收发双方在随机传送的字符与字符间实现同步。这种方法就是在字符格式中设置起始位和停止位,即在一个字符正式发送之前先发一个起始位,该字符结束时再发停止位。接收器检测到起始位便知道字符到达,开始接收字符,检测到停止位则知道字符已结束。由于这种通信协议是靠起始位和停止位来进行字符同步的,所以有时也称之为起止式协议。异步串行通信的传送格式如图7-41所示。每帧信息(即每个字符)由四部分组成:1位起始位,规定为低电平“0”;5~8位数据位,它紧跟在起始位后面,是要传送的有效信息,规定从低位至高位依次传送;0~1位奇偶校验位;1位、1位半或2位停止位,规定为高电平。
异步通信格式中起始位和停止位起着至关重要的作用,起始位标志每个字符的开始,通知接收器开始装配一个字符,以便和发送器取得同步。停止位标志每个字符的结束。通过起始位和停止位的巧妙结合,实现异步字符传送的同步。由于这种同步只需在一个字符期间保持,下一个字符又将包含新的起始位和停止位,所以发送器和接收器不必使用同一个时钟,只需分别使用两个频率相同的局部时钟,使它们在一个字符时间内收发双方的串行位流能保持同步,即可做到正确、可靠地传送。关键是接收器必须准确地发现每个字符开始出现的时刻,为此,协议规定起始位和停止位必须采用相反的极性,前者为低电平“0”,后者为高电平“1”。利用前一个字符的高电平停止位到后一个字符的低电平起始位的负跳变,接收器便知道这是一个字符的开始,可以以此作为新字符内位检测与采样的时间基准。正是为了保证这种从一个字符到另一个字符的转换,必须以负跳变开始,通信协议规定在字符与字符之间出现空闲状态时,空闲位也一律用停止位的“1”填充。
停止位长度规定可以取1位、1位半或2位。一般有效数据为5位(称为五单位字符码)时停止位取1位或1位半,其他单位的字符码停止位取1位或2位。至于有效数据位后面的奇偶校验位,协议规定可以有,也可以没有。在数据通信中,按照国际电报电话咨询委员会(CCITT)的建议,通常将逻辑“0”称为“空号”,而将逻辑“1”称为“传号”。按这种叫法,在异步通信中,每个字符的传送都必须以“空号”开始,以“传号”结束和填充空闲位。由于异步通信系统中接收器和发送器使用的是各自独立的控制时钟,尽管它们的频率要求选得相同,但实际上总不可能真正严格相同,两者的上下边沿不可避免地会出现一定的时间偏移。为了保证数据的正确传送,不致因收发双方时钟的相对误差而导致接收端的采样错误,除了如上所述,采用相反极性的起始位和停止位/空闲位提供准确的时间基准外,通常还采取以下两项措施。
1)接收器在每位码元的中心采样,以获得最大的收/发时钟频率偏差容限。这样在7~12位的整个字符传送期间,收/发双方时钟的偏差最多可允许有正、负半个位周期,只要不超过它,就不会产生采样错误。也就是说,要求收/发时钟的误差容限不超过4.17%(按每个字符最多12个码元算)即可。显然,这个要求是很容易实现的。为了保证在每个码元的中心位置采样,在准确知道起始位前沿的前提下,接收器在起始位前沿到来后,先等半个位周期采样一次,然后每过一个位周期采样一次,直到收到停止位。
2)接收器采用比传送波特率更高频率的时钟来控制采样时间,以提高采样的分辨能力和抗干扰能力。图7-42所示是用频率为16倍频波特率时钟的同步检测与采样过程。从图中可看出,利用这种经16倍频的接收时钟对串行数据流进行检测和采样,接收器能在一个位周期的1/16时间内决定出字符的开始。如果采样频率和传送波特率相同,没有这种倍频关系,则分辨率会很差。比如在起始位前沿出现之前刚采样一次,则下次采样要到起始位结束之前才进行。而假如在这个位周期期间因某种原因恰恰使接收端时钟往后偏移了一点点,就会错过起始位而导致整个后面各位检测和识别的错误。采样时钟采用16倍频(当然也可以采用其他倍数的频率,如32、64等)后,采样、检测过程如下:在停止位或任意数目空闲位的后面,接收器在每个接收时钟的上升沿对输入数据流进行采样,通过检测是否有9个连续的低电平,来确定它是否为起始位。如果是,则确认是起始位,且对应的是起始位中心,然后以此为准确的时间基准,每隔16个时钟周期采样一次,检测一个数据位。如不是9个连续低电平(即使9个采样值中有一个非“0”),则认为这一位是干扰信号,把它删除。可见,采用16倍频措施后,不仅有利于实现收发同步,而且有利于抗干扰和提高异步串行通信的可靠性。
图7-42 用频率为16倍频波特率时钟的同步检测与采样过程
2.串行接口的构成与工作方式
(1)串行接口的构成MCS-51系列单片机的串行口主要由两个物理上独立的串行数据缓冲器SBUF、发送控制器、接收控制器、零检测器和输入移位寄存器组成,如图7-43所示。发送数据缓冲器SBUF只能写入,不能读出;接收数据缓冲器SBUF只能读出,不能写入,两个缓冲器共用一个地址99H。两个特殊功能寄存器SCON和PCON控制串行接口的工作方式和波特率。波特率发生器可用定时器T1或T2构成。
图7-43 MCS-51系列单片机串口组成示意图
(2)串行接口控制寄存器MCS-51系列单片机对串行接口的控制是通过SCON寄存器实现的,同时也和电源控制寄存器PCON有关,其选口地址分别为98H和87H。SCON寄存器的位地址见表7-5。
表7-5 SCON寄存器的位地址
1)SM0、SM1:串行接口工作方式选择位,用于设定串行接口的工作方式,见表7-6。
2)SM2:工作方式2、3中的允许多机通信控制位,若SM2=0,串行接口以单机方式通信;若SM2=1和RB8=1,RI不仅被激活而且可以向CPU请求中断。
表7-6 串行接口工作方式
3)REN:允许接收控制位,REN=0,禁止串行口接收;REN=1,允许串行口接收。
4)TB8:发送数据第9位,用于方式2、3中存放要发送的第9位数据,可用软件置位与复位。
5)RB8:接收数据第9位,用于方式2、3中存放所接收的第9位数据,方式1中,若SM 2=0,RB8存放接收到的停止位。
6)TI:发送中断标志位,在方式0中,发送完第8位数据时,硬件自动置位;在其他方式中,在发送电路开始发送停止位时,由硬件自动置位。TI=1时,申请中断,CPU响应中断后,发送下一帧数据。在任何方式中,TI都必须由软件清零。
7)RI:接收中断标志位,在方式0中,第8位接收完毕,由硬件置位。其他方式中,在接收停止位的中间点由硬件置位。RI=1时申请中断,要求CPU取走数据。但在方式1中,SM2=1时,若未收到有效的停止位,不会对RI置位。RI须由软件清零。
(3)串行接口的工作方式 串行接口的四种工作方式中,串行通信只使用方式1、2、3,方式0主要用于扩展并行输入输出口。
1)方式0。在方式0状态下,串行接口为同步移位寄存器方式,其波特率是固定的,为fosc/12,数据由RXD(P 3.0)端出入,同步移位脉冲由TXD(P3.1)端输出,发送、接收的是8位数据,低位在先。串行接口方式0的时序如图7-52所示。
图7-44 串行接口方式0的时序
a)发送时序b)接收时序
①发送。执行任何一条将SBUF作为目的寄存器指令时,数据开始从RXD端串行发送,其波特率为振荡频率的1/12。方式0发送时的时序如图7-44a所示。
在写信号有效后,相隔一个机器周期,发送控制端SEND有效(高电平),允许RXD发送数据,同时,允许从TXD端输出移位脉冲,1帧(8位)数据发送完毕时,各控制端均恢复原状态,只有TI保持高电平,呈中断申请状态。要再次发送数据时,必须用软件将TI清零。
②接收。在满足REN=1和RI=0的条件下,就会启动一次接收过程。此时,RXD为串行输入端,TXD为同步脉冲输出端。串行接收的波特率也为振荡频率的1/12,其时序如图7-44b所示。同样,当接收完一帧(8位)数据后,控制信号复位,只有RI仍保持高电平,呈中断申请状态。再次接受时,必须通过软件清零。
2)方式1。在方式1状态下,串行接口为8位异步通信接口。一帧信息为10位:1位起始位(0),8位数据(低位在先)和1位停止位(1),TXD为发送端,RXD为接收端,波特率不变。串行接口方式1的时序如图7-45所示。
①发送。串行接口以方式1发送时,数据由TXD端输出,CPU执行一条写入SBUF的指令后,启动串行接口发送,发送完一帧信息时,发送中断标志置1,其时序如图7-45a所示。
②接收。方式1的接收时序如图7-45b所示。数据从RXD端输入。当允许输入位REN置1后,接收器便以波特率的16倍速率采样RXD端电平,当采样到1至0的跳变时,启动接收器接收,并复位内部的16分频计数器,以实现同步。计数器的16个状态把1位等分成16份,并在第7、8、9个计数状态时,采样RXD电平,因此每一位的数值采样三次,至少两次相同的值才被确认。在起始位如果接收到的值不是0,则起始位无效。在检测到一个1到0跳变时,再重新启动接收器,如果接收值为0,起始位有效、则开始接收本帧的其余信息。在RI=0的状态下,接收到停止位为1(或SM2=0)时,将停止位送入RB8,8位数据进入接收缓冲器SBUF,并置RI=1中断标志。
在方式1的接收中设置有数据辨识功能,即在同时满足以下两个条件时接收下一帧数据:①接收数据有效实现装载,即SBUF、RB8及RI置1;②接收控制器再次采样RXD的负跳变。
RI=0;
SM2=0或接收到的停止位等于1。
如果上述条件任一不满足,所接收的数据无效,接收控制器不再恢复。
图7-4 5串行接口方式1的时序
a)发送时序 b)接收时序
3)方式2和3。串行接口工作在方式2、3时,为9位异步通信口,发送、接收一帧信息由11位组成,即起始位1位(0)、数据8位(低位在先)、1位可编程位(第9数据位)和1位停止值(1)。发送时,可编程位(TB8)可设置0或1;接收时,可编程位送入SC0N中的RB8。串行接口方式2、3的时序如图7-46所示。
方式2、3的区别在于:方式2的波特率为fosc/32或fosc/64,即fosc/(64/2 SMOD),而方式3的波特率可变。
①发送。方式2、3发送时,数据由TXD端输出,附加的第9位数据为SCON中的TB8。CPU执行一条写入SBUF的指令后,立即启动发送器发送,送完一帧信息时,置TI=1中断标志。其时序如图7-46a所示。
②接收。与方式1类似,当REN=1时,CPU开始不断地对RXD采样,采样速率为波特率的16倍,当检测到负跳变后启动接收器,位检测器对每位采集3个值,用采3取2办法确定每位状态。当采至最后一位时,将8位数据装入SBUF,第9位数据装入RB8并置RI=1。其时序如图7-46b所示。
同样,方式2、3中也设置有数据辨识功能。即当RI=0、SM2=0或接收到的第9位的数据等于1的任一条件不满足时,所接收的数据帧无效。
图7-46 串行接口方式2、3的时序
a)发送时序 b)接收时序
3.串行接口的典型应用
(1)波特率设置 串行接口在方式0和方式2工作时,其波特率为固定值。方式0发送接收时,其波特率为振荡频率的1/12(fosc/12),方式2发送接收时,其波特率为fosc/(64/2 SMOD)。串行接口在方式1和方式3的波特率可变,与溢出率有关。MCS-51系列单片机系统中常用定时器1作为波特率发生器,其波特率由下式确定:
波特率=(定时/计数器1的溢出率)/(32/2 SMOD)
式中 SMOD——特殊功能寄存器PCON中的第8位特征位;
定时/计数器的溢出率取决于计数速率和定时时间常数。
T1工作于自动装载方式的工作方式2时,TL1作计数用,自动重装的值放在TH1,溢出率可由下式确定:
溢出率=计数速率/[256-(TH1)]
时,计数速率=fosc/12,表7-7是定时器1产生的常用波特率初始值。
表7-7 定时器1产生的常用波特率初始值
(2)串行发送、接收实例
例1:设计一个发送程序,将片内RAM50H~5FH中的数据串行发送,串行接口设定为方式2状态,TB8作奇偶校验位。在数据写入发送缓冲器之前,先将数据的奇偶位P写入TB8,这时第9位数据作奇偶校验用。
程序清单如下:
例2:设计一个接收程序,将接收的16个字节数据送入片内RAM的50H-5FH单元中。设串行接口为方式3工作状态,波特率为2400bit/s。定时器/计数器l作波特率发生器时,SMOD=0,计数常数为F4H。
程序清单如下: