8250能实现数据串并变换,实现全双工异步通信。
支持异步通信协议,数据格式、通信速率由初始化编程设定。
内部有中断机制,CPU可用查询中断方式与之交换信息。
8250内部寄存器:
发送保持寄存器:保存CPU传送来的并行数据,并转移至发送移位寄存器。
只有在发送保持寄存器空闲时,CPU才能写入写一个数据。
接受缓冲寄存器:
接受移位寄存器,去掉起始位,检验位和停止位,转换成并行数据,转换后的并行数据存入接受缓冲寄存器,等待CPU接受。
只有当一帧数据收完后,CPU才能用IN指令读接受缓冲寄存器
通信线状态寄存器:寄存通信线状态
D0:D0=1表示接收器已接收到一帧完整的数据,并已转换成并行数据,存入接受缓冲寄存器。
D5: D5=1表示发送保持寄存器空闲,CPU可以写入新数据。
D0位和D5位是串行接口最基本的标志位,它们决定了CPU能不能向8250进行读写操作,只有当D0=1时,CPU才能读数;只有当D5=1时,CPU才能写数据。
D1D2D3D4位如果为1,说明出错。
例:利用主串口查询方式发送一个‘A’
(在此之前,8250通信线寄存器最高位设置为0)
SCANT :MOV DX,3FDH ;3FDH为通信线状态寄存器
IN AL,DX ;读取通信线状态寄存器到AL
TEST AL,00100000B/20H ;检查发送保持寄存器是否空闲
JZ SCANT ;一直等到D5为1时,才继续进行下一步
MOV DX,3F8H ;发送保持寄存器
MOV AL,'A'
OUT DX,AL ;向发送保持寄存器发送一个字符‘A’
例:利用辅串口查询方式接受一个字符
(在此之前,8250通信线寄存器最高位设置为0)
SACNT:MOV DX,3FDH ;3FDH为通信线状态寄存器
IN AL,DX ;读取通信线状态寄存器到AL
TEST AL,01H ;检查接受缓冲器是否有数据
JZ SACNT ;一直等到D0为1时,才继续进行下一步
MOV DX,2F8H
IN AL,DX ;从辅串口接受缓冲寄存器读取一个字符到AL
发送保持寄存器和接受缓冲寄存器口地址相同,当使用OUT指令时,默认访问发送保持缓冲器;
当使用IN指令时,默认访问接受缓冲寄存器。
中断允许寄存器:
D7~D4位恒为0,D3~D0位表示8250的4级中断是否被允许。
D0:允许接受到一帧数据后,内部提出接受中断请求
D1:允许接受到一帧数据后,内部提出发送中断请求
D2D3
当8250工作在查询方式,中断允许寄存器全部置0。
中断识别寄存器?没用到
MODEM控制寄存器:
000_ _ 000(只需要考虑D3,D4位)
D3=1:8250用中断方式与CPU交换信息;D3=0:8250用查询方式与CPU交换信息
D4=0:8250工作在正常收发方式;D4=1:8250工作在内部自环方式
除数寄存器(高8位,低8位)
通信线控制寄存器:指定串行异步通信数据格式
D7=1表明后继写入合用端口的数据写入除数寄存器
D7=0表明后继写入何用端口的数据写入非除数寄存器
MOV DX,3FBH; 3FBH控制线寄存器
MOV AL,80H ; 10000000B (访问除数寄存器)
OUT DX,AL ; 访问除数寄存器
MOV DX,3F9H; 除数寄存器高8位
MOV AL, N ;
OUT DX,AL ; N写入除数寄存器高8位
MOV DX,3FBH ;3FBH控制线寄存器
MOV AL,01111111B(写最高位,后面不管);访问非除数寄存器
OUT DX,AL
MOV DX,3F8H
MOV AL,N
OUT DX,AL ;N写入发送保持寄存器
8250的初始化编程:
直接对8250端口进行初始化编程
(1)确定波特率: 设置除数锁存器
(2)确定数据格式: 设置通信线路控制寄存器
(3)若使用中断方式: 设置中断允许寄存器的相应位(置“1”)
(4)设置MODEM控制寄存器
例:编写子程序,对PC系列机主串口进行初始化,要求:
(1)通信速率=1200波特,一帧数据包括:8个数据位,1个停止位,无校验
(2)查询方式,完成内环自检
查表:除数寄存器0060H
一帧数据结构命令字:00000011B(3FBH,第一位为0是因为之后用不到除数寄存器)
中断允许命令字:0
MODEM控制字00010000B=10H
注意D3在右面,D4在左面
I8250 PROC
MOV DX,3FBH
MOV AL,80H
OUT DX,AL ;这三行固定,表示访问除数寄存器
MOV DX,3F9H
MOV AL,0 ;00H写入除数寄存器高8位
OUT DX,AL ;
MOV DX,3F8H
MOV AL,60H
OUT DX,AL ;60H写入除数寄存器低9位
MOV DX,3FBH
MOV AL,03H
OUT DX,AL ;定义一帧数据格式
MOV AL,0
OUT DX,AL
MOV DX,3FCH ;置MODEM控制器
MOV AL,10H
OUT DX,AL
RET
I8250 ENDP
例:要求以9600bps进行异步串行通信,每个字符7位,2个停止位,奇校验,允许所有中断。
假设端口地址的高位0011,1111,1A2A1A0
除数寄存器0060H (3FBH)
数据格式:00001110B (3FBH)
允许所有中断:中断允许寄存器0FH
MODEM控制器:000010(11)?(考试不考)
MOV DX,3FBH
MOV AL,80H
OUT DX,AL ;访问除数寄存器
MOV DX,3F9H
MOV AL,0
OUT DX,AL;除数寄存器高8位
MOV DX,3F8H
MOV AL,60H
OUT DX,AL;除数寄存器低8位
MOV DX,3FBH
MOV AL,00001110B
OUT DX,AL;设置数据帧格式
MOV DX,3F9H
MOV AL,0FH
OUT DX,AL;设置中断允许寄存器
MOV DX,3FCH
MOV AL,0BH
OUT DX,AL ;置MODEM控制器
例:A、B两机利用主串口,查询方式,进行单工通信,A机发送电文“hello”至B机。试为A机编写发送程序。要求:波特率为2400,奇校验,停止位1位,数据位7位,采用查询方式。
除数寄存器:0030H
A机:
DATA SEGMENT USE16
BUF DB 'HELLO'
LEN EQU $-BUF
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
CALL I8250 ;完成8250初始化编程
;在完成8250的初始化编程后默认访问的是非除数寄存器
LEA BX,BUF
MOV CX,LENS
SCAN: MOV DX,3FDH
IN AL,DX ;忘记写
TEST AL,20H;检测D5是否为1,如果为1说明可以发送数据
JZ SCAN
MOV DX,3F8H
MOV AL,[BX];使用LOOP循环遍历字符串
OUT DX,AL
INC BX
LOOP SCAN
NEXT: MOV AH,4CH
INT 21H
I8250 PROC
MOV DX,3FBH
MOV AL,80H
OUT DX,AL ;访问除数寄存器
MOV DX,3F9H
MOV AL,0
OUT DX,AL ;除数寄存器高8位00H
MOV DX,3F8H
MOV AL,30H
OUT DX,AL ;除数寄存器低9位30H
MOV DX,3FBH
MOV AL,00001010B
OUT DX,AL ;设置一帧数据格式
MOV DX,3FCH
MOV AL, 0
OUT DX,AL
RET
I8250 ENDP
CODE ENDS
END BEG
B机:
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: CALL I8250 ;同上(和A一样)
MOV CX,5
SCAN:MOV DX,3FDH
IN AL,DX
TEST AL ,01H ;D0位是1说明可以接受数据
JZ SCAN
IN AL,3F8H ;出错
正确写法
MOV DX,3F8H
IN AL,DX ;使用AL接受读取缓冲区的数据
LOOP SCAN
MOV AH,4CH
INT 21H