第五节 串行接口
中央处理器CPU和外界的信息交换称为通信。通常有并行和串行两种通信方式,数据的各位同时传送的称为并行通信,数据一位一位串行地顺序传送的称为串行通信。
并行通信通过并行接口来实现,如MCS51的P1口就是并行接口。串行通信通过串行口来实现,MCS 51有一个全双工的异步串行接口可以用于串行数据通信。
一、串行接口的组成和特性
MCS-51的串行口是一个全双工的异步串行通信接口,可以同时发送和接收数据。串行口的内部有数据接收缓冲器和数据发送缓冲器。数据接收缓冲器只能读出不能写入,数据发送缓冲器只能写入不能读出,这两个数据缓冲器都用符号SBUF来表示,地址都是99H。CPU对特殊功能寄存器SBUF执行写操作,就是将数据写入发送缓冲器;对SBUF读操作,就是读出接收缓冲器的内容。
特殊功能寄存器SCON存放串行口的控制和状态信息,串行口用定时器T1或T2(8052)作为波特率发生器,特殊功能寄存器PCON的最高位SMOD为串行口波特率的倍率控制位。
1.串行口控制寄存器SCON
串行口控制寄存器SCON是一个特殊功能寄存器,地址为98H,具有位寻址功能。其格式如下:
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
SM0、SM1:串行口的方式选择位。功能如表2-10所示。
表2-10
串行口四种工作方式
SM2:允许方式2和3的多机通信控制位。对于方式2或3,如SM2置为1,则接收到的第9位数据(RB8)为0时不激活RI。对于方式1,如SM2=1,则只有接收到有效的停止位时才会激活RI。对于方式0,SM2应该为0。
REN:允许串行接收位。由软件置位“1”以允许接收。由软件清“0”来禁止接收。TB8:对于方式2和3,是发送的第9位数据。需要时由软件置位或复位。
RB8:对于方式2和3,是接收到的第9位数据。对于方式1,如SM2=0,RB8是接收到的停止位。对于方式0,不使用RB8。
TI:发送中断标志。由硬件在方式0串行发送第8位结束时置位,或在其他方式串行发送停止位的开始时置位。必须由软件清“0”。
RI:接收中断标志。由硬件在方式0接收到第8位结束时置位,或在其他方式接收到停止位的中间时置位。必须由软件清“0”。
2.电源控制寄存器PCON
电源控制寄存器PCON格式如下:
SMOD
—
—
—
GF1
GF0
PD
IDL
PCON的最高位是串行口波特率系数控制位SMOD,当SMOD为1时使波特率加倍。PCON的其他位为节电方式控制位(CHMOS器件有效,详见节电方式一节)。
二、串行接口的工作方式
MCS-51串行接口具有四种工作方式,我们主要从应用的角度讨论各种工作方式的功能特性和工作原理。
1.方式0
方式0是外接移位寄存器的工作方式,用以扩展I/O接口。输出时将发送数据缓冲器中的内容串行地移到外部的移位寄存器,输入时将外部移位寄存器内容移入内部的输入移位寄存器,然后写入内部的接收数据缓冲器。
在以方式0工作时数据由RXD串行地输入/输出,TXD输出移位脉冲,使外部的移位寄存器移位。波特率固定为振荡器频率的1/12。方式0时串行口简化的逻辑结构框图如
图2-17所示。
图2-17 串行口方式0结构
(1)方式0输出。CPU对发送数据缓冲器SBUF写入一个数据,就启动串行口发送,发送的时序如图2-18所示。
发送时,发送指令“写SBUF”打开三态门1,这样经内部总线送来的8位并行数据就可以写入发送数据缓冲器SBUF。写信号同时启动发送控制器。经一个机器周期,发送控制端SEND有效,打开门5和门6,允许RXD引脚向外发送数据,同时TXD引脚输出同步移位脉冲。在由时钟信号触发产生的内部移位脉冲作用下,发送数据缓冲器SBUF中待发送的数据逐位串行输出。因为每一个机器周期只能发送一位数据,故波特率为fosc/12。外部时钟信号同时在TXD上产生同步移位脉冲,每一个机器周期从TXD上输出一个同步移位脉冲。一帧(8位)数据发送完毕,SEND恢复低电平,停止发送。且发送控制器硬件置发送中断标志TI=1。这时如果允许发送中断,则进入发送中断处理程序。如果图2-18 串行口方式0的发送时序
要再次发送数据,则必须在发送前用软件清TI为0。
(2)方式0输入。当RI=0时,将REN置1就启动了接收。此时RXD为串行数据接收端,TXD依然输出同步移位脉冲。方式0的接收时序如图2-19所示。
图2-19 串行口方式0的接收时序
接收过程启动后,经过一个机器周期,接收控制端RECV有效,打开门6,允许TXD输出同步移位脉冲。在同步移位脉冲的控制下,外设逐位的向单片机输送数据。因为仍然是一个机器周期输送一位数据,故波特率也不变,仍为fosc/12。在内部移位脉冲控制下,RXD上外设传入的串行数据逐位移入移位寄存器。当一帧(8位)数据全部移入移位寄存器后,接收控制器使RECV失效,停止输出移位脉冲,发出“装载SBUF”信号,打开三态门2,将8位串行数据并行送入接收缓冲器SBUF。同时,接收控制器硬件将RI置1,向CPU申请中断。如果CPU允许串行口接收中断,则响应中断。一般来说,在接收中断处理程序中至少要做两件事,一是将RI清零,以备接收下一帧数据;二是将SBUF中接收到的数据移出。在执行读取SBUF指令后,CPU发出“读SBUF”信号,打开三态门3,数据经内部总线进入CPU。
2.方式1
串行口定义为方式1时,它是一个8位异步串行通信口,TXD为数据输出线,RXD为数据输入线。传送一帧信息的数据为10位:1位起始位,8位数据位(先低位后高位),1位停止位。方式1的波特率由定时器T1或T2(8052)的溢出率确定。方式1时串行口简化的逻辑结构框图如图220所示。
图2-20 串行口方式1、2、3的结构
(1)方式1输出。CPU执行一条写SBUF指令后便启动了串行口发送,其输入时序如
图2-21(a)所示。
图2-21 串行口方式1的时序
在指令执行期间,CPU送来“写SBUF”信号,将并行数据送入SBUF,并启动发送控制器,经一个机器周期,发送控制器的SEND、DATA相继有效,通过输出控制门从TXD上逐位输出一帧信号。一帧信号发送完毕后,SEND、DATA失效,发送控制器硬件置发送中断标志TI=1,向CPU申请中断。
(2)方式1输入。输入的时序如图2-21(b)所示。当允许接收标志REN=1时,接收器便以用户所设波特率的16倍速率采样RXD脚状态。在采样信号的负跳变时启动接收控制器接收数据。为了避免通信双方波特率微小不同的误差影响,接收控制器将一位数据的传送时间等分为16份,并在第7、8、9三个状态由位检测器采样RXD三次,取三次采样中至少两次相同的值作为数据。这样可以大大减少干扰影响,保证通信准确无误。
如果接收到的起始位不为0,则起始位无效,复位接收电路,重新开始接收。接收到起始位0后,开始接收本帧数据,当8位数据和停止位都接收完毕后,如果RI=1,则接收的数据将会丢失。如果RI=0,并且SM2=0或停止位为1,则表示接收数据有效,开
始装载SBUF,8位有效数据送入SBUF,停止位送入RB8,同时硬件置RI=1,向CPU
申请中断,TI必须由用户用软件清0。无论数据接收有效无效,接收控制器将再次采样RXD引脚的负跳变,以接收下一帧信息。
3.方式2和方式3
串行口工作在方式2时为9位异步串行通信口。方式2与方式1不同的是,它的数据是9位的,即它的一帧包括11位,1个开始位,9个数据位和1个停止位。其中第9位(即D8)数据是可由用户编程的,可用来作奇偶校验,也可用来作地址数据标志位。
当SM0=1、SM1=1时,串行口工作在方式3。方式3与方式2极其接近,它们之间唯一的差别在于波特率不同。方式2是波特率固定的,而方式3的波特率是可变的。
方式2和方式3的发送和接收与方式1相似,只是发送时将SCON寄存器中的TB8取出,作为第9位数据发送;接收时,若接收有效,则将接收到的第9位数据送到SCON
的RB8保存。
方式2和方式3多用于多机通信。三、波特率
1.方式0波特率
串行口方式0的波特率由振荡器的频率所确定:方式0波特率=振荡器频率/12
2.方式2波特率
串行口方式2的波特率由振荡器的频率和SMOD(PCON.7)所确定:
方式2波特率=2SMOD×振荡器频率/64
3.方式1和方式3的波特率
串行口方式1和方式3的波特率由定时器T1或T2(8052等单片机)的溢出率和SMOD所确定。T1和T2是可编程的,可以选的波特率范围比较大,因此串行口方式1和3是最常用的工作方式。
(1)用定时器T1产生波特率。当定时器T1作为串行口的波特率发生器时,串行口方式1和3的波特率由下式确定:
方式1和3波特率=2SMOD×(T1溢出率)/32
定时器T1作波特率发生器时,应禁止T1中断。通常T1工作于定时方式(C/T=0),计数脉冲为振荡器的十二分频信号。也可以选择外部T1(P3.5)上的输入脉冲作为T1计数信号(C/T=1)。T1的溢出率又和它的工作方式有关,一般选方式2定时,此时波特率的计算公式为:
方式1和方式3波特率=2SMOD×振荡器频率/﹛32×12[256(TH1)]﹜
(2)用定时器T2产生波特率。8052等单片机内的定时器T2也可以作为串行口的波特率发生器,置位T2CON中的TCLK或RCLK位,T2就工作于串行口的波特率发生器方式。这时T2的逻辑结构框图如图2-22所示。
图2-22 T2波特率发生器方式结构
T2的波特率发生器方式和计数初值常数自动再装入方式相似,若C/T2=0,以振荡器的二分频信号作为T2的计数脉冲,C/T2=1时,计数脉冲是外部引脚T2(P1.0)上的输入信号。T2作为波特率发生器时,当TH2计数溢出时,将RCAP2H和RCAP2L中常数自动装入TH2、TL2,使T2从这个初值开始计数,但是并不置“1”TF2,RCAP2H和RCAP2L中的常数由软件设定后,T2的溢出率是严格不变的,因而使串行口方式1和3的波特率非常稳定,其值为:
方式1和3波特率=振荡器频率/32[65536-(RCAP2H)(RCAP2L)]
T2工作于波特率发生器方式时,计数溢出时不会置“1”TF2,不向CPU请求中断,
因此可以不必禁止T2的中断。如果EXEN2为1,当T2EX(P1.1)上输入电平发生“1”至“0”的负跳变时,也不会引起RCAP2H和RCAP2L中的常数装入TH2、TL2,仅仅
置位EXF2,向CPU请求中断,因此T2EX可以作为一个外部中断源使用。
在T2计数过程中(TR2=1)不应该对TH2、TL2进行读/写。如果读,则读出结果不会精确(因为每个状态加1);如果写,则会影响T2的溢出率使波特率不稳定。在T2的计数过程中可以对RCAP2H和RCAP2L进行读但不能写,如果写也将使波特率不稳
定。因此,在初始化中,应先对TH2、TL2、RCAP2H、RCAP2L初始化编程以后才置“1”TR2,启动T2计数。