【微机接口】可编程串行异步通信芯片8250_缓冲寄存器

8250能实现数据串并变换,实现全双工异步通信。

支持异步通信协议,数据格式、通信速率由初始化编程设定。

内部有中断机制,CPU可用查询中断方式与之交换信息。

 

8250内部寄存器:

【微机接口】可编程串行异步通信芯片8250_缓冲寄存器_02

 发送保持寄存器:保存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为通信线状态寄存器

              ;SCANT写在MOV DX,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位)

【微机接口】可编程串行异步通信芯片8250_数据_03

 通信线控制寄存器:指定串行异步通信数据格式

【微机接口】可编程串行异步通信芯片8250_寄存器_04

D7=1表明后继写入合用端口的数据写入除数寄存器

D7=0表明后继写入何用端口的数据写入非除数寄存器

【微机接口】可编程串行异步通信芯片8250_网络_05

 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

除数寄存器000CH        (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,0CH

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