8098的串行中有三种异步工作方式和一种同步工作方式,当8098的串行口工作于异步方式时,它是一种全双工操作方式,即能同时接收和发送数据。另外由于接收数据缓冲器采用的是双缓冲器,故在第一个所接收到的字节被读出之前,就可开始接收第二个字节的内容。
虽然8098的串行发送寄存器和接收寄存器是采用的同一个地址单元(07H),但它们在物理空间上是分开的,接收缓冲寄存器SBUF(RX)用来存放被接收到的数据,发送缓冲寄存器SBUF(TX)则用来寄放待发送的数据。值得注意的是,不能用任何指令对SBUF(RX)直接写入或对SBUF(TX)读出。8098设有一个独立的波特率发生器供串行通信用,当使用串行口时,HSI、HSO和定时器的功能不会受到影响。
串行口的工作方式
方式0:方式0是一种同步工作方式,它主要与移位寄存器配合作I/O扩展,在方式0工作方式时,8098的RXD引脚作为串行数据的发送和接收端,TXD引脚则输出移位信号。在发送和接收数据时,都是低有效位在前。图1是方式0串行通信的时序示意图。在方式0状态,8098不能同时发送和接收数据,但经适当扩展之后,就能实现同时发送和接收的目的。

方式1:方式1为标准的异步通信方式,这种方式中数据帧的格式见图2。它们由10位组成,1位起始位(0),8位数据位(低有效位在前),1位停止位(1)。

采用方式1通信时,可用中断方式进行数据通信,当一数据帧中最后一个数据位发送完时,发送中断标志TI被置位,在接收时,最后一位数据被接收到之后,接收中断标志RI被置位。如果奇偶校验允许的话(将PEN置1),则发送数据时,第8位数据将由偶校验位取代。
方式2:方式2是一种异步第9位确认通信方式。这种方式常与方式3配合用于多机通信。数据帧的示意图见图3,它们由一个起始位(0),9位数据位(低有效位在前)和一个停止位(1)组成。如果在将数据写入到SBUF(TX)之前,将控制寄存器中的TB8置位的话,被传送的第9位数据就置1。但应注意,位TB8在传送之后就被清零,如果希望传送TB8位的话,应每次将数据写入。

当接收时,只有检测到第9位数据是1时才会激活串行口中断(RI置1),如果第9位不为1,则不能激活串行口中断。利用这个方式,能很方便地在数据链中选择所需要接收的数据。在方式2中不能使用奇偶校验。
方式3:方式3也是一种异步第9位确认通信方式,其数据帧和操作时序与方式2相同,利用方式3发送数据时,仍然是通过SP—CON寄存器中的TB8来对第9位赋值(置位或清零)。与方式2不同的是,在方式3中,当接收数据时,无论第9位是否置位,都激活串行通信中断。在利用方式3通信时,允许使用奇偶校验,即将SP—CON寄存器中的PEN置1时,数据中的第9位即为奇偶校验位。
串行口的控制
对串行口的控制是通过串行口控制寄存器(SP—CON)和串行状态寄存器(SP—STAT)来进行的。
1.控制寄存器和状态寄存器。控制寄存器和状态寄存器的地址是11H,11H寄存器的高3位是串行口的状态寄存器(只读),它的低5位是控制寄存器(只写),它们各位的定义见图4。当读SP—STAT(串行口状态寄存器)时低5位是不确定值,而对SP—CON(串行口控制寄存器)写入数据时,其高3位数据是无效的,高3位的数据不会影响芯片功能。

