第 5 章 可编程接口芯片 (2)
5.3 串行通信的基本概念
5.4 可编程串行通信接口 16550
5.5 可编程串行通信接口 8251A
5.3 串行通信的基本概念
• 计算机与外部设备之间或计算机与计算机之间的信息交换称为“通信”。
• 通信方式可分为并行通信和串行通信两种: 并行通信:数据的各位同时传送 串行通信:按照一定的格式一位一位地顺序传
送数据。信号在一根信号线上传输。
• 计算机“主机”部件之间,如 CPU 与存储器、 CPU与接口电路,多采用并行方式传输数据
• 串行数据传输主要出现在接口与外部设备、计算机与计算机之间。
• 并行通信:数据有多少位,就需要多少根传输线,传送速度快。数据位数多、传输距离远时传输成本高。
• 串行通信:只需一对传输线,可以利用现有的电话线作为传输介质,降低传输线路的成本,远距离数据传送时更加突出。
图 5-23
5.3.1 串行数据通信
1 . 数据传送方式
( 1)单工方式只允许数据按照一个固定的方向传送
( 2)半双工方式收发双方均具备接收和发送数据的能力,只有一对
传输线,同一时刻只能有一个站发送
( 3)全双工方式有两对传输信号线,每个站任何时刻既可以发送,
又可以接收
图 5-24
2. 通信速率
( 1 )传输率每秒钟传送二进制数码的位数,单位:位 / 秒 (bps) 。
( 2 )波特率 每位传送时间的倒数 每次传送 1 位时,波特率大小和传输率相等 使用调相技术可以同时传输 2 位或 4 位,这时传输率
大于波特率 时钟频率可选为波特率的 1 倍、 16 倍或者 64 倍。
3. 信号的调制 / 解调
• 信号的调制: 用一个信号控制另一个信号的某个参数(幅值,频率,
相位) ,使之随之变化的过程称为调制。
• 信号的解调: 从已调制信号中还原出被调制信号的过程称为解调。
• 发送端,调制器把数字信号变成模拟信号送到传输线路上。
• 接收端,解调器把模拟信号还原成数字信号,送到数据处理设备。
• 调制器和解调器做在一起称为调制解调器,即MODEM 。
• 计算机称为数据终端设备 DTE ( Data Terminal Equipment )
• 调制解调器( MODEM )和其他通讯设备称为数据通信设备 DCE ( Data Communication Equipment )。
图 5-25
5.3.2 串行通信的方式
1. 同步传送方式 1) 发送方发送数据信号的同时发送一个用于同步的
时钟信号。2) 同步时钟信号的一个周期和一位数据是对应的。
在同步时钟信号一个周期的时间里,数据线上同步地发送 1bit数据。
3) 数据连续传送。若干个数据组成一个数据块。
同步通讯格式面向字符同步方式:
用一个或者两个同步字符作为数据块的开始。 同步字符由用户约定,经常采用 ASCII 码中代码为
16H 的“ SYNC (同步)”字符。 随后是由字符组成的信息, 字符之间没有间隔。
面向比特同步方式: 以二进制信息“ 01111110” 开始 随后是需要发送的各位二进制信息 最后以“ 01111110” 结束
图 5-26
2. 异步传送方式 • 异步传送的数据以字符为单位• 数据传输的速率由双方事先约定• 以“帧( Frame ”) 为传送单位• 一帧信息由 7~12 位二进制组成:
起始位: 1 位逻辑 0 数据位: 5 ~ 8 位,由收发双方约定,先发送低位。 奇偶校验位:可约定采用奇校验,偶校验,无校验传
输。 停止位: 1 位、 1.5 位或 2 位的逻辑 1 信号
图 5-27
5.3.3 串行通讯接口• 把计算机的并行数据转换成串行数据发送出去• 把接收到的外部串行数据转换成并行数据送入计算机
( 1) 数据总线收发器双向的并行数据通道,传送数据、状态和控制命令。
( 2)控制寄存器 接收 CPU 的各种控制信息。( 3)状态寄存器 串行通信过程中的状态信号
图 5-28
( 4)输入、输出移位寄存器 完成“并行”和“串行”二种数据的相互转换
( 5)数据输入寄存器输入移位寄存器每次接收一位外部输入的数据,接收的数据填满后,将完整的并行数据送入数据输入寄存器暂存。
( 6)数据输出寄存器接收来自 CPU 输出的数据,并行送往输出移位寄存器,逐位右移输出。
( 7)控制信号逻辑 接收 CPU 发来的控制信号,产生内部各寄存器的读写
信号。( 8)移位脉冲时钟 从外部输入时钟信号,用作发送和接收数据的移位时钟。
5.3.4 RS-232C 标准
• 为了使通信能够顺利地进行,通信双方必须就通信的规则事前进行约定,
• 约定好的并在通信过程中双方共同遵守的通信规则称为通信协议。
1 . 信号电平• RS-232C标准采用负逻辑• 逻辑“ 1” 在 -3V~-15V 之间• 逻辑“ 0” 在 +3V~+15V 之间• 通常使用 ±12V 作为 RS-232C 电平• MC1488 和 MC1489 进行 RS232 和 TTL 之间的电平转
换2 .信号定义• 表 5-6给出了 RS-232C 接口部分常用信号的定义。3 .接插件• 使用 25 个引脚或 9 个引脚的 D型接插件进行连接。
RTS
CTS
DSR
DCD
DTR
RI
符 号 方 向 功 能 9 针连接器引脚号
25 针连接器引脚号
TXD 输出 发送数据 3 2
RXD 输入 接收数据 2 3
输出 请求发送 7 4
输入 发送允许 8 5
输入 数据设备就绪 6 6
GND 信号地 5 7
输入 载波检测 1 8
输出 数据终端就绪 4 20
输入 响铃指示 9 22
5.4 可编程串行通信接口 16550
• 通用的可编程异步通信接口芯片。• 内部有时钟产生电路、可编程波特率发生器、
双缓冲通信数据寄存器和多种中断处理功能。• 对外有调制解调器控制信号,可直接与
MODEM 相连。• 与早期 IBM/PC 机使用的异步通信接口 8250兼容,最高波特率提高到 1.5Mb/s ,具有 16 字节FIFO (先进先出缓冲)发送和接收功能。
5.4.1 16550 的内部结构与外部引脚1. 数据总线缓冲器
• 连接 16550 与 CPU 数据总线2. 选择和读 / 写控制逻辑
• 接收来自 CPU 的地址、片选和控制信息,产生内部各端口的读写操作命令。
3. 发送器• 由发送保持寄存器、发送移位寄存器和发送同步控制
组成。• 待发送的数据写入发送保持寄存器。发送保持寄存器
的内容自动转存到发送移位寄存器,在发送器时钟的控制下,由 SOUT引脚发送出去。
4. 接收器• 由接收移位寄存器、接收缓冲寄存器和接收同步控制
器组成。• 在接收时钟控制下,由 SIN引脚输入的串行数据逐位
存入移位寄存器,转换后的并行数据存入接收缓冲寄存器,等待 CPU读取。
5. 调制 / 解调器控制电路• 提供一组控制信号,直接与调制解调器相连,完成远
程通信任务。6. 通信线控制寄存器和通信线状态寄存器
• 控制寄存器保存 CPU写入的通讯数据格式。• 状态寄存器提供串行数据发送和接收时的状态
7. 波特率发生控制电路• 由波特率发生器、分频系数寄存器组成。• 16550 对 18.432MHz 的输入时钟进行分频,产生所要
的发送器和接收器时钟信号。• 分频系数在初始化时分两次写入除数寄存器的高 8 位
和低 8 位,分频系数可由下式算出:• 除数 =18432000÷ (波特率 ×16 )
8. 中断控制逻辑• 由中断允许寄存器、中断识别寄存器和中断控制逻辑三部分组成。
• 实现中断优先权管理、中断申请等功能。
9. 16550 的引脚( 1 )数据信号 双向数据线 D7 ~ D0,与数据总线相连
( 2 )地址信号• 片选信号: CS0 、 CS1 、 CS2# 。 CS0=CS1=1 , CS2#=0
时,表明芯片被选中。• A2~A0 :具体访问哪个寄存器,由 A2~A0确定。• ADS# :地址选通信号 ADS# 为低电平时,锁存三个片
选信号以及 A2~A0的输入状态。
( 3 )读 / 写控制信号• 两对读写控制信号,每对信号功能相同,电平不同。• RD=1 或 RD#=0 中一个有效且 16550 被选中时,可读;• WR 和 WR#=0 中一个有效且 16550 被选中,可写。
图 5-30
16550
A2
INTR
CTS
A1
A0
RCLKSIN
SOUT
CS1
CS0
XOUT
XIN
DSR
RD
DCD
RD
RTS
D0D1D2D3D4D5D6D7
VCC
OUT1
ADS
OUT2
MR
RI
DDIS
DTR
TXRDY
CS2BAUDOUT
WRWRVSS
RXRDY
1 40
20 21
( 4 )中断控制和复位信号
• INTR :发送保持寄存器空或接收数据有效, 16550 的中断允许寄存器相应位置 1 时, 16550 的中断请求引脚INTR 变为高电平,用作中断请求信号。
• MR :复位信号,输入,它与系统 RESET 信号连接,系统复位同时也对 16550复位。
• OUT1 和 OUT2 :这两个输出引脚可以通过用户编程来改变输出电平。
图 5-31
( 5 )时钟信号• XIN 和 XOUT : 16550 的时钟信号输入引脚。• 从 XIN 输入的基准时钟,经过 16550内部波特率发生器
(分频器)分频后产生发送器时钟,并经过 BAUDOUT引脚输出。
• RCLK :接收时钟,输入,常与 BAUDOUT 相连。( 6 )与外设 / 调制解调器之间的联络信号• RTS#: 请求发送信号,输出。输出给外设或 MODEM• CTS#: 允许发送信号,输入。外设或 MODEM 对 RTS# 的
应答。• DTR#: 数据终端准备好。输出给外设或 MODEM
的, DTR#=0表示 16550 已经就绪。• DSR# :数据设备准备好。对 DTR 信号的应答, DSR#=0 ,表示外设或 MODEM 已经就绪。
• DCD#: 载波检测输入 , 表示MODEM 已经接收到载波信号
• RI#: 振铃指示输入信号 , 表示MODEM 已经接收到振铃信号。
• SIN :串行数据输入。• SOUT :串行数据输出。
( 7 )数据就绪信号• RXRDY :接收器就绪信号• TXRDY :发送器就绪信号。
5.4.2 16550 的内部寄存器
1. 16550 内部寄存器• 有 10 个可寻址的 8 位寄存器,由地址线 A0 ~ A2
和读 /写控制信号选择要访问的寄存器。• 内部寄存器分为三组:
数据传输:发送保持寄存器和接收缓冲寄存器。 工作方式、参数设置:通信线控制寄存器、除数寄存
器、 MODEM 控制寄存器和中断允许寄存器。 状态寄存器:通信线状态寄存器、 MODEM 状态寄存
器和中断识别寄存器。
DLAB A2 A1 A0 访问的寄存器 主串口地址 辅串口地址
0 0 0 0 接收缓冲器(读) 3F8H 2 F8H
0 0 0 0发 送 保 持 寄 存 器(写) 3F8H 2 F8H
0 0 0 1 中断允许寄存器 3F9H 2 F9H
× 0 1 0 中断识别 /FIFO 寄存器 3FAH 2 FAH
× 0 1 1 通信线控制寄存器 3FBH 2 FBH
× 1 0 0MODEM 控制寄存器 3FCH 2 FCH
× 1 0 1 通信线状态寄存器 3FDH 2 FDH
× 1 1 0MODEM 状态寄存器 3FEH 2 FEH
1 0 0 0除数寄存器(低字节) 3F8H 2 F8H
1 0 0 1除数寄存器(高字节) 3F9H 2 F9H
( 1 )发送保持寄存器( 3F8H/2F8H )• 保存 CPU 送来的并行数据,送到发送移位寄存器,发
送移位寄存器在发送器时钟的作用下,把并行数据转换成串行数据从 SOUT引脚输出。
• 只有在发送保持寄存器空时, CPU才可以向发送保持寄存器写入下一个要发送的数据。
( 2 )接收缓冲寄存器( 3F8H/2F8H )• 在接收时钟的作用下,从 SIN引脚输入的串行数据被
送到接收移位寄存器。• 去掉起始位、校验位和停止位后,串行数据转换成并
行数据并存入接收缓冲寄存器,等待 CPU 接收。
( 3 )通信线控制寄存器( 3FBH/2FBH )• 用来设置串行异步通信的数据格式• D7位: DLAB寻址位
D7=1 ,访问除数寄存器 D7=0 ,访问接收缓冲器、发送保持寄存器。
• D6 位: D6=1 ,发送方连续发送长时间中止信号(空号),空号发送的时间超过一个完整的字符传送时间时,接收方就认为发送方已中止发送。
• D3 ~ D5位:选择奇偶校验方式。• D2位:规定一帧数据中停止位的位数。• D0位、 D1位:定义一帧数据中数据位的位数。
图 5-32
通信线控制寄存器( 3FBH/2FBH )
( 4 )中断识别寄存器 / FIFO 控制寄存器 (3FAH/2FAH)• 16550内部有四级中断,但只有一根中断请求信号。中断发生
后, CPU 通过查询中断识别寄存器来辨别中断类型。• FIFO 控制寄存器和中断识别寄存器占用相同的端口地址。中断发生时读出该寄存器的内容,它作为中断识别寄存器来使用;写入 FIFO 控制字时,作为 FIFO 控制寄存器。
图 5-33
中断识别寄存器
图 5-34
( 5 )通信线状态寄存器( 3FDH/2FDH )
图 5-35
( 6 )中断允许寄存器( 3F9H/2F9H ) 低 4 位代表中断允许控制位,置 1 ,则允许相应的中断源请求中断,否则禁止中断。
( 7 ) MODEM 控制寄存器( 3FCH/2FCH )设置与调制解调器连接的联络信号:D7 ~ D5位规定为 0;D4位: =1 ,正常发送 / 接收;
=0 ,内部循环方式(用于芯片检测)。D0 ~ D3位的状态直接控制相关引脚的输出电平:
D0=1 ,使引脚 DTR#= 0 , DTR# 信号有效。 D1=1 ,使引脚 RTS#= 0 , RTS# 信号有效。 D2=1 ,使引脚OUT1 # = 0 ,该引脚留给用户使用。 D3=1 ,使引脚 OUT2 # = 0 ,使 16550 能送出中断请求。
DCTS
DCD
DSRCTS DDCD
TERI
DDSR
D7 D6 D5 D4 D3 D2 D1 D0
CTS# 发生变化
0= 无变化1= 有变化
DSR# 发生变化
0= 无变化1= 有变化
RI# 变化0= 无变化1= 有变化
DCD# 发生变化
0= 无变化1= 有变化
DCD# 引脚0= 引脚为 11= 引脚为 0
DSR# 引脚0= 引脚为 11= 引脚为 0
CTS# 引脚
0= 引脚为1
1= 引脚为0
RI
RI# 引脚0= 引脚为 11= 引脚为 0
( 8 ) MODEM 状态寄存器( 3FEH/2FEH )
图 5-36
( 9 )除数寄存器( 3F8H, 3F9H/2F8H, 2F9H )
• 16550 发送或接收的移位时钟,是在它的基准时钟( 18.432MHz )基础上分频而来的。
• 根据所需的波特率来确定分频系数,并在初始化时存入除数寄存器。
• 表 5-8给出了 9 种波特率所需设置的除数寄存器的值。
波特率 除数高 8 位 除数低 8 位1200 03H 0C0H
1800 02H 80H
2000 02H 40H
2400 01H 0E0H
3600 01H 40H
4800 00H 0F0H
7200 00H 0A0H
9600 00H 78H
19200 00H 3CH
表 5-8 波特率与分频系数对照表
5.4.3 串行通信接口 16550 的应用
1. 16550 的初始化• 计算机硬件或软件复位后,要对 16550 进行初
始化。• 初始化主要包括:
1) 对通信线控制寄存器进行设置,确定异步通信的数据格式。
2) 设置除数寄存器,确定通信速率。3) 对 FIFO 控制寄存器、中断允许寄存器和 MODEM
控制寄存器进行设置。
初始化步骤:
( 1 ) 80H 送通信线控制寄存器,使寻址位 D7=1 。
( 2 )除数高 8 位 / 低 8 为分别送除数寄存器高 8 位/ 低 8 位,确定通信速率。
( 3 )将 D7=0 的命令字写入通信线控制寄存器, 确定串行异步通信一帧数据帧的格式。
图 5-32
图 5-32
通信线控制寄存器( 3FBH/2FBH )
( 4 )设置 FIFO 控制寄存器( 3FAH ) 。• FIFO 控制寄存器与中断识别寄存器的地址都是 3FAH;读出时是中断识别寄存器;写入时是 FIFO 控制寄存器。 FIFO 控制寄存器中各位的功能如图 5-37 。
( 5 )设置中断允许寄存器( 3F9H/2F9H )• 设置成查询方式:中断允许寄存器中的命令字为 0。• 设置为中断方式:设置中断允许寄存器中的相应位为 1,该位所控制的中断请求允许中断。
( 6 )设置MODEM 控制寄存器( 3FCH/2FCH )D4=0 :设置 16550 为正常接收 / 发送方式。D4=1 :设置 16550 工作在内部循环自检方式。D3=0 : 16550 工作在查询方式。D3=1 : 16550 工作在中断方式。
MODEM 控制寄存器
例: 16550 端口地址为 3F8H-3FFH ,使 16550 以 19200 波特率进行异步通信,每字符为 8比特, 1 个停止位,采用奇校验,允许所有中断,则初始化程序为:MOV DX , 03FBH ; 16550 控制寄存器地址送DXMOV AL , 80H ;置 DLAB=1 ,设置除数寄存器OUT DX , ALMOV DX , 03F8H;除数低 8 位寄存器地址送 DXMOV AX , 003CH;波特率为 19200bpsOUT DX , AL ;送除数低 8 位MOV AL , AHINC DX ;产生除数高 8 位寄存器地址OUT DX , AL ;送除数高 8 位
MOV DX , 03FBH ; 16550 控制寄存器地址送 DX
MOV AL , 0BH ; 8 位数据位 , 奇校验 ,1 位停止位OUT DX , AL
MOV DX , 03FAH ; FIFO 控制寄存器地址送 DX
MOV AL , 47H ;允许 FIFO 并清除OUT DX , AL ; 设 FIFO 中断触发值为 4 字节MOV DX , 03F9H;中断允许寄存器地址送 DX
MOV AL , 0FH ;允许所有中断OUT DX , AL ; 设置中断允许控制字MOV DX , 03FCH ; MODEM 控制字寄存器地址MOV AL , 0BH ;正常收发, OUT1,OUT2 有效OUT DX , AL ;设置MODEM 控制字......
2. 16550 应用举例
• 两台计算机通过 16550实现异步通信• 16550 的接收和发送数据均采用查询工作方式• 通信波特率 9600bit/s
• 每字符为 8比特, 1 个停止位• 采用奇校验
; 计算机 A_____16550查询方式发送程序
DATA SEGMENT
SEND_DATA DB NUM1 , NUM2,… ;要发送的数据TIMES DW N ;发送的数据个数 DATA ENDS
CODE SEGMENT
ASSUME CS : CODE, DS : DATA
BEGIN1:MOV AX, DATA
MOV DS, AX
; 计算机 A_____16550查询方式发送程序
DATA SEGMENT
SEND_DATA DB NUM1 , NUM2,… ;要发送的数据TIMES DW N ;发送的数据个数 DATA ENDS
CODE SEGMENT
ASSUME CS : CODE, DS : DATA
BEGIN1:MOV AX, DATA
MOV DS, AX
;初始化 16550MOV DX , 03FBH ; 16550 控 制寄 存器 地址 送DX MOV AL, 80H ;置 DLAB=1 ,设置除数寄存器OUT DX, ALMOV DX, 03F8H ;除数寄存器地址送 DXMOV AX, 0078H ;波特率为 9600bit/sOUT DX, ALMOV AL, AH INC DXOUT DX, ALMOV DX , 03FBH ; 16550 控 制寄 存器 地址 送DXMOV AL, 0BH ; 8 位数据位 , 奇校验 ,1 位停止位OUT DX, AL
;初始化 16550MOV DX , 03FBH ; 16550 控 制寄 存器 地址 送DX MOV AL, 80H ;置 DLAB=1 ,设置除数寄存器OUT DX, ALMOV DX, 03F8H ;除数寄存器地址送 DXMOV AX, 0078H ;波特率为 9600bit/sOUT DX, ALMOV AL, AH INC DXOUT DX, ALMOV DX , 03FBH ; 16550 控 制寄 存器 地址 送DXMOV AL, 0BH ; 8 位数据位 , 奇校验 ,1 位停止位OUT DX, AL
……
CALL TRANS
……
MOV AH, 4CH ;程序结束,返回操作系统INT 21H
;查询方式发送子程序TRANS PROC NEAR
LEA BX, SEND_DATA
MOV CX, TIMES;要发送的数据个数送 CX
AGAIN: MOV DX, 03FDH ;通信状态寄存器地址送 DX
IN AL, DX
TEST AL, 20H ;检测发送器是否准备就绪JZ AGAIN
……
CALL TRANS
……
MOV AH, 4CH ;程序结束,返回操作系统INT 21H
;查询方式发送子程序TRANS PROC NEAR
LEA BX, SEND_DATA
MOV CX, TIMES;要发送的数据个数送 CX
AGAIN: MOV DX, 03FDH ;通信状态寄存器地址送 DX
IN AL, DX
TEST AL, 20H ;检测发送器是否准备就绪JZ AGAIN
MOV DX, 03F8H
MOV AL, [BX] ;取出发送区域的待发送数据OUT DX, AL
INC BX ;指向下一个待发送数据LOOP AGAIN ; N 个数据传送完了吗?RET
TRANS ENDP
CODE ENDS
END BEGIN1
MOV DX, 03F8H
MOV AL, [BX] ;取出发送区域的待发送数据OUT DX, AL
INC BX ;指向下一个待发送数据LOOP AGAIN ; N 个数据传送完了吗?RET
TRANS ENDP
CODE ENDS
END BEGIN1
; 计算机 B_____16550 查询方式接收程序DATA SEGMENT
REC_DATA DB 100 DUP ( ? ) ;存放接收的数据TIMES DW N ;要接收的数据个数DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
BEGIN2:MOV AX, DATA
MOV DS, AX
;初始化 16550
MOV DX, 03FBH ; 16550 控制寄存器地址送 DX
MOV AL, 80H ;置 DLAB=1 ,设置除数寄存器 OUT DX, AL
; 计算机 B_____16550 查询方式接收程序DATA SEGMENT
REC_DATA DB 100 DUP ( ? ) ;存放接收的数据TIMES DW N ;要接收的数据个数DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
BEGIN2:MOV AX, DATA
MOV DS, AX
;初始化 16550
MOV DX, 03FBH ; 16550 控制寄存器地址送 DX
MOV AL, 80H ;置 DLAB=1 ,设置除数寄存器 OUT DX, AL
MOV DX, 03F8H ;除数寄存器地址送 DX
MOV AX, 0078H ;波特率为 9600bit/s
OUT DX, AL
MOV AL, AH
INC DX
OUT DX, AL
MOV DX , 03FBH ; 16550 控制寄存器地址送 DX
MOV AL, 0BH ; 8 位数据位 , 奇校验 ,1 位停止位OUT DX, AL
……
CALL RECEIVE
……
MOV AH, 4CH ;程序结束,返回操作系统INT 21H
MOV DX, 03F8H ;除数寄存器地址送 DX
MOV AX, 0078H ;波特率为 9600bit/s
OUT DX, AL
MOV AL, AH
INC DX
OUT DX, AL
MOV DX , 03FBH ; 16550 控制寄存器地址送 DX
MOV AL, 0BH ; 8 位数据位 , 奇校验 ,1 位停止位OUT DX, AL
……
CALL RECEIVE
……
MOV AH, 4CH ;程序结束,返回操作系统INT 21H
;查询方式接收子程序RECEIVE PROC NEAR
LEA BX, REC_DATA ;接收缓冲区首址送 BX
MOV CX, TIMES ;要接收的数据个数送 CX
REPIN: MOV DX , 03FDH ;通信状态寄存器
地址IN AL, DX
TEST AL, 1EH ;检测接收的数据有无错误JNZ ERROR
TEST AL, 01H ;检测接收缓冲器中是否有数据JZ REPIN
;查询方式接收子程序RECEIVE PROC NEAR
LEA BX, REC_DATA ;接收缓冲区首址送 BX
MOV CX, TIMES ;要接收的数据个数送 CX
REPIN: MOV DX , 03FDH ;通信状态寄存器
地址IN AL, DX
TEST AL, 1EH ;检测接收的数据有无错误JNZ ERROR
TEST AL, 01H ;检测接收缓冲器中是否有数据JZ REPIN
MOV DX, 03F8H ;数据接收寄存器地址送 DXIN AL, DXMOV [BX], ALINC BXLOOP REPINCLC ;接收成功,清 CY 标志位JMP DONE
ERROR: STC ;接收不成功,置 CY 标志位
DONE :RET
RECEIVE ENDPCODE ENDS
END BEGIN2
MOV DX, 03F8H ;数据接收寄存器地址送 DXIN AL, DXMOV [BX], ALINC BXLOOP REPINCLC ;接收成功,清 CY 标志位JMP DONE
ERROR: STC ;接收不成功,置 CY 标志位
DONE :RET
RECEIVE ENDPCODE ENDS
END BEGIN2
5.5 可编程串行通信接口 8251A
( 1 )可用于串行异步通信,也可用于串行同步通信。 ( 2 )接收、发送数据分别有各自的缓冲器,可以进行全双
工通信。 ( 3 )提供与外部设备特别是调制解调器的联络信号,便于
直接和通信线路相连接。 ( 4 )每个字符的位数可以是 5 ~ 8 位,可以设定奇校验或
偶校验,也可以不设校验。校验位的插入、检错及剔除都由芯片自动完成。
( 5 )异步通信时,停止位可选 1 位、 1.5 位或 2 位,波特率为 0 ~ 19.2K ,时钟频率可设为波特率的 1 倍、 16 倍或 64 倍。
(6 )同步通信时,波特率的范围为 0 ~ 56K 波特。可设为单同步、双同步或者外同步,同步字符可由用户自行设定。
5.5.1 8251A 的外部引脚D0D1D2D3D4D5D6D7
RESETRDWRC/DCS
TxRDYTxE
RxRDY
TxDTxC
RxDRxCSTNDET
CTSRTSDSRDTR
CLK+5VGND
27281256782113101211151814
8251A
199
32516
17232224
20264
与CPU连接 与外设连接
1. 与 CPU 连接的引脚 D7~ D0 :数据线,与系统数据 总线相连。 RESET :复位信号,输入, 高电平有效。复位后 8251A 处于空闲状态 直至被初始化编程。 RD# :读选通信号,输入, 低电平有效。 WR#: 写选通信号,输入, 低电平有效。
C/D# :控制 / 数据端口选择输入线。 8251A 内部占用两个端口 地址,为“ 0” 时选择数据端口,传输数据(读或写), 为“ 1” 时选择控制端口, 传输的是控制字(写)或状态 信息(读)。由于该引脚信号用于选择内部端口,通 常把它和地址总线的 A0( 8088 )或 A1( 8086 )相连。
CS#: 选片信号,输入,低电平有效。为低电平时 CPU 才能 对 8251A 操作。
TxRDY :发送准备好状态,输出,高电平有效。发送寄存器 空且允许发送(脚电平为低,同时命令字中 TxEN 位 为 1 )时 TxRDY 为高电平。 CPU 向 8251A 写入一个字 符后 TxRDY 恢复为低电平。 TxRDY 可以用来向 8259A 申请发送中断。
TxE :发送缓冲器空闲状态,输出。高电平有效, TxE=1 ,表示发送缓冲器中没有要发送的 字符, CPU 把要发送的下一个数据写入 8251A 后, TxE 自动复位。
RxRDY :接收准备好状态,输入,高电平有效。 接收器接到一个字符后 RxRDY 为“ 1” , 字符被 CPU 读取后恢复为“ 0”。 RxRDY
可用来向 8259A 申请接收中断。
2. 与外设或调制解调器连接的引脚
TxD :发送数据输出。 CPU 并行输出给 8251A 的数据从这 个 引脚串行发送出去。 RxD :串行数据输入,高电平表示数字 1 ,低电平表示数字 0 。 SYNDET :同步状态输出,或者外同步信号输入。此引脚 仅对同步方式有意义。
以下 4 根引脚用来连接调制解调器DTR# :数据终端准备好,输出,低电平有效。 8251A 命令 字位 D1 为 1 时有效,用于向调制解调器表示数据终 端(计算机)已准备好。
DSR# :数据设备准备好,输入,低电平有效。调制解调 器准备好时有效,向 8251A 表示 MODEM (数据设 备)已准备就绪。 CPU 可通过读取状态寄存器的 D7 位检测该信号。
RTS# :请求发送信号,输出,低电平有效。 8251A 命令字 位 D5 为 1 时有效,请求调制解调器作好发送准备( 建立载波)。
CTS# :清除发送(允许传送)信号,输入,低电平有效。 调制解调器作好传送准备时有效,作为对 8251A 的 信号的响应。
注意:
如果 8251A 不使用调制解调器直接和外界 通信,应将 8251A的 DSR#、 CTS# 接地。
3. 时钟信号
CLK :时钟信号,输入,用于产生 8251A 内部时序。 CLK
的 周期为 0.42μs ~ 1.35μs 。 要求 CLK 的 频 率 至少应 是 接 收 、 发 送 时 钟 的 30 倍 ( 对 同 步 方 式 ) 或 4.5 倍 (对异步方式)。 RxC# :接收器时钟输入,它控制接收器接收字符的速率,在 它的上升沿采集串行数据输入线。的频率应等于波特率 (同步方式)或等于波特率的 1 倍 /16 倍 /64 倍(异步方式) TxC# :发送器时钟输入,在的下降沿数据由 8251A移位输出。 对频率的要求同 RxC#。
4 . 8251A 的工作过程( 1 )接收器的工作过程 异步方式中,接收器接收到有效的起始位后,开始接收后续的数据位、奇偶校验位和停止位。然后将数据送入寄存器。此后 RxRDY 输出高电平,表示已收到一字符, CPU可以来读取。
同步方式中,若程序设定 8251A 外同步接收,则SYNDET 脚用于输入外同步信号(来自MODEM), SYNDET 脚上的电平正跳变启动接收数据。若程序设定 8251A 内同步接收,则 8251A先搜索同步字符(同步字符事先由程序装在同步字符寄存器中)。 RxD 线上每收到一位信息就移入接收寄存器并和同步字符寄存器内容比较,若不相等则接收下一位后再比较,直到两者相等。此后 SYNDET 输出高电平,表示已搜索到同步字符。接下来便把接收到的数据逐个地装入接收数据寄存器。
4 . 8251A 的工作过程 (2)
( 2 )发送器的工作过程 异步方式中,发送器在数据前加上起始位,并
根据程序的设定在数据后加上校验位和停止位,组成“一帧”信息。然后从低位开始,从 TxD 引脚逐位发送。
同步方式中,发送器先发送同步字符,然后逐位地发送数据。若 CPU 没有及时把数据写入发送缓冲器,则 8251A 用同步字符填充,直至 CPU 写入新的数据。
5.5.2 8251A 的内部寄存器8251A 芯片占用 2 个端口地址,由 C/D# 引脚上输入的电平
进行选择。C/D#=0 数据端口
数据输入寄存器 读操作数据输出寄存器 写操作
C/D#=1 控制端口方式控制字寄存器 写操作命令字寄存器 写操作同步字符寄存器 写操作(仅同步方式)状态寄存器 读操作
1. 方式控制字寄存器
方式控制字确定 8251A 的通信方式(同步 / 异步)、校验方式(奇校验 / 偶校验 / 不校验)、数据位数( 5/6/7/8 位)及波特率参数等。方式控制字的格式如图 5-39所示。它应在复位后写入,且只需写入一次。
D7 D6 D5 D4 D3 D2 0 0
字符长度00 5位01 6位10 7位11 8位
01:奇校验11:偶校验X0:禁止校验
(a) 同步方式下的方式字
D7 D6 D5 D4 D3 D2 D1 D0
字符长度00 5位01 6位10 7位11 8位
01:奇校验11:偶校验X0:禁止校验
停止位:00:无效01 1: 个停止位10 1. 5: 个停止位11 2: 个停止位
(b) 异步方式下的方式字
0:内同步1:外同步
0:双同步字符1:单同步字符
波特率系数01: (1x)10: (16x)11: (64x)
2. 命令字寄存器命令控制字使 8251A 处于规定的状态以准备发送或接收
数据。它应在写入方式控制字后写入,用于控制 8251A 的工作,可以多次写入。
图 5-40 8251A 命令控制字格式
D7 D6 D5 D4 D3 D2 D1 D0
EN I R RTS ER SBRK RXE DTR TXEN
进入搜索方式1: 进行 SYNC 搜索
发送允许1: 允许 , 0 :禁止
数据终端准备好1: 迫使 DTR 输出 0
接收允许1: 允许, 0: 禁止
内部复位1:8251A 内部复位
发送断点字符1: 迫使 TxD 为低 , 0: 正常
请求发送1: 迫使 RTS 输出 0
出错复位1: 复位错误标志
3 . 同步字符寄存器
8251A 工作在“内同步”方式时,需要由程序员把使用的“同步字符”存入该寄存器,供搜寻同步字符使用。可以有“单同步字符”和“双同步字符”两种选择。
4 . 状态寄存器 状态寄存器存放 8251A 的状态信息,供 CPU 查询。
图 5-41 8251A 状态字格式
D7 D6 D5 D4 D3 D2 D1 D0
同引脚定义
DSRSYNDET FE OE PE TxE RxRDY TxRDY
1: 奇偶错帧格式出错1: 表 示 未 检测到有效停止位 溢出错
1: 表示未取走字符又输入了下个字符
5.5.3 8251A 的应用
8251A在使用前也要进行初始化。初始化要在 8251A处于复位状态时开始。
异步方式下 8251A 的初始化过程: ( 1 ) 写入方式字; ( 2 ) 写入控制字。 同步方式下 8251A 的初始化过程: ( 1 ) 写入方式字; ( 2 ) 写入同步字符( 1 个或 2 个); ( 3 ) 写入控制字。
例:设 8251A 控制口地址 301H ,数据口地址 300H ,按下述要求对 8251A 进行初始化:
( 1 )异步工作方式,波特率系数为 64 (即数据传送速率是 时钟频率的 1/64 ),采用偶校验,总字符长度为 10 (一位起始位, 8 位数据位, 1 位停止位)。
( 2 )允许接收和发送,使错误位全部复位。( 3 )查询 8251A 状态字,接收准备就绪时,从 8251A 输
入 数据,否则等待。
MOV DX, 301H ; 8251A 控制口地址MOV AL, 01111111B ;方式控制字OUT DX, AL ;送方式控制字MOV AL, 00110111B ;操作命令字OUT DX, AL ;送操作控制字WT:MOV DX, 301HIN AL, DX ;读入状态字TEST AL, 02H ;检查 RxRDY=1?JZ WT ; RxRDY≠1, 接收未就绪 ,等待MOV DX, 300H IN AL, DX ;读入数据
MOV DX, 301H ; 8251A 控制口地址MOV AL, 01111111B ;方式控制字OUT DX, AL ;送方式控制字MOV AL, 00110111B ;操作命令字OUT DX, AL ;送操作控制字WT:MOV DX, 301HIN AL, DX ;读入状态字TEST AL, 02H ;检查 RxRDY=1?JZ WT ; RxRDY≠1, 接收未就绪 ,等待MOV DX, 300H IN AL, DX ;读入数据
习题 5
1. 8255A 的方式选择控制字和 C 口按位控制字的端口地址是否一样, 8255A怎样区分这两种控制字?写出 A 端口作为基本输入, B 端口作为基本输出的初始化程序。
2. 用 8255A 的 A 端口接 8 位二进制输入, B 端口和 C端口各接 8 只发光二极管显示二进制数。编写一段程序,把 A 端口的读入数据送 B 端口显示,而 C端口的各位则采用置 0/置 1 的方式显示 A 端口的值。
3. 用 8255A 用作两台计算机并行通信的接口电路,请画出采用查询式输入 / 输出方式工作的接口电路,并写出采用查询式输入 / 输出方式的程序。
4. 设计一个用 8255A 作为 8 个七段显示器的接口电路,并设计一个把内存地址为 ADDRA 的 8 个数字在这 8个七段显示器上显示的程序。
5. 8254 的定时 / 计数器的定时与计数方式有什么区别? 8254 在方式 0 工作时,各通道的 CLK 、 GATE 信号有什么作用?各通道的控制字地址都相同, 8254 是怎样区分的?
6. 设 8254 的端口地址为 0240H ~ 0243H ,通道 0 的输入 CLK 频率为 1MHz ,为使通道 0 输出 1KHz 的方波,编写初始化程序。如果让通道 0 与通道 1级联(即 OUT0 接 CLK1 )实现 1 秒钟定时,则初始化程序如何编制。
7. 编制一个使 PC 机的 8254产生 600Hz 方波的程序,并使该方波送至扬声器发声。
8. 在 RS-232C 接 口 标 准 中 , 引 脚TxD 、 RxD 、 RTS# 、 CTS# 、 DTR# 、 DSR# 的功能各是什么?
9. 16550 的通信控制寄存器中的寻址位有什么作用?在初始化编程时,应该怎样设置?
10. 编写 PC 机中 16550 采用查询方式输入 50 个字符的异步通信程序,设 16550 的端口地址为 3F8H ~3FFH ,数据格式为: 8 位数据位、 1 位偶校验位、2 位停止位,通信速率为 19.2Kbps 。