第四章 可编程串行接口芯片8251A
1 串行通信的基本知识
微机与外部设备或其他计算机之间进行信息交换称之为通信。如图1所示,微机的通信方式有两种: 并行通信:数据的各位同时发送或接收,如微机与存储器或并行打印机之间的通信。其优点是传送速度快,缺点是使用传输线较多,不适合远距离传送数据。
串行通信:数据按一位一位顺序发送或接收。串行通信只用1位数据线传送数据的位信号,较为经济,适用于远距离数据传送,但数据传送的速度较低。串行通信要求的数据转换格式、时间控制等逻辑电路一般集成在可编程串行通信控制器之中。
图1并行和串行通信示意图
1.1 串行通信的传输方式
图2 串行通信的连接示意图
如图2所示,串行通信的传输方式有3种:
第一种是单工方式,只允许数据向一个方向传送,图2(a)中,甲站只作发送器,乙站只作接收器,数据流的方向只能从甲到乙。
第二种是半双工方式,允许数据向两个方向中的任一个方向传送,但通信双方不能同时收发数据,图2(b)中,甲站、乙站既可作为发送器,也可作为接收器。数据流的方向可以是从甲到乙,也可以是从乙到甲,但在同一时间只能进行一个方向的传送。
第三种是全双工方式,通信双方能够同时发送和接收数据。有两根数据线,可支持数据流在两个方向同时传送,如图2 (c)所示。
1.2 异步通信和同步通信
串行通信有两种基本方式:异步通信和同步通信方式。
(1)异步通信
在异步通信中,数据是一帧一帧传送的。异步通信的帧格式如图3所示, 一个字符称为一帧。
图3 异步通信帧格式
①起始位
通信线上没有数据被传送时处于逻辑“1”状态。当发送设备发送一个字符数据时,首先发出一个逻辑“0”信号,这个逻辑低电平就是起始位。起始位通过通信线传向接收设备,接受设备检测到这个逻辑低电平后,就开始准备接收数据位信号。起始位所起的作用就是使设备同步,通信双方必须在传送数据位前协调同步。
②数据位
当接收设备收到起始位后,紧接着就会收到数据位。数据位的个数可以是5、6、7、8中的一个。MCS-51单片机串行口采用8位数据传送。这些数据位被接收到移位寄存器中构成数据字符。在字符数据传送过程中,数据位从最低有效位开始发送,依次顺序在接收设备中被转换成并行数据。
③奇偶校验位
数据位发送完毕后,可以发送奇偶校验位。奇偶校验用于有限差错检测,通信双方需要约定一致的奇偶校验方式。若选择偶校验方式,那么组成数据位和奇偶位的逻辑“1”的个数必须是偶数个;若选择奇校验方式,那么组成数据位和奇偶位的逻辑“1”的个数必须是奇数个。奇偶校验位可省略或改为其他控制位。
④停止位
在奇偶校验位或数据位(无奇偶校验位时) 之后发送的是停止位。停止位是一个字符数据的结束标志,可以是1位、1.5位或2位的高电平。接收设备收到停止位后,通信线上又恢复逻辑“1”状态,直到下一个字符的起始位的到来。
图3中,如帧格式为一个起始位、8个数据位、一个停止位,无校验位,即为常见的N.8.1帧格式(10位) 。欧美的仪器设备异步串行通信采用“9600波特,N.8.1”格式,我国一般采用欧美标准。
(2)同步通信
同步通信中,数据开始传送前用同步字符来指示,并由时钟实现发送和接收端同步,即检测到同步字符后,就连续传送数据,直到通信结束。
同步通信不用起始位和停止位来标识字符的开始和结束,而是用一串特定的二进制序列,称为同步字符,去通知接收方串行数据第一位何时到达。紧随其后的是欲传送的n 个字符(n的大小可由用户设定和改变) ,字符间不留空隙。最后是两个错误校验字符。
几种常用的同步串行传送格式如图4所示。对同步字符的检测和同步控制,在串行接口芯片内部进行,称为内同步。内同步又分为单同步(只有一个字节的同步字符) 和双同步(有两个字节的同步字符) ,SDLC/HDLC是属于内同步的一种。而外同步是指对同步信号的检测在串行接口芯片的外部进行,当外部硬件电路检测到同步字符时,就给串行接口发来一个同步信号SYNC 。当串行接口收到同步信号后,立即开始接收信息。
图4 同步通信数据格式
同步通信中,在同步时钟信号的一个周期里,数据线上同步地发送一位数据。而且成千上万的数据是连续发送,中间没有空隙。这就要求接收方的时钟应与发送方的时钟完全同频同相,不能有一点误差。因此,在近距离传送时,如几百~数千米,可以在传输线中增加一条时钟线,以确保收发双方使用同一时钟。在数公里以上的远距离通信中,则通过调制解调器从数据流中提取同步信号,以得到与发送方完全同频同相的时钟。
总的来说,由于异步通信的每个字符都要加控制信息,因此数据传输效率不高,一般适用于数据量较小,传输率较低的场合。而在高速传送时,往往采用同步通信。
1.3 波特率
比特率是指每秒传送的二进制位数,单位是b/s(bit/s);波特率是指每秒传送的N进制位数,单位是baud(波特) 。两者的关系是:比特率=波特率log 2N 。由于计算机中的数据均采用二进制表示,因此比特率和波特率是一致的,常常混用。
例如,某串行通信系统,每秒传输120个字符,每个字符包含10位二进制数(N.8.1帧格式) ,则波特率为120×10=1200baud ,即1200b/s;而每一位二进制代码的传输时间即为波特率的倒数:T b =1/1200 b/s =0.833ms。
计算机通信中,常用波特率表示通信速率。国际上规定了标准波特率系列,最常用的标准值是110波特、300波特、600波特、1200波特、1800波特、2400波特、4800波特、9600波特、19200波特、57600波特和115200波特等。
1.4 串并转换和设备同步
串行通信主要要解决两个问题:一是数据串并转换问题,二是设备同步问题。
串并转换是指如何把发送的并行数据串行化,把接收的串行数据并行化,即串并数据转化的问题。MCS-51单片机的串行口和IBM PC机中的8250都有这种功能。
进行串行通信的双方设备必须同步工作才能有效检测通信线路上的信号变化,从而采样传送数据脉冲。只有同步双方设备的工作节拍,才能确保发送数据在接收端被正确读出。设备同步要求通信双方必须采用统一的编码方法,并要求通信双方能够产生相同的传送速率。采用统一的编码方法确定了一个字
符二进制值的位发送顺序和位串长度,还包括统一的逻辑电平规定,即电平高低与逻辑“1”、“0”之间的固定对应关系。双方设备产生相同的传送速率才能确保设备同步,这就要求发送设备和接收设备采用相同频率的时钟,发送设备在统一的时钟脉冲上发出数据,接收设备才能正确检测出与时钟脉冲同步的数据信号。
在串行通信中,发送端需要用时钟来决定每1位对应的时间长度,接收端也需要用一个时钟来决定每1位的时间长度,前一个时钟叫发送时钟,后一个时钟叫接收时钟。往往根据数据传送的波特率来确定串行接口的发送时钟和接收时钟的频率。它们和波特率之间有如下关系:时钟频率=n ×波特率。式中,n 为波特率因子或波特率系数,其值可以为1、16、32或64。若波特率因子为1(时钟频率等于波特率) ,则由于异步通信收、发双方各有自己的时钟信号,双方的时钟频率稍有偏差或不同相位就容易产生接收错误。因此在异步通信中,往往采用较高频率的时钟信号,如波特率16倍频或64倍频。
如图5所示,以接收时钟频率=16×波特率(Tb =16T)为例,说明字符的接收过程。
图5 采用16倍波特率时钟频率的字符接收过程
传送开始后,接收设备在接收时钟的上升沿不断检测传输线。如果在一系列的“1”之后检测到一个“0”,紧接着又连续采样到8个“0”,则确定为一帧的起始位。此后就每隔16个时钟采样一次数据,移位接收数据位和奇偶校验位。当检测到停止位,就将接收到的有效字符装载到串口的接收缓冲器中。
可以看出,异步通信采用起始位作为同步信号。接收方在收到起始位后,只要在一个帧的传输时间内与发送方保持同步,就能够正确接收数据。即使收发双方的时钟略有偏差,只要这种偏差不产生积累效应,问题就不大。所以,在异步通信中,收发双方可以不用同一时钟,只要使用同一标称频率即可。
2 RS-232C串行总线接口标准
串行通信的格式及约定(如同步方式、通讯速率、数据块格式、信号电平等) 不同,形成了多种串行通信的协议与接口标准。常见的有:通用异步收发器(UART)、通用串行总线(USB)、单总线(1-Wire)、I 2C 总线、CAN 总线、SPI 总线、1394、RS-232C/RS422A/RS-485标准,等等。上述标准总线中,目前用得最多和最广泛的则首推RS-232C(C表示已修改3次) 。由于RS-232C 总线标准制定时间较早(1962年由美国电子工业协会EIA 颁布) ,其目的是为了解决数据终端设备(DTE)和数据通信设备(DCE)距离之间的数据通信,而在抗干扰和传输距离上并没有太多的考虑,因此也有通信距离近(19200b/s传输速率下约15m) 、抗干扰能力差的缺陷。为解决这一问题,其后EIA 又发布了RS-422、RS-485等工业标准,它在提高传输速率和距离、抗干扰特性上做了很多努力,目前已广泛应用于各种工业现场。
2.1 RS-232C串行总线接口标准
(1)RS-232C接口信号
图6 25针和9针D 型接插件
RS-232C 标准规定了22条控制信号线,使用25针D 型接插件(DB25)连接。在实际应用中,并不一定需要用到所有的控制信号,如当计算机与外部设备不经过调制解调器直接通信时,常常只用到3~9条引线,因此可采用9针D 型接插件(DB9)连接。25针和9针D 型接插件如图6所示。下面仅介绍9针D 形接插件的控制信号定义(所有控制信号的方向均是从数据终端设备的角度来定义) :
TxD(3号针) :串行数据的发送端,输出。
RxD(2号针) :串行数据的接收端,输入。
RTS(7号针) :请求发送信号,输出。当RTS 为高电平时,表明终端(DTE)要向MODEM 或其他通信设备发送数据。
CTS(8号针) :清除发送(允许发送) 信号,输入。当MODEM 或外设准备好接收来自终端(DTE)的数据时,使为高电平。
DTR(4号针) :终端准备就绪信号,输出。当DTR 为高电平时,表明终端(DTE)准备好接收来自MODEM 或其他外设的数据。
DSR(6号针) :数据装置准备就绪信号,输入。当DSR 为高电平时,表明MODEM 或外设准备好发送数据。
DCD(1号针) :接收信号检测(载波检测) ,输出。当DCD 为高电平时,表明MODEM 收到通信线路另一端MODEM 送来的正常的载波信号。
RI(9号针) :振铃指示,输入。当RI 为高电平时,表明MODEM 收到交换台送来的振铃信号。 GND(5号针) :信号地。
(2)RS-232C电气特性
RS-232C 采用负逻辑电平,即EIA 标准电平。它规定:逻辑“1”对应于电平﹣3~﹣25V ;逻辑“0”对应于电平﹢3~﹢25V 。在实际应用中,通常采用±12V 或±15V 作为EIA 电平。
(3)电平转换
由于RS-232C 早在TTL 集成电路之前就已发展起来,因此它没有采用TTL 逻辑电平。但一般微处理器、单片机采用TTL 电平,TTL 电平要求:“1”的电平大于2.4V ;“0”的电平小于0.4V 。显然两者之间电平不匹配,需要加电平转换电路。
传统的转换方法是采用MC1488和MC1489芯片。MC1488可实现TTL 电平到RS-232电平的转换,MC1489则可实现RS-232电平到TTL 电平的转换。
现在有很多专为RS-232C 设计的专用驱动芯片,如MAX232、TC232等系列,可在单一+5V供电条件下,将TTL 电平转换成RS-232电平,将RS-232电平转换成TTL 电平,可直接替代MC1488和MC1489芯片,并省去±12V 电源(MC1488用) ,非常方便。
MAXIM(美信) 公司的MAX232芯片内部有一个电源电压变压器,可以将输入的+5V电源电压变换成RS-232C 输出电平所需的±10V 电压。因此MAX232只需单一的+5V电源即可。
图7 MAX232引脚及发送/接收示意图
图7为MAX232引脚图及其发送/接收示意图。MAX232包含有两路接收器和驱动器的IC 芯片,适用于各种RS-232C 和V .28/.24的通信接口。应用的时候应注意发送、接收的引脚要对应,如发送时T1IN 应和T1OUT 对应,接收时R1IN 应和R1OUT 对应。
RS-232C 标准规定在码元畸变小于4%的情况下,传输电缆长度应为15m ,在实际应用中约有99%的用户是按码元畸变10~20%的范围工作的,所以实际使用中最大距离会超过15m ,一般能满足普通用户和近距离设备的需要。
3 可编程串行接口芯片8251A 及应用
Intel 8251A是一种可编程的通用同步/异步接收发送器(USART—Universal Synchronous/Asynchronous Receiver/Transmitter)。其基本性能如下:
(1)可工作在同步或异步工作方式。工作在同步方式时,波特率为0~64K ;工作在异步方式时,波特率为0~19.2K 。
(2)具有独立的发送器和接收器,能以单工、半双工和全双工方式进行通信;并能提供一些基本的控制信号,以方便地与MODEM 相连。
(3)同步方式时,可传送5~8位字符,可以选择奇校验或偶校验,也可不校验;可用内同步或外同步方式,能够自动插入同步字符。
(4)异步方式时,同样可传送5~8位字符,也可以选择校验方式、波特率因子及停止位位数,波特率因子可选为1、16、64。
3.1 8251A的内部结构和引脚功能
3.1.1 8251A的内部结构
TxD TxRDY
TxEMPTY
TxC RxD RxRDY SYNDET
RxC
图8 8251A内部结构
8251A 是一个通用串行输入/输出接口芯片,可用来将CPU 传送给外设的信息以串行方式向外发送,也可将外设输入给CPU 的信息以串行方式接收转换成并行数据传送给CPU 。8251A 的内部结构如图8所示,它主要由五大部分组成: (1)发送器 发送器包括发送缓冲器、发送移位寄存器和发送控制电路。发送控制电路用来控制和管理所有的发送操作。在它的管理下,发送缓冲器将来自CPU 的并行数据变换成串行数据,通过引脚TxD 向外发送。
若设定为异步方式,则需为数据加上起始位、校验位和停止位。若设定为同步方式,发送控制电路在数据中插入同步字符和校验位;如果在发送过程中,CPU 没有及时提供新的字符,则发送控制电路会自动补上同步字符,在同步通信中,两个字符之间不允许有间隔,这一点是不同于异步通信的。
(2)接收器
接收器包括接收缓冲器、接收移位寄存器和接收控制电路。接收控制电路用来控制和管理所有的接收操作。在它的管理下,接收缓冲器接收RxD 线上输入的串行数据,并按规定方式将其转变为并行数据,存放在接收数据缓冲器中。
在异步方式下,8251A 在允许接收和准备好接收数据时,监视RxD 线。当发现RxD 线上的电平由高电平变为低电平时,认为起始位到来,接收器开始接收一帧信息。接收到的信息经过奇偶校验、删除起始位和停止位,把已转换的并行数据置入接收数据缓冲器中。
在同步方式下,8251A 监视RxD 线,以一次一位的方式对数据进行移位(用RxC 脉冲同步,RxC 等于波特率) 。每接收到一位后,都将接收寄存器与存放同步字符(由程序装入) 的寄存器相比较。若不相等,则在移入下一位继续比较;若相等,则表示搜索到同步字符,使SYNDET=1。这时在接收时钟RxC 的同步下开始移位RxD 线上的数据,并按规定位数将其组装成并行数据,送至接收数据缓冲器。
(3)数据总线缓冲器
这是一个8位、双向三态的缓冲器,是8251A 与CPU 传送数据、状态和控制信息的通道。
(4)读/写控制逻辑
用来接收CPU 送来的一组控制信号,以决定8251A 的具体操作。CS 、C /D 、RD 、WR 信号配合
起来可决定8251A 的操作,见表1所示。
表1 8251A的端口操作表
(5)调制解调器控制
在远距离通信时,该电路提供了与
MODEM 联络的信号;在近距离串行通信时,该电路提供了与外设联络的应答信号。 3.1.2 8251A的引脚功能
RxC
RTS
DSR
TxC
WR
CS
C /D
图9 8251A引脚图
8251A 采用28脚的双列直插式封装,如图9所示。各引脚功能如下:
D7~D0:双向三态数据线,8根,用于在8251A 与CPU 之间传送数据、命令或状态信息。
TxD :数据发送端,用来输出串行数据。
TxRDY :发送器准备就绪信号,用于向CPU 指示8251A 是否已准备好发送一个字符。当发送缓冲器空(状态字D0位TxRDY=1)、操作命令字的D0位TxEN=1且CTS =0时,引脚TxRDY=1,CPU 可将新的字符写入8251A 。采用查询方式时,可通过查询状态字中的D0位(TxRDY)是否为1来决定CPU 是否可以向8251A 写入下一个字符。采用中断方式时,该信号可作为中断请求信号。8251A 从CPU 接收到一个发送字符时,TxRDY 复位成低电平。
TxEMPTY :发送器空闲信号,用于向CPU 指示发送器是否已发送完一个字符。异步通信时,TxEMPTY=1表示8251A 发送完一个字符;同步通信时,TxEMPTY=1表示8251A 要求从CPU 输入一个发送字符,若CPU 来不及发送,则发送器自动在TxD 线上插入同步字符,以填补传送空隙。
(TxEMPTY=1,则发送移位寄存器空;TxEMPTY=0,则发送移位寄存器满)
TxC :发送时钟,外部输入。在同步方式下,TxC 的频率与发送数据的波特率相同;在异步方式下,
TxC 的频率可以是发送波特率的1、16或64倍,具体的倍数由用户编程决定。
RxD :数据接收端,用来接收外部输入的数据。
RxRDY :接收器准备就绪信号,用于向CPU 指示8251A 是否已接收到一个字符。当接收缓冲器中已经装配好一个完整的数据字节时,RxRDY 变为高电平,用来通知CPU 读取数据。一旦CPU 用输入指令取走数据,RxRDY 复位成低电平。采用查询方式时,可通过查询状态字中的D1位(RxRDY)是否为1来决定CPU 是否可以从8251A 读入数据。采用中断方式时,该信号可作为中断请求信号。
SYNDET/BRKDET:同步检测/间断检测信号,双向双功能。
在同步方式下,该引脚为同步检测端,可为输入也可为输出信号。在内同步方式下,8251A 的内部检测电路自动寻找同步字符,一旦找到则SYNDET 引脚输出高电平;在外同步方式下,外部检测电路找到同步字符后,向SYNDET 引脚输入高电平,则8251A 开始接收数据。
在异步方式下,该引脚为间断检测端。BRKDET=1,表示收到对方发来的间断码。
RxC :接收时钟,外部输入。在同步方式下,RxC 的频率与发送数据的波特率相同;在异步方式下,RxC 的频率可以是发送波特率的1、16或64倍,具体的倍数由用户编程决定。 注意:在实际应用中,通常把TxC 和RxC 引脚连接在一起,接收同一个外部时钟源。
RESET :复位信号。当该信号为高电平并持续6个时钟周期以上时,8251A 被复位,收发线路均处于空闲状态。
CS :片选信号,输入,低电平有效。该信号由8251A 的地址译码器产生。
C /D :控制/数据信号,输入。当C /D =1时,选中8251A 的控制口,数据总线上传送的是控制字、命令字或状态字;当C /D =0时,选中8251A 的数据口,数据总线上传送的是数据。此引脚通常接CPU 的低位地址线。
RD 、WR :读、写控制信号,输入,低电平有效。RD 有效时,CPU 读取接收缓冲器的数据;WR 有效时,CPU 将数据写入发送缓冲器。
CLK :接收外部时钟源的时钟信号,用来产生8251A 的内部时序。在同步方式下,CLK 的频率要大于发送/接收时钟的30倍;在异步方式下,CLK 的频率要大于发送/接收时钟的4.5倍。
DTR :数据终端就绪信号,输出,低电平有效。它由操作命令字的D1位置“1”变为有效,用以表示接收方(8251A)准备好接收数据,通知发送方(MODEM或外设) 。
数据装置就绪信号,输入,低电平有效。它是对DTR 的应答信号,有效时表示发送方(MODEMDSR :
或外设) 已准备好发送数据。CPU 通过读取状态字的D7位来检测此信号。
RTS :发送方请求发送信号,输出,低电平有效。它由操作命令字的D5置“1”而变为有效,用以表示发送方(8251A)已准备好发送数据。
CTS :清除发送信号,输入,低电平有效。它是对RTS 的应答信号,有效时表示接收方(MODEM或外设) 已做好接收数据准备。
发送方和接收方是相对数据将要传送的方向决定的。当DTR 和DSR 是一对握手信号时,8251A 为接收方,MODEM 或外设为发送方;当RTS 和CTS 是一对握手信号时,8251A 为发送方,MODEM 或外设为接收方。
3.2 8251A的控制字及初始化
3.2.1控制字
8251A 在工作前要先对其进行初始化,即写入方式控制字,以确定其工作方式;写入操作命令字,以确定其工作过程;读取状态字,了解其工作状态,以保证在数据传送中CPU 与外设的动作。
(1)方式控制字
方式控制字用来决定8251A 工作在同步还是异步方式,并确定各种工作方式的数据格式。方式控制字的格式如图10所示。
方式控制字中,D1、D0位用来确定芯片的工作方式以及异步通信的波特率因子。例如,×64表示收发时钟频率是数据传送波特率的64倍。在异步通信中,D7~D2位用于确定数据位的位数、停止位的位数、是否采用奇偶校验以及采用奇校验还是偶校验。在同步通信中,D7~D2位用于确定字符长度、同步字符的个数以及采用外同步还是内同步。
图10 8251A的方式控制字
(2)操作命令字
操作命令字可使8251A 处于规定的工作状态,如使8251A 处于发送数据或接收数据状态,通知外设准备接收数据或发送数据等,如图11所示。
D2、D0:控制允许或禁止发送器和接收器工作。在半双工方式时,CPU 要交替地把这两位置1。 D5、D1:启动与MODEM 或外设的握手信号。当8251A 作为接收数据方,已准备好接收数据时,使D1位置1;当8251A 作为发送数据方,已准备好发送数据时,使D5位置1。
D3:选择是否发送间断字符。当D3=1时,TxD 线上一直发低电平,即输出连续的空号。正常通信时,应使D3=0。
D4:用于使状态字中的错误标志位D3、D4、D5位复位。
D6:可使8251A 回到初始化编程阶段。
D7:当采用同步方式时,使RxE 位置1的同时,还必须使EH 、ER 位置1。这样,RxD 线上开始接收信号,接收器也开始搜索同步字符。当搜索到同步字符时,使SYNDET 引脚输出为“1”。此后,再将D7位置0,作正常接收。
D7EH
D6IR
D5RTS
D4ER
D3
D2
D1
D0
SBRK RxE DTR TxEN
发送允许
1 允许0 禁止
数据终端就绪:1 使DTR 引脚为低电平
接收允许送间断字符
1 允许0 禁止
1 使TxD 引脚为低电平0 正常工作
错误标志复位:1 使全部错误标志(PE、OE 、FE) 复位
请求发送:1 使RTS 引脚为低电平内部复位:1 使芯片回到初始化格式进入搜索状态:1 使芯片开始搜索同步字符
图11 8251A的操作命令字
(3)状态字
状态字放在8251A 的状态寄存器中,可由CPU 读出(注意状态寄存器不能写) ,其格式如图12所示。
发送器准备好。此信号与引脚TxRDY 的定义有所不同。只要发送缓冲器出现空闲,则该位置1。D0:
而引脚TxRDY 为高电平的条件是发送缓冲器空(TxRDY=1)且操作命令字的D0=1(允许发送) ,输入引脚
CTS =0(清除发送) 。
D6 、D2 、D1:与引脚SYNDET 、TxEMPTY 、RxRDY 的定义完全相同。
D3:奇偶校验错。接收器按照事先约定的方式进行奇偶校验计算,然后将奇偶校验位的期望值与实际值进行比较,如果不一致,便将该位置1。
D4:溢出错。OE=1表示接收缓冲器已准备好一个字符数据,但CPU 未能及时读取,后面的字符数据就会将前一个字符数据覆盖,造成字符丢失。
D5:帧检验错,仅对异步方式有用。当在任一字符的结尾没有检测到规定的停止位时,该位置1。
D7:数据装置准备好。当DSR 引脚为低电平时,使该位置1,表示MODEM 或外设发送方已准备好发送数据。
图12 8251A的状态字
3.2.2 8251A的初始化
在传送数据前要对8251A 进行初始化,才能确定发送方与接收方的通信格式,以及通信的时序,从而保证准确无误地数据传送。由于8251A 的方式控制字和操作命令字本身均无特征标志,而且写入同一个端口,因此,为了区分它们,这两个字必须严格按规定顺序写入。8251A 的初始化流程如图13所示。在系统复位后,必须先写入方式控制字,再写入操作命令字。在一批数据传送完毕后,可以利用操作命令字使8251A 复位,重新设置8251A 的工作方式,以完成其他传送任务。需要注意的是,方式控制字必须跟在复位命令之后。在接通电源时,8251A 能通过硬件电路自动进入复位状态,但不能保证总是正确地复位。为了确保送方式控制字和操作命令字之前已正确复位,应先向8251A 的控制口连续写入3个0,然后再向该端口写入一个是D6 位为1的复位命令字(40H),用指令使8251A 可靠复位。
图13 8251A初始化流程
【例】设异步通信数据格式为7位数据、1位奇校验和1位停止位,则字符‘A ’的数据格式为:
字符‘C ’的数据格式为:
【例】 试按下列要求编写8251A 的初始化程序:8251A 为同步传送方式,有两个同步字符,内同步,采用偶校验,有7位数据位,同步字符为16H 。8251A 的端口地址为1F0H 、1F2H 。
MOV DX, 1F2H ; 控制口地址
MOV BL, 3 ; 设置计数初值
MOV AL, 00H ;送3个0
LL: OUT DX, AL DEC BL JNZ LL
MOV AL, 40H ; 送复位命令字 OUT DX, AL
MOV AL, 38H ; 方式控制字, 00111000B OUT DX, AL
MOV AL, 16H ; 第一个同步字符 OUT DX, AL
OUT DX, AL ; 第二个同步字符
MOV AL, 95H ; 操作命令字
,10010101B OUT DX, AL
.. .
【例】利用8251A 实现两台微型计算机的远距离通信,设采用半双工查询方式,异步传送,一方定义为发送器,另一方为接收器。当发送端CPU 查询到TxRDY 有效时,向825lA 并行输出一字节数据;接收端CPU 每查询到RxRDY 有效,则从8251A 并行输入一个字节数据,一直进行到全部数据传送完为止。
设发送端8251A 数据口地址为 TDATA,控制口/状态口地址为 TCONT,发送数据块首地址为TBUFF ,字节数为80。发送程序为:
STT: MOV DX, TCONT
MOV AL, 7FH ; 01111111, 异步方式, 波特率系数64,8位数据,l 位停止位, 偶校验 OUT DX, AL
MOV AL, 0lH ;00000001, 允许发送 OUT DX, AL
MOV DI, TBUFF ; 发送数据块首地址送DI MOV CX, 80 ; 计数器赋初值 NEXT: MOV DX, TCONT ;读取状态字 IN AL, DX AND AL, 0lH ;TxRDY有效否? JZ NEXT ; 无效, 继续等待
MOV DX, TDATA ; 有效, 向8251A 输出一字节数据 MOV AL,[DI] OUT DX, AL
INC DI ; 修改指针 LOOP NEXT HLT
设接收端8251A 数据口地址为RDATA ,控制口/状态口地址为RCONT ,接收数据缓冲区首地址为RBUFF ,接收程序为:
SRR: MOV DX, RCONT ; 送方式选择控制字 MOV AL, 7FH OUT DX, AL
MOV AL, 14H ;00010100, 清除错误标志, 允许接收 OUT DX, AL
MOV DI, RBUFF ; 接收数据缓冲区首地址送DI MOV CX, 80 ; 计数器赋初值 COMT: MOV DX, RCONT ; 读取状态字 IN AL, DX
TEST AL, 02H ;RxRDY 有效否? JZ COMT ; 无效, 继续等待 AND AL, 38H ;00111000,有效, 查询接收过程有无错误? JNZ ERR ; 有错, 转出错处理程序 MOV DX, RDATA ; 无错, 输入一字节数据 IN AL, DX MOV [DI], AL
INC DI ; 修改指针 LOOP COMT HLT
第四章 可编程串行接口芯片8251A
1 串行通信的基本知识
微机与外部设备或其他计算机之间进行信息交换称之为通信。如图1所示,微机的通信方式有两种: 并行通信:数据的各位同时发送或接收,如微机与存储器或并行打印机之间的通信。其优点是传送速度快,缺点是使用传输线较多,不适合远距离传送数据。
串行通信:数据按一位一位顺序发送或接收。串行通信只用1位数据线传送数据的位信号,较为经济,适用于远距离数据传送,但数据传送的速度较低。串行通信要求的数据转换格式、时间控制等逻辑电路一般集成在可编程串行通信控制器之中。
图1并行和串行通信示意图
1.1 串行通信的传输方式
图2 串行通信的连接示意图
如图2所示,串行通信的传输方式有3种:
第一种是单工方式,只允许数据向一个方向传送,图2(a)中,甲站只作发送器,乙站只作接收器,数据流的方向只能从甲到乙。
第二种是半双工方式,允许数据向两个方向中的任一个方向传送,但通信双方不能同时收发数据,图2(b)中,甲站、乙站既可作为发送器,也可作为接收器。数据流的方向可以是从甲到乙,也可以是从乙到甲,但在同一时间只能进行一个方向的传送。
第三种是全双工方式,通信双方能够同时发送和接收数据。有两根数据线,可支持数据流在两个方向同时传送,如图2 (c)所示。
1.2 异步通信和同步通信
串行通信有两种基本方式:异步通信和同步通信方式。
(1)异步通信
在异步通信中,数据是一帧一帧传送的。异步通信的帧格式如图3所示, 一个字符称为一帧。
图3 异步通信帧格式
①起始位
通信线上没有数据被传送时处于逻辑“1”状态。当发送设备发送一个字符数据时,首先发出一个逻辑“0”信号,这个逻辑低电平就是起始位。起始位通过通信线传向接收设备,接受设备检测到这个逻辑低电平后,就开始准备接收数据位信号。起始位所起的作用就是使设备同步,通信双方必须在传送数据位前协调同步。
②数据位
当接收设备收到起始位后,紧接着就会收到数据位。数据位的个数可以是5、6、7、8中的一个。MCS-51单片机串行口采用8位数据传送。这些数据位被接收到移位寄存器中构成数据字符。在字符数据传送过程中,数据位从最低有效位开始发送,依次顺序在接收设备中被转换成并行数据。
③奇偶校验位
数据位发送完毕后,可以发送奇偶校验位。奇偶校验用于有限差错检测,通信双方需要约定一致的奇偶校验方式。若选择偶校验方式,那么组成数据位和奇偶位的逻辑“1”的个数必须是偶数个;若选择奇校验方式,那么组成数据位和奇偶位的逻辑“1”的个数必须是奇数个。奇偶校验位可省略或改为其他控制位。
④停止位
在奇偶校验位或数据位(无奇偶校验位时) 之后发送的是停止位。停止位是一个字符数据的结束标志,可以是1位、1.5位或2位的高电平。接收设备收到停止位后,通信线上又恢复逻辑“1”状态,直到下一个字符的起始位的到来。
图3中,如帧格式为一个起始位、8个数据位、一个停止位,无校验位,即为常见的N.8.1帧格式(10位) 。欧美的仪器设备异步串行通信采用“9600波特,N.8.1”格式,我国一般采用欧美标准。
(2)同步通信
同步通信中,数据开始传送前用同步字符来指示,并由时钟实现发送和接收端同步,即检测到同步字符后,就连续传送数据,直到通信结束。
同步通信不用起始位和停止位来标识字符的开始和结束,而是用一串特定的二进制序列,称为同步字符,去通知接收方串行数据第一位何时到达。紧随其后的是欲传送的n 个字符(n的大小可由用户设定和改变) ,字符间不留空隙。最后是两个错误校验字符。
几种常用的同步串行传送格式如图4所示。对同步字符的检测和同步控制,在串行接口芯片内部进行,称为内同步。内同步又分为单同步(只有一个字节的同步字符) 和双同步(有两个字节的同步字符) ,SDLC/HDLC是属于内同步的一种。而外同步是指对同步信号的检测在串行接口芯片的外部进行,当外部硬件电路检测到同步字符时,就给串行接口发来一个同步信号SYNC 。当串行接口收到同步信号后,立即开始接收信息。
图4 同步通信数据格式
同步通信中,在同步时钟信号的一个周期里,数据线上同步地发送一位数据。而且成千上万的数据是连续发送,中间没有空隙。这就要求接收方的时钟应与发送方的时钟完全同频同相,不能有一点误差。因此,在近距离传送时,如几百~数千米,可以在传输线中增加一条时钟线,以确保收发双方使用同一时钟。在数公里以上的远距离通信中,则通过调制解调器从数据流中提取同步信号,以得到与发送方完全同频同相的时钟。
总的来说,由于异步通信的每个字符都要加控制信息,因此数据传输效率不高,一般适用于数据量较小,传输率较低的场合。而在高速传送时,往往采用同步通信。
1.3 波特率
比特率是指每秒传送的二进制位数,单位是b/s(bit/s);波特率是指每秒传送的N进制位数,单位是baud(波特) 。两者的关系是:比特率=波特率log 2N 。由于计算机中的数据均采用二进制表示,因此比特率和波特率是一致的,常常混用。
例如,某串行通信系统,每秒传输120个字符,每个字符包含10位二进制数(N.8.1帧格式) ,则波特率为120×10=1200baud ,即1200b/s;而每一位二进制代码的传输时间即为波特率的倒数:T b =1/1200 b/s =0.833ms。
计算机通信中,常用波特率表示通信速率。国际上规定了标准波特率系列,最常用的标准值是110波特、300波特、600波特、1200波特、1800波特、2400波特、4800波特、9600波特、19200波特、57600波特和115200波特等。
1.4 串并转换和设备同步
串行通信主要要解决两个问题:一是数据串并转换问题,二是设备同步问题。
串并转换是指如何把发送的并行数据串行化,把接收的串行数据并行化,即串并数据转化的问题。MCS-51单片机的串行口和IBM PC机中的8250都有这种功能。
进行串行通信的双方设备必须同步工作才能有效检测通信线路上的信号变化,从而采样传送数据脉冲。只有同步双方设备的工作节拍,才能确保发送数据在接收端被正确读出。设备同步要求通信双方必须采用统一的编码方法,并要求通信双方能够产生相同的传送速率。采用统一的编码方法确定了一个字
符二进制值的位发送顺序和位串长度,还包括统一的逻辑电平规定,即电平高低与逻辑“1”、“0”之间的固定对应关系。双方设备产生相同的传送速率才能确保设备同步,这就要求发送设备和接收设备采用相同频率的时钟,发送设备在统一的时钟脉冲上发出数据,接收设备才能正确检测出与时钟脉冲同步的数据信号。
在串行通信中,发送端需要用时钟来决定每1位对应的时间长度,接收端也需要用一个时钟来决定每1位的时间长度,前一个时钟叫发送时钟,后一个时钟叫接收时钟。往往根据数据传送的波特率来确定串行接口的发送时钟和接收时钟的频率。它们和波特率之间有如下关系:时钟频率=n ×波特率。式中,n 为波特率因子或波特率系数,其值可以为1、16、32或64。若波特率因子为1(时钟频率等于波特率) ,则由于异步通信收、发双方各有自己的时钟信号,双方的时钟频率稍有偏差或不同相位就容易产生接收错误。因此在异步通信中,往往采用较高频率的时钟信号,如波特率16倍频或64倍频。
如图5所示,以接收时钟频率=16×波特率(Tb =16T)为例,说明字符的接收过程。
图5 采用16倍波特率时钟频率的字符接收过程
传送开始后,接收设备在接收时钟的上升沿不断检测传输线。如果在一系列的“1”之后检测到一个“0”,紧接着又连续采样到8个“0”,则确定为一帧的起始位。此后就每隔16个时钟采样一次数据,移位接收数据位和奇偶校验位。当检测到停止位,就将接收到的有效字符装载到串口的接收缓冲器中。
可以看出,异步通信采用起始位作为同步信号。接收方在收到起始位后,只要在一个帧的传输时间内与发送方保持同步,就能够正确接收数据。即使收发双方的时钟略有偏差,只要这种偏差不产生积累效应,问题就不大。所以,在异步通信中,收发双方可以不用同一时钟,只要使用同一标称频率即可。
2 RS-232C串行总线接口标准
串行通信的格式及约定(如同步方式、通讯速率、数据块格式、信号电平等) 不同,形成了多种串行通信的协议与接口标准。常见的有:通用异步收发器(UART)、通用串行总线(USB)、单总线(1-Wire)、I 2C 总线、CAN 总线、SPI 总线、1394、RS-232C/RS422A/RS-485标准,等等。上述标准总线中,目前用得最多和最广泛的则首推RS-232C(C表示已修改3次) 。由于RS-232C 总线标准制定时间较早(1962年由美国电子工业协会EIA 颁布) ,其目的是为了解决数据终端设备(DTE)和数据通信设备(DCE)距离之间的数据通信,而在抗干扰和传输距离上并没有太多的考虑,因此也有通信距离近(19200b/s传输速率下约15m) 、抗干扰能力差的缺陷。为解决这一问题,其后EIA 又发布了RS-422、RS-485等工业标准,它在提高传输速率和距离、抗干扰特性上做了很多努力,目前已广泛应用于各种工业现场。
2.1 RS-232C串行总线接口标准
(1)RS-232C接口信号
图6 25针和9针D 型接插件
RS-232C 标准规定了22条控制信号线,使用25针D 型接插件(DB25)连接。在实际应用中,并不一定需要用到所有的控制信号,如当计算机与外部设备不经过调制解调器直接通信时,常常只用到3~9条引线,因此可采用9针D 型接插件(DB9)连接。25针和9针D 型接插件如图6所示。下面仅介绍9针D 形接插件的控制信号定义(所有控制信号的方向均是从数据终端设备的角度来定义) :
TxD(3号针) :串行数据的发送端,输出。
RxD(2号针) :串行数据的接收端,输入。
RTS(7号针) :请求发送信号,输出。当RTS 为高电平时,表明终端(DTE)要向MODEM 或其他通信设备发送数据。
CTS(8号针) :清除发送(允许发送) 信号,输入。当MODEM 或外设准备好接收来自终端(DTE)的数据时,使为高电平。
DTR(4号针) :终端准备就绪信号,输出。当DTR 为高电平时,表明终端(DTE)准备好接收来自MODEM 或其他外设的数据。
DSR(6号针) :数据装置准备就绪信号,输入。当DSR 为高电平时,表明MODEM 或外设准备好发送数据。
DCD(1号针) :接收信号检测(载波检测) ,输出。当DCD 为高电平时,表明MODEM 收到通信线路另一端MODEM 送来的正常的载波信号。
RI(9号针) :振铃指示,输入。当RI 为高电平时,表明MODEM 收到交换台送来的振铃信号。 GND(5号针) :信号地。
(2)RS-232C电气特性
RS-232C 采用负逻辑电平,即EIA 标准电平。它规定:逻辑“1”对应于电平﹣3~﹣25V ;逻辑“0”对应于电平﹢3~﹢25V 。在实际应用中,通常采用±12V 或±15V 作为EIA 电平。
(3)电平转换
由于RS-232C 早在TTL 集成电路之前就已发展起来,因此它没有采用TTL 逻辑电平。但一般微处理器、单片机采用TTL 电平,TTL 电平要求:“1”的电平大于2.4V ;“0”的电平小于0.4V 。显然两者之间电平不匹配,需要加电平转换电路。
传统的转换方法是采用MC1488和MC1489芯片。MC1488可实现TTL 电平到RS-232电平的转换,MC1489则可实现RS-232电平到TTL 电平的转换。
现在有很多专为RS-232C 设计的专用驱动芯片,如MAX232、TC232等系列,可在单一+5V供电条件下,将TTL 电平转换成RS-232电平,将RS-232电平转换成TTL 电平,可直接替代MC1488和MC1489芯片,并省去±12V 电源(MC1488用) ,非常方便。
MAXIM(美信) 公司的MAX232芯片内部有一个电源电压变压器,可以将输入的+5V电源电压变换成RS-232C 输出电平所需的±10V 电压。因此MAX232只需单一的+5V电源即可。
图7 MAX232引脚及发送/接收示意图
图7为MAX232引脚图及其发送/接收示意图。MAX232包含有两路接收器和驱动器的IC 芯片,适用于各种RS-232C 和V .28/.24的通信接口。应用的时候应注意发送、接收的引脚要对应,如发送时T1IN 应和T1OUT 对应,接收时R1IN 应和R1OUT 对应。
RS-232C 标准规定在码元畸变小于4%的情况下,传输电缆长度应为15m ,在实际应用中约有99%的用户是按码元畸变10~20%的范围工作的,所以实际使用中最大距离会超过15m ,一般能满足普通用户和近距离设备的需要。
3 可编程串行接口芯片8251A 及应用
Intel 8251A是一种可编程的通用同步/异步接收发送器(USART—Universal Synchronous/Asynchronous Receiver/Transmitter)。其基本性能如下:
(1)可工作在同步或异步工作方式。工作在同步方式时,波特率为0~64K ;工作在异步方式时,波特率为0~19.2K 。
(2)具有独立的发送器和接收器,能以单工、半双工和全双工方式进行通信;并能提供一些基本的控制信号,以方便地与MODEM 相连。
(3)同步方式时,可传送5~8位字符,可以选择奇校验或偶校验,也可不校验;可用内同步或外同步方式,能够自动插入同步字符。
(4)异步方式时,同样可传送5~8位字符,也可以选择校验方式、波特率因子及停止位位数,波特率因子可选为1、16、64。
3.1 8251A的内部结构和引脚功能
3.1.1 8251A的内部结构
TxD TxRDY
TxEMPTY
TxC RxD RxRDY SYNDET
RxC
图8 8251A内部结构
8251A 是一个通用串行输入/输出接口芯片,可用来将CPU 传送给外设的信息以串行方式向外发送,也可将外设输入给CPU 的信息以串行方式接收转换成并行数据传送给CPU 。8251A 的内部结构如图8所示,它主要由五大部分组成: (1)发送器 发送器包括发送缓冲器、发送移位寄存器和发送控制电路。发送控制电路用来控制和管理所有的发送操作。在它的管理下,发送缓冲器将来自CPU 的并行数据变换成串行数据,通过引脚TxD 向外发送。
若设定为异步方式,则需为数据加上起始位、校验位和停止位。若设定为同步方式,发送控制电路在数据中插入同步字符和校验位;如果在发送过程中,CPU 没有及时提供新的字符,则发送控制电路会自动补上同步字符,在同步通信中,两个字符之间不允许有间隔,这一点是不同于异步通信的。
(2)接收器
接收器包括接收缓冲器、接收移位寄存器和接收控制电路。接收控制电路用来控制和管理所有的接收操作。在它的管理下,接收缓冲器接收RxD 线上输入的串行数据,并按规定方式将其转变为并行数据,存放在接收数据缓冲器中。
在异步方式下,8251A 在允许接收和准备好接收数据时,监视RxD 线。当发现RxD 线上的电平由高电平变为低电平时,认为起始位到来,接收器开始接收一帧信息。接收到的信息经过奇偶校验、删除起始位和停止位,把已转换的并行数据置入接收数据缓冲器中。
在同步方式下,8251A 监视RxD 线,以一次一位的方式对数据进行移位(用RxC 脉冲同步,RxC 等于波特率) 。每接收到一位后,都将接收寄存器与存放同步字符(由程序装入) 的寄存器相比较。若不相等,则在移入下一位继续比较;若相等,则表示搜索到同步字符,使SYNDET=1。这时在接收时钟RxC 的同步下开始移位RxD 线上的数据,并按规定位数将其组装成并行数据,送至接收数据缓冲器。
(3)数据总线缓冲器
这是一个8位、双向三态的缓冲器,是8251A 与CPU 传送数据、状态和控制信息的通道。
(4)读/写控制逻辑
用来接收CPU 送来的一组控制信号,以决定8251A 的具体操作。CS 、C /D 、RD 、WR 信号配合
起来可决定8251A 的操作,见表1所示。
表1 8251A的端口操作表
(5)调制解调器控制
在远距离通信时,该电路提供了与
MODEM 联络的信号;在近距离串行通信时,该电路提供了与外设联络的应答信号。 3.1.2 8251A的引脚功能
RxC
RTS
DSR
TxC
WR
CS
C /D
图9 8251A引脚图
8251A 采用28脚的双列直插式封装,如图9所示。各引脚功能如下:
D7~D0:双向三态数据线,8根,用于在8251A 与CPU 之间传送数据、命令或状态信息。
TxD :数据发送端,用来输出串行数据。
TxRDY :发送器准备就绪信号,用于向CPU 指示8251A 是否已准备好发送一个字符。当发送缓冲器空(状态字D0位TxRDY=1)、操作命令字的D0位TxEN=1且CTS =0时,引脚TxRDY=1,CPU 可将新的字符写入8251A 。采用查询方式时,可通过查询状态字中的D0位(TxRDY)是否为1来决定CPU 是否可以向8251A 写入下一个字符。采用中断方式时,该信号可作为中断请求信号。8251A 从CPU 接收到一个发送字符时,TxRDY 复位成低电平。
TxEMPTY :发送器空闲信号,用于向CPU 指示发送器是否已发送完一个字符。异步通信时,TxEMPTY=1表示8251A 发送完一个字符;同步通信时,TxEMPTY=1表示8251A 要求从CPU 输入一个发送字符,若CPU 来不及发送,则发送器自动在TxD 线上插入同步字符,以填补传送空隙。
(TxEMPTY=1,则发送移位寄存器空;TxEMPTY=0,则发送移位寄存器满)
TxC :发送时钟,外部输入。在同步方式下,TxC 的频率与发送数据的波特率相同;在异步方式下,
TxC 的频率可以是发送波特率的1、16或64倍,具体的倍数由用户编程决定。
RxD :数据接收端,用来接收外部输入的数据。
RxRDY :接收器准备就绪信号,用于向CPU 指示8251A 是否已接收到一个字符。当接收缓冲器中已经装配好一个完整的数据字节时,RxRDY 变为高电平,用来通知CPU 读取数据。一旦CPU 用输入指令取走数据,RxRDY 复位成低电平。采用查询方式时,可通过查询状态字中的D1位(RxRDY)是否为1来决定CPU 是否可以从8251A 读入数据。采用中断方式时,该信号可作为中断请求信号。
SYNDET/BRKDET:同步检测/间断检测信号,双向双功能。
在同步方式下,该引脚为同步检测端,可为输入也可为输出信号。在内同步方式下,8251A 的内部检测电路自动寻找同步字符,一旦找到则SYNDET 引脚输出高电平;在外同步方式下,外部检测电路找到同步字符后,向SYNDET 引脚输入高电平,则8251A 开始接收数据。
在异步方式下,该引脚为间断检测端。BRKDET=1,表示收到对方发来的间断码。
RxC :接收时钟,外部输入。在同步方式下,RxC 的频率与发送数据的波特率相同;在异步方式下,RxC 的频率可以是发送波特率的1、16或64倍,具体的倍数由用户编程决定。 注意:在实际应用中,通常把TxC 和RxC 引脚连接在一起,接收同一个外部时钟源。
RESET :复位信号。当该信号为高电平并持续6个时钟周期以上时,8251A 被复位,收发线路均处于空闲状态。
CS :片选信号,输入,低电平有效。该信号由8251A 的地址译码器产生。
C /D :控制/数据信号,输入。当C /D =1时,选中8251A 的控制口,数据总线上传送的是控制字、命令字或状态字;当C /D =0时,选中8251A 的数据口,数据总线上传送的是数据。此引脚通常接CPU 的低位地址线。
RD 、WR :读、写控制信号,输入,低电平有效。RD 有效时,CPU 读取接收缓冲器的数据;WR 有效时,CPU 将数据写入发送缓冲器。
CLK :接收外部时钟源的时钟信号,用来产生8251A 的内部时序。在同步方式下,CLK 的频率要大于发送/接收时钟的30倍;在异步方式下,CLK 的频率要大于发送/接收时钟的4.5倍。
DTR :数据终端就绪信号,输出,低电平有效。它由操作命令字的D1位置“1”变为有效,用以表示接收方(8251A)准备好接收数据,通知发送方(MODEM或外设) 。
数据装置就绪信号,输入,低电平有效。它是对DTR 的应答信号,有效时表示发送方(MODEMDSR :
或外设) 已准备好发送数据。CPU 通过读取状态字的D7位来检测此信号。
RTS :发送方请求发送信号,输出,低电平有效。它由操作命令字的D5置“1”而变为有效,用以表示发送方(8251A)已准备好发送数据。
CTS :清除发送信号,输入,低电平有效。它是对RTS 的应答信号,有效时表示接收方(MODEM或外设) 已做好接收数据准备。
发送方和接收方是相对数据将要传送的方向决定的。当DTR 和DSR 是一对握手信号时,8251A 为接收方,MODEM 或外设为发送方;当RTS 和CTS 是一对握手信号时,8251A 为发送方,MODEM 或外设为接收方。
3.2 8251A的控制字及初始化
3.2.1控制字
8251A 在工作前要先对其进行初始化,即写入方式控制字,以确定其工作方式;写入操作命令字,以确定其工作过程;读取状态字,了解其工作状态,以保证在数据传送中CPU 与外设的动作。
(1)方式控制字
方式控制字用来决定8251A 工作在同步还是异步方式,并确定各种工作方式的数据格式。方式控制字的格式如图10所示。
方式控制字中,D1、D0位用来确定芯片的工作方式以及异步通信的波特率因子。例如,×64表示收发时钟频率是数据传送波特率的64倍。在异步通信中,D7~D2位用于确定数据位的位数、停止位的位数、是否采用奇偶校验以及采用奇校验还是偶校验。在同步通信中,D7~D2位用于确定字符长度、同步字符的个数以及采用外同步还是内同步。
图10 8251A的方式控制字
(2)操作命令字
操作命令字可使8251A 处于规定的工作状态,如使8251A 处于发送数据或接收数据状态,通知外设准备接收数据或发送数据等,如图11所示。
D2、D0:控制允许或禁止发送器和接收器工作。在半双工方式时,CPU 要交替地把这两位置1。 D5、D1:启动与MODEM 或外设的握手信号。当8251A 作为接收数据方,已准备好接收数据时,使D1位置1;当8251A 作为发送数据方,已准备好发送数据时,使D5位置1。
D3:选择是否发送间断字符。当D3=1时,TxD 线上一直发低电平,即输出连续的空号。正常通信时,应使D3=0。
D4:用于使状态字中的错误标志位D3、D4、D5位复位。
D6:可使8251A 回到初始化编程阶段。
D7:当采用同步方式时,使RxE 位置1的同时,还必须使EH 、ER 位置1。这样,RxD 线上开始接收信号,接收器也开始搜索同步字符。当搜索到同步字符时,使SYNDET 引脚输出为“1”。此后,再将D7位置0,作正常接收。
D7EH
D6IR
D5RTS
D4ER
D3
D2
D1
D0
SBRK RxE DTR TxEN
发送允许
1 允许0 禁止
数据终端就绪:1 使DTR 引脚为低电平
接收允许送间断字符
1 允许0 禁止
1 使TxD 引脚为低电平0 正常工作
错误标志复位:1 使全部错误标志(PE、OE 、FE) 复位
请求发送:1 使RTS 引脚为低电平内部复位:1 使芯片回到初始化格式进入搜索状态:1 使芯片开始搜索同步字符
图11 8251A的操作命令字
(3)状态字
状态字放在8251A 的状态寄存器中,可由CPU 读出(注意状态寄存器不能写) ,其格式如图12所示。
发送器准备好。此信号与引脚TxRDY 的定义有所不同。只要发送缓冲器出现空闲,则该位置1。D0:
而引脚TxRDY 为高电平的条件是发送缓冲器空(TxRDY=1)且操作命令字的D0=1(允许发送) ,输入引脚
CTS =0(清除发送) 。
D6 、D2 、D1:与引脚SYNDET 、TxEMPTY 、RxRDY 的定义完全相同。
D3:奇偶校验错。接收器按照事先约定的方式进行奇偶校验计算,然后将奇偶校验位的期望值与实际值进行比较,如果不一致,便将该位置1。
D4:溢出错。OE=1表示接收缓冲器已准备好一个字符数据,但CPU 未能及时读取,后面的字符数据就会将前一个字符数据覆盖,造成字符丢失。
D5:帧检验错,仅对异步方式有用。当在任一字符的结尾没有检测到规定的停止位时,该位置1。
D7:数据装置准备好。当DSR 引脚为低电平时,使该位置1,表示MODEM 或外设发送方已准备好发送数据。
图12 8251A的状态字
3.2.2 8251A的初始化
在传送数据前要对8251A 进行初始化,才能确定发送方与接收方的通信格式,以及通信的时序,从而保证准确无误地数据传送。由于8251A 的方式控制字和操作命令字本身均无特征标志,而且写入同一个端口,因此,为了区分它们,这两个字必须严格按规定顺序写入。8251A 的初始化流程如图13所示。在系统复位后,必须先写入方式控制字,再写入操作命令字。在一批数据传送完毕后,可以利用操作命令字使8251A 复位,重新设置8251A 的工作方式,以完成其他传送任务。需要注意的是,方式控制字必须跟在复位命令之后。在接通电源时,8251A 能通过硬件电路自动进入复位状态,但不能保证总是正确地复位。为了确保送方式控制字和操作命令字之前已正确复位,应先向8251A 的控制口连续写入3个0,然后再向该端口写入一个是D6 位为1的复位命令字(40H),用指令使8251A 可靠复位。
图13 8251A初始化流程
【例】设异步通信数据格式为7位数据、1位奇校验和1位停止位,则字符‘A ’的数据格式为:
字符‘C ’的数据格式为:
【例】 试按下列要求编写8251A 的初始化程序:8251A 为同步传送方式,有两个同步字符,内同步,采用偶校验,有7位数据位,同步字符为16H 。8251A 的端口地址为1F0H 、1F2H 。
MOV DX, 1F2H ; 控制口地址
MOV BL, 3 ; 设置计数初值
MOV AL, 00H ;送3个0
LL: OUT DX, AL DEC BL JNZ LL
MOV AL, 40H ; 送复位命令字 OUT DX, AL
MOV AL, 38H ; 方式控制字, 00111000B OUT DX, AL
MOV AL, 16H ; 第一个同步字符 OUT DX, AL
OUT DX, AL ; 第二个同步字符
MOV AL, 95H ; 操作命令字
,10010101B OUT DX, AL
.. .
【例】利用8251A 实现两台微型计算机的远距离通信,设采用半双工查询方式,异步传送,一方定义为发送器,另一方为接收器。当发送端CPU 查询到TxRDY 有效时,向825lA 并行输出一字节数据;接收端CPU 每查询到RxRDY 有效,则从8251A 并行输入一个字节数据,一直进行到全部数据传送完为止。
设发送端8251A 数据口地址为 TDATA,控制口/状态口地址为 TCONT,发送数据块首地址为TBUFF ,字节数为80。发送程序为:
STT: MOV DX, TCONT
MOV AL, 7FH ; 01111111, 异步方式, 波特率系数64,8位数据,l 位停止位, 偶校验 OUT DX, AL
MOV AL, 0lH ;00000001, 允许发送 OUT DX, AL
MOV DI, TBUFF ; 发送数据块首地址送DI MOV CX, 80 ; 计数器赋初值 NEXT: MOV DX, TCONT ;读取状态字 IN AL, DX AND AL, 0lH ;TxRDY有效否? JZ NEXT ; 无效, 继续等待
MOV DX, TDATA ; 有效, 向8251A 输出一字节数据 MOV AL,[DI] OUT DX, AL
INC DI ; 修改指针 LOOP NEXT HLT
设接收端8251A 数据口地址为RDATA ,控制口/状态口地址为RCONT ,接收数据缓冲区首地址为RBUFF ,接收程序为:
SRR: MOV DX, RCONT ; 送方式选择控制字 MOV AL, 7FH OUT DX, AL
MOV AL, 14H ;00010100, 清除错误标志, 允许接收 OUT DX, AL
MOV DI, RBUFF ; 接收数据缓冲区首地址送DI MOV CX, 80 ; 计数器赋初值 COMT: MOV DX, RCONT ; 读取状态字 IN AL, DX
TEST AL, 02H ;RxRDY 有效否? JZ COMT ; 无效, 继续等待 AND AL, 38H ;00111000,有效, 查询接收过程有无错误? JNZ ERR ; 有错, 转出错处理程序 MOV DX, RDATA ; 无错, 输入一字节数据 IN AL, DX MOV [DI], AL
INC DI ; 修改指针 LOOP COMT HLT