RS-232C 串行接口
RS-232C 是一种异步串行接口
概述
串行通信、并行通信 计算机系统中两个功能模块之间的信息交换
有两种方式:并行通信与串行通信。串行通信 是指数据通过一根数据线进行发送和接收,其
特征是把各个二进制位连成串,一位一位地传送。
并行通信是指数据的各位通过若干根数据线同时进
行发送和接收。
并行通信及并行接口 并行通信是指两个功能模块之间有多条数
据信号传送线,这样两模块之间可以一次同时传送多位数据,传送速度快。
由于所需的数据传送线较多,造价高,因此并行通讯适用于近距离、快速数据交换的场合,如微机系统中 CPU 与存储器、 I/O 端口之间。
完成并行通信的接口电路称为并行接口。
串行通信及串行接口 串行通信是指两个功能模块之间只通过一条或 两条数据线进行数据交换。 发送方需要将数据按二进制位进行分解,一
位、一位地分时经过单条数据线传送。 接收方需要一位一位地从单条数据线上接收
数据,并且将它们重新组装成一个数据。 串行通信所需数据线少,在远距离传送时比
并行通信的造价低。但是一个数据只有经过若干次以后才可以传送完,速度较慢。
完成串行通信的接口电路称为串行接口。
串行通讯时,需要解决以下问题: 双方约定的发送与接收速率(波特率,即位 /
秒); 约定采用的数据格式(帧格式); 接收方怎样知道一批数据的开始、结束(帧同步问题); 接收方怎样从数据流中采样每位数据(位同步); 接收方怎样判断接收数据的正确性(数据校验),
如何处理收发错误; 解决这些问题的方法大体有同步通信与异步通信
两种。
同步通信与异步通信
异步通信 异步通信以字符为单位传送,为了解决帧
同步,每个字符都附加了一些控制信息,由 4部分组成: 一位起始位(低电平)、
5~8 位数据位、 一位奇偶校验位、 1~2 位停止位(高电平)。 两个字符之间的间隔是任意的,中间可以
填充空闲位(高电平)。
只要接收方检测到数据线上出现了由高电平向低电平的跳变,并且低电平能持续一段时间,就表明已经接收到一帧数据的开始。
这时接收方就可以按照接收时钟从数据线上采样数据,直到接收到了停止位,表明接收完一帧数据。
接收方还可以通过奇偶校验位判断数据传送过程中是否出现错误。
异步传送控制比较简单,对发送与接收时钟要求不很严格(发送和接收时钟可以不用同一个,所以不必传送时钟信号),不会造成错误累积,但是由于每个数据在传送时都要附加控制信息,约有 20% 的冗余。
传送速率并不高,为 50 ~ 9600 波特之间。 异步串行接口特别适合于使用普通电话线进
行远距离数据通信。
同步通信
同步通信以数据块为单位进行传送,为了解决帧同步,在每一批数据流之前,附加同步信息( 1 ~ 2 个同步字符),最后以校验字符结束。
如果在数据传送过程中,发生数据断流(即发送方没有数据可发送)应以同步字符填充。
接收方检测到协议要求的 1 ~ 2 个同步字符后,就可以认为双方已经取得一致,之后就可以在严格的时钟控制下采样数据线接收数据。
同步通信可以根据校验字符判断所接收的一批字符是否在传送过程中出现错误。
同步通信的传送速率较高(通常其传送速率为 50 ~几百千波特)。
同步通信在 1 ~ 2 个同步字符的带领下,就可以源源不断地发送和接收数据了。但是同步通信对双方的时钟要求很严格,并且容易造成错误累积。
同步通信时发送时钟和接收时钟必须用同一个时钟信号以减少错误累积,所以,在发送数据的同时还需要将发送时钟信号发送给接收方作为接收时钟。
串行通信中的常用术语 (1) 传送制式 串行传送有 单工、半双工、全双工三种传送制式。
单工:是指发送方与接收方只有一条数据线路,而且这条数据线路永远只能进行一个方向的传输。
甲(发送器)
乙(接收器)
数据线
单工方式
半双工: 是指发送方与接收方也只有一条数据线路,但这条数据线路可以在不同时刻进行两个方向的传输。
甲(发送器)(接收器)
乙(接收器)(发送器)
数据线
半双工方式
全双工: 是指发送方与接收方有两条数据线路,同一时刻可以利用这两条数据线路进行不同方向的数据传输。
甲(发送器)(接收器)
乙(接收器)(发送器)
数据线
全双工方式
(2) 调制与解调
计算机内使用的是数字信号,要求的频带很宽,而一般的通信线路(如电话线路)的频带只有 300Hz~ 3400Hz。若直接用电话线传输数字信息,则会引起严重的信号失真。
为了能通过电话线传送数据,必须要把数字信号变成符合线路要求的模拟信号,这就是调制。而将电话线路上的模拟信号变为计算机可以接受的数字信号就是解调。
(3)传输率
传输率是指每秒传送的二进制位的个数,通常与波特率相同。
计算机中常用的一些标准波特率系列为: 110 、 150 、 300 、 600 、 1200 、 2400 、 4
800 、 9600 、 19200 。 通信是根据传送的波特率来确定发送和接收时
钟的。收、发时钟频率和波特率之间的关系为: 时钟频率 =N*波特率
这里的 N 为波特率因子,常为 1 、 16、 32 、64 。
串行通信过程中常见的错误
串行通信中常见的错误有奇偶校验错、溢出错、帧格式错
奇偶校验错:是指接收方接收到的数据中 1 的个数与奇偶校验位不符,通常是由干扰引起的,发生这种错误时接收方应该要求发送方重新发送。
溢出错:是指接收方与发送方的速率不匹配,接受方没有来得及处理接收来的数据,发送方已经发送来下一个数据,造成数据丢失。可以通过降低发送方的发送速率或者在接收方设置多级缓冲结构等方法来减少这种错误。
帧格式错:是指接收方接受的字符格式与协议不符,这种错误多半是由双方协议不明确或干扰引起的。
4. 常用的异步通信规程
在数据传送过程中,为了能正确传送数据制定了许多通讯规程。常见的通讯规程有:
异步控制规程( ASYNC )、 同步控制规程( BISYNC )、 高级数据链路控制规程(HDLC )等。 每一种通讯规程都由一些大规模集成电路芯片完成,如:
可编程 UART (通用异步收发器) 8250 , 可编程 USART(通用同步 / 异步收发器) 8251 , 可编程HDLC/SDLC规程控制器 8273 与 8273A, 多协议串行控制器 8274等。
RS-232C 是一种 异步串行 接口
异步串行接口的核心电路称之为 通用异步发送器 - 接收器 UART( Universal Asynchronous Receiver-Transmitter) UART的主要功能是, 一方面可以把来自计算机的 8 位并行数据变换为
串行数据传送给MODEM或其他串行通信设备 ; 另一方面可以把来自MODEM或其他串行通信设备的串行数据变换为 8 位并行数据传送给计算机。
异步串行通信接口以 UART 为核心, 附加一些辅助电路, 如地址译码、电平转换等组成。
在 IBM PC/XT时代使用的 UART是 8250 , 后来升级到 NS 16550A/D, 现在集成到 SIO 电路中的兼容 UART常常称之为 NS 16C550 。
RS-232C 串行接口的电路 在 IA-32 Intel计算机的主板上,串行接口电
路由集成在 SIO 电路中的 UART( NS16C550 )、 电平转换电路 GD75232 、 及外部的 9 芯 D型连接器共同组成,
如下图示。
引脚 信 号 名 称 信号方向 说 明
1 DCD(DataCarrier Detect) MODEM → PC
数据载波检测
2 R×D#(Receive Data) MODEM → PC
接收数据
3 T×D#(Transmit Data)
MODEM ← PC
发送数据
4 DTR(DataTerminal Ready)
MODEM ← PC
数据终端准备好,加电后有效
5 GND(Ground) MODEM ─ PC
地
6 DSR(Data Set Ready)
MODEM → PC
数据设备准备好,加电后有效
7 RTS(Request to Send)
MODEM ← PC
请求发送
8 CTS(Clear to Send) MODEM → PC
清除待发
9 RI(Ring Indicator) MODEM → PC
振铃指示
表 9芯D型连接器信号名称与引脚分配
通用异步收发器( UART ) NS16550
主要功能: 1. 数据格式可以编程选择: 数据位可选 5 、 6、 7、 8 位, 停止位可选 1 、 1.5 、 2 位, 可选用(或不选用)奇校验或偶校验;
2. 波特率可编程设置: 波特率因子设定为 16 。
即:内部时钟电路能产生频率为 16× 波特率 的 时钟作为发送或接收的时钟; 发送或接收的时钟是对 UART的外部提供的基准时钟 1.8432MHz进行分频得到,能选择 1 ~65535作为分频系数 ,分频系数由 UART中的除数锁存器提供。
波特率收、发时钟频率
波特率因子
可得到公式 :
16
108432.1 6
除数锁存器值
波特率
通常用波特率(位 / 秒)来表示传输率。
可见,串行通信中信息传输率的选择可通过设置除数锁存器的不同的值来实现。
程序员可根据所需波特率的值计算出应设置的除数锁存器的值,通过输出指令写入除数锁存器即可 。(据上公式可得下表)
波特率 除数锁存器值1103001200240048009600192003840057600115200
1047380964824126321
表 晶振 1.8432MHz下的除数
3. 支持异步通信规程: 发送时在串行数据流中自动插入起始位、停止
位和奇偶校验位;接收时自动删除这些发送时插入的信息;
4. 具有和 MODEM的接口和控制信号(与 MODEM连接方便);
5. 发送和接收均采用双缓冲的结构,因而,发送时数据由 CPU写入 UART和接收时从 UART读取数据均无需严格的同步要求。
一般UART的寄存器结构框图
CS0CS1CS2#A2A1A0ADS#DISTRDISTR#DOSTRDOSTR#DDISCSOUTXTAL1XTAL2MR
NS16550 内部寄存器框图如下 :
CD#
NS16550 比以往的 UART中增加了 16字节的“ FIFO先进先出缓冲器”,用于缓冲读写操作,以适合高速处理器的通信。
NS16550 采用了 FIFO缓冲器,使 UART接收到的 16个字节数据之后,才通知微处理器,同样,若多达 16个字节的发送数据保持在 FIFO 中,等待发送将有利于提高传输效率。
NS16550电路的引脚信号
A0 , A1 , A2寄存器选择地 寄存器选择地址信号,芯片内有十个可供 CPU访问的寄存器,由三位地址译码与线路控制寄存器的最高位( DLAB)共同选择。
CS0 , CS1 , CS2# 芯片选择,只有当 CS0 、 CS1 为高电平, CS2#为
低电平时,该芯片被选中。ADS# 地址选通,用于锁存地址线和片选线 ,可以连接到地址译码器的选通端。它有效时,才可允许 UART与CPU 之间进行数据传送。
MR 主复位信号用于对 16550 的初始化,它应该与系统的 RESET信号相连。INTR 中断请求线用于向系统申请中断,如每收到或发出数据 16个字节、或数据检测到出错、或线路出错等就向
系统请求一次。RD、 RD# 读信号用于控制芯片中的 RX 缓冲器读出操作。两信号任选。
WR 、WR# 写信号用于将数据写入芯片的有关寄存器。两信号任选。SOUT、 SIN 串行发送和接收数据线。RCLK、 BAUDOUT# 分别为接收时钟和发送器时钟输入信号RTS#、 CTS# 分别是请求发送和批准发送。均与调制解调器相连。
DTR#、 DSR# 分别是数据终端准备就绪、数据通信设备准备就绪。均与调制解调器相连。DCD#( CD#) 载波检测线。来自调制解调器,该信号表明有一个设备与系统相连。RI# 响铃指示。由调制解调器置发来的表明有电话铃响。DDIS# 禁止 UART写操作。表明系统正在读操作,用于进行读写两个方向的转换。
D0-D7 数据总线与系统连接,用于传递数据、命令和状态。XIN, XOUT 主时钟线是由 18.432MHz晶振经过 10倍分频后连接到芯片上的。OUT1 、 OUT2 用户自定义引脚。可供 UART向调制解调器发命令信号。RXRDY#、 TXRDY# 分别为接收器与发送器准备就绪信号。
UART
NS16550 采用多种中断方法。这几个中断可由程序员在“中断允许寄存器”中事先设置。每当中断条件具备时, 16550 将向系统请求中断,并且将状态反映在“中断标识寄存器”中以便于程序查询。
“除数锁存器”有两个作用,一是用作波特率的除数因子,二是在高位上用 1 和 0区别端口寄存器地址。
串行通信参数由“线路控制寄存器”决定。“线路状态寄存器”保存的是通信进程中的状态。
为了对外部载波线路进行控制,设置有:“调制解调器控制寄存器”和“调制解调器状态寄存器”。
串行端口寄存器
NS16550 中的 10 个独立的可编程寄存器,是串行端口编程的基础。 COM1 、 COM2 所对应的 UART 寄存器及其所占用的 I/O 地址如下表所示。
(其中 DLAB指的是线路控制寄存器的最高位。)
寄 存 器地 址 COM1 I/O
空间地址COM2 I/O空间地址
DLAB
A2
A1
A0
接收缓冲寄存器 RBR (读操作) 0 0 0 0 03F8H 02F8H
发送缓冲寄存器 TBR (写操作) 0 0 0 0 03F8H 02F8H
中断允许寄存器 IER 0 0 0 1 03F9H 02F9H
中断标识寄存器 IIR (读操作) x 0 1 0 03FAH 02FAH
FIFO 控制寄存器 FCR (写操作) x 0 1 0 03FAH 02FAH
线路控制寄存器 LCR x 0 1 1 03FBH 02FBH
MODEM控制寄存器MCR x 1 0 0 03FCH 02FCH
线路状态寄存器 LSR x 1 0 1 03FDH 02FDH
MODEM状态寄存器MSR x 1 1 0 03FEH 02FEH
除数锁存器低位字节DLL 1 0 0 0 03F8H 02F8H
除数锁存器高位字节DLH 1 0 0 1 03F9H 02F9H
表 COM1 、 COM2 的 UART 寄存器及其所占用的 I/O 地址
中断允许寄存器用低 4 位分别使能 4 种中断,程序员可设置任何一
种中断,该寄存器各位的定义如下:D0 :为 1 时,允许接收的数据准备好时发中断;D1 :为 1 时,允许发送保持寄存器空时发中断;D2 :为 1 时,允许接收字符出错或收到间断状态
时发中断;D3 :为 1 时,允许Modem状态改变发中断。
中断允许寄存器:
每当在中断允许寄存器中已置 1 的中断被激活, UART 内部由硬件使中断标识寄存器位 0清 0 ,同时经过 INTR 发出中断信号。
只有执行中断服务程序,并读出中断标识及有关寄存器的内容,才能使此次中断复位(位 0置 1 )。否则,下一个同类型中断就不会得到响应。
中断标识寄存器:
中断标识寄存器
(等待处理)
FIFO 控制寄存器
FIFO 控制寄存器是 NS16550 为高速设备而设计的。原来使用 8250UART不存在 FIFO ,数据是通过缓冲器直接作用于移位寄存器上的。
NS16550 采用 16 个字节的 FIFO作为缓冲器,并且可由程序员对其进行控制。
FIFO 最多可接收 16字节数据,也可以设置成每次接收 1 , 4 , 8 和 14 个字节。
一旦到达设置的指定字节时, NS16550 就以中断形式通知系统,发送器或接收器已就绪 。
FIFO 控制寄存器位 3 ,用于选择 8250 方式或 FIFO方式。
如下图。
FIFO 控制寄存器
线路控制寄存器 用来设置通信参数、格式,包括选择数据包结构中的数据位、奇偶校验位和停止位等。
波特率的选择由线路控制寄存器和除数锁存器共同完成。
线路控制寄存器:
当线路控制寄存器的 D7 (即 DLAB )置 1 时,才允许访问除数锁存器,否则不访问除数锁存器。
线路控制寄存器 D6 用来选择是否允许发送数据间隔(若该位为 1 ,则强制 SOUT上连续输出空闲状态)。
D2 为 1 时,若字符代码长 5 位时,停止位为 1.5 位;若字符代码长 6、 7、 8 位时,停止位为 2 位。
D5 为 1 时,当收发双方已决定使用奇偶校验,即已置D3=1 ,但未约定用奇还是偶校验。因此,发送方在发送字符的同时,还要发送使用何种校验的信息。发送方在串行数据格式中的奇偶校验位与终止位之间插入一位作奇偶方式标志位:若为 0 ,表示偶校验;为 1 ,表示奇校验。
线路状态寄存器 可通过线路状态寄存器查询错误类型,转入错误分析处理程序。
当中断标识寄存器中的中断标识位 ID类型分别为 001 和 010 时,可从线路状态寄存器的位 5 、位 6、和位 0 得到发送器接收器的信息。
线路状态寄存器
调制解调器控制寄存器 可以用程序命令的方式设置信号的电平, 如数据终端准备就绪信号 DTR 、 请求发送信号 RTS 的电平高低, 都可以通过置位或复位该寄存器来实现。另外,调制解调器控制寄存器位 4 是选择要不要对来自通信设备的信号进行测试。
调制解调器控制寄存器
调制解调器状态寄存器 用于检测通信设备发出的信号状态。
DCD RI DSR CTS DCD变化 RI变化
DSR变化 CTS变化7 6 5 4 3 2 1 0
其余三个端口寄存器为除数锁存器、 发送寄存器和 接收寄存器。
UART 的编程 UART 初始化 就是对上述 除数锁存器 (低位 )、除数锁存器 (高位 )、通信线路控制寄存器、调制解调控制寄存器、中断允许寄存器 进行初值设置。
在进行数据传输时,以下几种因素是必须首先确定的:
一是确定传输速率; 二是必须确定其字符格式——字符长度、停止
位数、奇偶校验等;三是确定联络信号 (是否使用MODEM);四是确定 UART与计算机传送数据时是否使用
中断。 以上因素确定之后,则根据实际要求,对相应寄存器的相应位预置即可。
例:
使用 UART 进行异步方式通信,传输速率为 1200 波特,字符数据长度为 8bit/ 字符,1 位停止位,偶校验,不使用 Modem,使用查询方式收、发数据,那么, UART的初始化程序如下:
;以下确定传输速率MOV DX , 3FBH ;指向 LCR寄存器
MOV AL , 80H ;使 DLAB 位为 1
OUT DX , AL
MOV DX , 3F8H ;写除数寄存器低字节MOV AL , 60H
OUT DX , AL
INC DX ;写除数寄存器高字节MOV AL , 00H
OUT DX , AL
;以下为确定工作参数MOV DX , 3FBH
MOV AL , 00011011B ;用偶校验OUT DX , AL ; 1 位停止位, 8bit/ 字符;以下为禁止中断MOV DX , 3F9H ;禁止所有中断MOV AL , 00H
OUT DX , AL
UART编程实例—— PC机间的通信
串口服务程序 为了实现串口通信,可以采用 UART中的端
口寄存器进行编程,也可以调用 BIOS INT 14H串行通信的服务功能。
数据终端设备( DTE) 发生数据和最终接收数据的设备称为数据终端设备DTE( Data Terminal Equipment)。 DTE可以是网络计算机、电脑或打印机。
数据通信设备 DCE 位于公用电话线两端的设备称为数据通信设备DCE( Data Communication Equipment)。如调制解调器就是 DCE,用来在数字和模拟信号之间进行变换。
串行端口通信编程 串行通信典型的连接形式有两种:一种是数据终端 PC 机( DTE)之间,零调
制解调器的连接形式;另一种是数据终端 PC 机( DTE)与数据通
信设备DCE的通信。
数据终端 DTE之间的通信编程 主程序要完成 UART的初始化,及中断和数据段定义的工作;发送和接收数据过程,可作为子程序分别编程。步骤如下: 1 、主程序:*初始化NS16550*写线路控制寄存器,允许除数锁存器*准备数据包参数和波特率*写除数锁存器,置波特率值( 9600 )的高字节与低字节*写线路控制寄存器( 8 位数据、 1 位停止位、奇偶校验)*写 FIFO 控制器,允许发送器与接收器同时工作, 1 字节 FIFO 和非DMA方式。
* 写中断允许寄存器,允许接收中断、允许发送中断、允许线路中断*中断设置*8259 初始化,写中断控制字* 允许 IRQ3 (中断号为 0BH)中断*DS : DX指向服务子程序入口*暂存区指针设置*ES=DATA1*SI=0
2 、发送数据 取当前暂存区指针 SI ,比较是否到尾部,是则转B)退出;
A)读线路状态寄存器,测试位 5 ,判断发送缓冲器就绪与否,否则转A)等待;
是,从暂存区将写数据送 AL,暂存区指针 SI 加 1 将 AL数据写到发送缓冲器中 B)禁止发送及中断 中断返回
3 、接收数据 取当前暂存区指针 SI ,比较是否到尾部,是则转B)退出
A)读线路状态寄存器,测试位 1 ,判断 FIFO 有否数据,否则转A)
是,测试位 3 、位 2 、位 1 ,判断有否出错,有,转D 无错,读接收缓冲器到 AL 将 AL内容存入暂存区,暂存区指针 SI 加 1 B)禁止接收及中断 C )中断返回 D)有错,将 AL置错误标志‘?’,转 C )
INT 14H服务功能 ROM BIOS 采用 INT 14H作为对串行通信端口的上一级服务功能,主要由 6个子功能组成。与以往的服务功能相同,子功能入口由 AH寄存器指定。系统总共设 4 个物理串行端口。端口地址被安排在系统专用存储区中,见下表。这些串行端口可用简单的编号表示,用 0 、 1 、 2 、 3 分别代表 COM1-COM4 端口号。当调用子服务功能时,用 DX寄存器指定。调用过程中, DX可作为偏移量指向串行端口的专用地址表。
内存中与 I/O 有关的区域分配表
设备标志字:
P1 P0 保留
G S2 S1 S0 保留
D1 D0 V1 V0
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
P1 、 P0 :并行端口的个数; G=1 : 表示连接有游戏口;
S2 、 S1 、 S0 :串行端口的个数;
D1 、 D0 :软盘驱动器的个数, 00至 11 分别表示 1 、 2 、 3 、 4个;
V1 、 V0 :初始视频模式( 00 — 保留位;
01 — 40 列 25 行,彩色文本模式;
10 — 80列 25 行,彩色文本模式;
11 — 80列 25 行,单色文本模式;)
在专用地址表中还设定了超时数据区。这些数据区内存放着超时值,超时值的单位为秒,可由程序员访问。 4 个端口的超时值存放于专用区 40 : 7CH至 40 : 7FH中。每个端口分配一个字节。
6个子服务功能: AH=00 串行端口初始化 AH=01 字符发送 AH=02 字符接收 AH=03 读线路状态和调制解调器状态 AH=04 扩展的串行端口初始化,用于 P
S/2 机 AH=5 读 /写调制解调器控制器,用于
PS/2 机
1)AH=00
2 ) AH=01/02
3 ) AH=03
4 ) AH=04
5 ) AH=05
RS-232C 接口的应用
程序控制 UART 工作
线路控制寄存器 LCR
1 2 3 4A
B
C
D
4321
D
C
B
A
ͼ13.10 LCRµÄλģʽÓë¸÷¸öλµÄÃû³Æ
DLAB SB SP EPS PEN STB WLS1 WLS0
7 6 5 4 3 2 1 0
表 LCR 中 b0 位和 b1 位的功能与编码
b1 位 b0 位 数据长度
0 0 5 位
0 1 6位
1 0 7位
1 1 8 位
表 LCR 中 b3 位、 b4 位、 b5 位编码与功能b5 位( S
P )b4 位( E
PS )b3 位( PEN)
功 能0 0 0 无奇偶校验位0 0 1 奇校验0 1 0 无奇偶校验位0 1 1 偶校验1 0 0 无定义1 0 1 “P ”位强置为逻
辑 11 1 0 无定义1 1 1 “P ”位强置为逻
辑 0
b7 位:波特率因子锁存器访问位 DLAB ( Divisor Latch Access Bit)。
当需要访问波特率因子锁存器高位字节DLH和低位字节DLL的时候,必须把 DLAB位设置为逻辑 1 。
当需要访问接收缓冲寄存器( RBR ) / 发送缓冲寄存器( TBR )、中断允许寄存器( IER )的时候,必须把 DLAB位设置为逻辑 0 。
波特率因子锁存器高位字节DLH、低位字节DLL
8432MHz、波特率、波特率因子 三者之间的关系下表。
波特率 波特率因子十进制制值 DLH值 DLL 值
110 1047 04H 17H300 384 01H 80H1200 96 00H 60H2400 48 00H 30H4800 24 00H 18H9600 12 00H 0CH
19200 6 00H 06H38400 3 00H 03H57600 2 00H 02H115200
1 00H 01H
FIFO 控制寄存器 FCR FCR 的位模式与各个位的名称如下图所示。
1 2 3 4A
B
C
D
4321
D
C
B
A
ͼ13.11 FCRµÄλģʽÓë¸÷¸öλµÄÃû³Æ
RTL1 RTL0 ±£Áô ±£Áô DMS XFRSTRFRST FE
7 6 5 4 3 2 1 0
b0 位 : FIFO允许位 FE( FIFO Enable)。
如果把该位设置为逻辑 1 的时候,既允许使用接收 FIFO ,也允许使用发送 FIFO 。
如果把该位设置为逻辑 0 的时候,既禁止使用接收 FIFO ,也禁止使用发送 FIFO ,并且清除这两个 FIFO 中的全部字节。
注意,只有在该位为 1 的情况下,才能对 FCR 的其他位进行写操作。
b1 位 : 接收 FIFO复位位 RFRST ( RCVR FIFO Reset)。
如果把该位设置为逻辑 1 的时候,可以清除接收 FIFO 中的全部字节,并且把它的计数器逻辑也清除为 0 ,但不清除移位寄存器。
该位是可以自清除的。 RCVR:receiver 。
b2 位 : 发送 FIFO复位位 XFRST ( XMIT FIFO Reset)。
如果把该位设置为逻辑 1 的时候,可以清除发送 FIFO 中的全部字节,并且把它的计数器逻辑也清除为 0 ,但不清除移位寄存器。
该位是可以自清除的。 XMIT:transmitter 。
b3 位 :DMA方式选择位 DMS ( DMA Mode Select)。
向该位写入逻辑 1 的时候,不影响 UART的 工作,因为在兼容NS 16C550 的情况下, RXRDY
和 TXRDY 引脚不存在。
表 RTL0 和 RTL1 的组合与功能
b7 ( RTL1 )
b6 ( RTL0 )
接收 FIFO 中断触发条件(字节数)
0 0 1
0 1 4
1 0 8
1 1 14
例:在 CodeView的辅助下,读懂本例中的程序。;初始化 RS-232C 接口
.model small include rs-232c.inc .stack 20h
.codestart: mov dx,lcr ;允许写波特率因子锁存器的 DLL、 DLH
mov al,83h out dx,al
; mov dx,dll ;写波特率因子锁存器的 DLL mov al,03h out dx,al
mov dx,dlh ;写波特率因子锁存器的 DLH mov al,0 out dx,al
; mov dx,lcr ; 8 位数据, 1 个停止位,无奇偶位 mov al,03h out dx,al
; mov dx,fcr ;允许发送与接收 FIFO mov al,07h out dx,al
; xor ax,ax ;读出 LCR 的内容,以校核
mov dx,lcr in al,dx .exit end start