当串行口发送或接收操作完成时,相应的中断标志TI或RI将置位,以便使CPU继续发送准备接收下一帧数据或作其它工作。串行口每发送一帧数据后,都自动将TB8清零。在读SP—STAT后,TI和RI将被清零。
由于TXD和P2.0共用一个引脚,因此在使用串行口时,应将I/O控制寄存器1(IOC1)中的第5位(IOC1.5)置1,以选择TXD功能。
在方式0状态下,当REN=1时,写SBUF(TX)将启动一次发送。使REN从0到1跳变或当REN=1而清RI时,就会开始一次串行信号的接收。若使REN=0,将禁止正在进行的串行接收过程,并禁止继续接收。为了避免串行信号的部分接收和完全不需要的接收,在清除RI之前应使REN=0。
在异步串行通信方式时,写数据到BUF(TX)将启动一次发送过程。如果REN被置为1,RXD引脚上的一个下降沿将启动接收过程。只有在第一个数据的结束位被传送完之后,新写入到BUF(TX)之中的数据才会被发送。
在所有的四种方式中,当接收数据时,只有最后一位被采样(大约是在此位的数据达到的中间时刻),RI标志才置位。同样,在发送数据时,只有最后一位(第8位或第9位)被发送时,也是在此位的数据达到的中间时刻,TI标志才置位。在读SP—STAT(串行控制寄存器)时,会清除RI和TI标置,但并不清串行通信口的接收或发送。RI和TI有一个置位,就会引起串行中断标志位置位。注意:改变串行口的工作方式时,应将串行口复位,并中止通道上的发送和接收过程。若将TXD引脚和RXD引脚联在一起,用来测试串行口的话,应先将RI置位。
2.串行口发送和接收缓冲器。串行口的发送缓冲器SUBF(TX)和接收缓冲器SUBF(RX)共用一个字节地址07H,它们是串行通信口与片内CPU之间的一个窗口,CPU将欲发送的数据写入SUBF(TX)之中;也是从SUBF(RX)之中取出串行口所接收到的数据。一旦一帧信息中的最后一个数据位(即停止位前的一个数据位)写入到缓冲器或从缓冲器中读出,即会产生相应的发送或接收中断。串行口自动地将RXD引脚接收到的数据送入到SBUF(TX)缓冲器之中,或将SBUF(TX)缓冲器中的数据送往TXD引脚。
3.波特率的确定。在所有的四种方式中,波特率是由16位寄存器000EH中的内容决定的,在对该寄存器操作时,应连续对该寄存器进行两次写操作。第一次将低位字节写入,第二次将高位字节写入。在加载第一字节和第二字节期间,串行口将不起作用。波特率寄存器的最高位应置为1,以选择XTAL1频率(即振荡频率)作为波特率发生器的时钟。
若波特率寄存器的低15位用一个无符号整数B表示,不同工作方式下的串行口的波特率可按如下公式计算:方式0,波特率=XTAL1频率/4(B+1),B≠0;其它方式,波特率=XTAL1频率/64(B+1)。
当采用12MHz晶体振荡时,XTAL1频率为12MHz,这种情况下常用波特率如附表所示。同步方式的最大波特率为1.5M波特,异步方式的最大波特率为187.5波特。

4.多机通信。8098串行通信的方式2和方式3提供了多机通信的功能,多机通信主要利用方式2的可不产生中断的特点,即如果被接收的第9位数据不是1,则不会引起串行口中断。多机通信的原理简述如下:多机通信开始前,主机和从机皆工作于方式2,当主机欲传送数据块到某个从机时,主机首先发送一帧地址识别数据到目标从机,由于地址数据帧的第9位是1,而普通数据帧的第9位是0,工作在方式2状态下的从机,对数据帧不会产生中断,而地址数据帧则都会产生中断,所有从机都读取由主机发来的地址数据。当某一从机检测到主机发来的地址与自己的地址一致时,则将串行口由方式2转为方式3,以便接收主机随后送来的数据。而其它从机则继续工作在方式2状态,对主机发送的数据帧不予理睬,继续处理自己的事务。
串行口使用注意事项
①当使用串行口时,首先应要对IOC1控制寄存器写入相应的数,以选择P2.0作为串行口的TXD引线,要使P2.1作为串行通信口的接收引线RXD,则要将串行控制状态寄存器的第3位REN置1。
②由于串行口的中断入口地址只有一个,在中断服务程序中还应通过软件来查询SP—STAT寄存器中RI及TI的状态来确定是发送中断还是接收中断。在查询SP—STAT寄存器状态时,要注意对SP—STAT寄存器中内容的保护,其保护方法与保护IOS1寄存器的方法相同,采用间接读出。因为直接读取SP—STAT寄存器中的内容,会改变SP—STAT的内容。 (朱小华 陈尚品 梁建国)