串行通信(8250)

一、串行异步通信

数据格式

起始位 数据位 校验位 停止位
1位 5~8位 1位(可选) 1位或1.5位或2位

注: 停止位在8250寄存器中只有一位bit控制,为0则为1位停止位,为1则由8250根据数据位自动选择1.5位(5位数据)或是2位(大于5位数据)停止位。

波特率:

  1. 时钟信号与波特率一般有一定的比率关系,例如:16倍、32倍、64倍。
  2. 如果时钟速率是信号速率的16倍,在接收端检测到起始位的低电平时,启动内部计数器,当计数到一个数据位宽度的一半(即8个时钟脉冲)后再检测一次,如果还是低电平,则确认为起始信号,然后以位(1/波特率)为间隔,移位接收数据位和检验位。
  3. 波特率除数因子的计算:
  • 波特率因子=1.8432M/16/波特率
  • 1.8432M/16其实就是熟知的115200,因此可以直接计算:波特率因子=115200/波特率

串行通信方式

  1. 单工方式:
    单工方式只允许数据按照一个固定的方向传送。
  2. 半双工方式:
    半双工方式要求收发双方都具备接收和发送数据的能力,但由于只有一条信道,数据不能在两个方向上同时传送。
  3. 全双工方式:
    收发双方可以同时进行数据传送。

二、8250编程

8250寄存器结构

微型计算机系统8250内部寄存器端口地址

DLAB A2 A1 A0 被访问的寄存器 主串口地址 辅串口地址
0 0 0 0 接收缓冲寄存器(读) 3F8H 2F8H
发送保持寄存器(写)
0 0 0 1 中断允许寄存器 3F9H 2F9H
x 0 1 0 中断识别寄存器 3FAH 2FAH
x 0 1 1 通信线控制寄存器 3FBH 2FBH
x 1 0 0 MODEM控制寄存器 3FCH 2FCH
x 1 0 1 通信线状态寄存器 3FDH 2FDH
x 1 1 0 MODEM状态寄存器 3FEH 2FEH
1 0 0 0 除数寄存器(低字节) 3F8H 2F8H
1 0 0 1 除数寄存器(高字节) 3F9H 2F9H

注: DLAB不是芯片引脚,是通信线控制寄存器的D7位(寻址位)

中断允许寄存器

中断允许寄存器

D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 X X X X

中断寄存器的D7F4位恒为0。D3D0位表示8250的4级中断是否被允许。

  • D0=1,允许接收到一帧数据后,内部提出“接收中断请求”
  • D1=1,允许发送保持寄存器空闲时,内部提出“发送中断请求”
  • D2=1,允许接收出错时,内部提出“接收数据错中断请求”
  • D3=1,允许MODEM状态改变时,内部提出“MODEM中断请求”

优先级顺序: 接收数据错中断请求>接收中断请求>发送中断请求>MODEM中断请求

中断识别寄存器

中断识别寄存器

D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 X X X X

8250内部有四个中断源,但是8250只能向CPU发出一个中断请求,为了识别是8250内部哪一个中断源引起的中断,在进入中断服务程序后,先读取中断识别寄存器的内容进行判断,然后再跳转入相应的处理程序。
中断识别寄存器的D7~D3位恒为0,D0位表示有无中断待处理,D0=1表示无中断待处理,D0=0则表示有中断待处理。
D2~D1位表示四种中断源识别码,其代表的中断源如表
8250的中断源

D2 D1 D0 中断优先级 中断类型 中断复位控制
0 0 1 —— 无中断 3F8H
1 1 0 最高 接收数据错 读通信线状态寄存器可复位
1 0 0 次高 接收数据准备好 读接收缓冲器可复位
0 1 0 次低 发送保持寄存器空 写发送保持寄存器可复位
0 0 0 最低 调制解调器状态改变 读调制解调器状态寄存器可复位

识别码和中断源如何对应记忆:
结合中断优先级顺序,识别码只与D2D1两位有关;

  • 优先级最高(接收数据错)——>D2D1=3
  • 优先级次高(接收数据准备好)——>D2D1=2
  • 优先级次低(发送保持寄存器空)——>D2D1=1
  • 优先级最低(调制解调器状态改变)——>D2D1=0

注意:这个优先级顺序与数字大小的对应关系和中断系统中优先级与中断类型号的数字大小相反

通信线控制寄存器

该寄存器规定了串行异步通信的数据格式
通信线控制寄存器格式

D7 D6 D5 D4 D3 D2 D1 D0
寻址位 中止位设置 奇偶位选择 停止位选择 数据位选择
  1. 寻址位:
    • 1:访问除数寄存器
    • 0:访问合用端口地址的非除数寄存器
  2. 中止位设置:
    • 1:长时间输出中止信号(0),发送端若设置中止位为1,接收端会判为线路间断(与通信线状态寄存器中的线路间断标志位相联系)。
    • 0:正常通信
  3. 奇偶校验选择:
    • 若D3=0,表示不进行奇偶校验
    • 001:设置奇校验(记忆提示:一(奇数)个1为奇校验
    • 011:设置偶校验(记忆提示:两(偶数)个1为偶校验
    • 101:校验位恒为1
    • 111:校验位恒为0
  4. 停止位选择:
    • 0:一位停止位
    • 1:(D1D0=00)1.5位停止位;(D1D0≠00)2为停止位
  5. 数据位选择:
    • 00:五位
    • 01:六位
    • 10:七位
    • 11:八位

关于寻址位:
8250内部有10个可访问的8位寄存器,但8250只有3根用于端口选择的地址线,因此必然有些寄存器合用一个端口地址。
8250规定:高8位除数寄存器和中断允许寄存器合用一个口地址;低8位除数寄存器、发送保持寄存器和接收缓冲寄存器合用一个口地址。为了在访问时区分合用地址的寄存器,用通信线寄存器的D7位作为寻址位,即《微型计算机系统8250内部寄存器端口地址》表中的DLAB
当通信线控制寄存器中D7位为1时,对3F8H和3F9H地址访问即访问除数寄存器
当通信线控制寄存器中D7位为0时,对3F8H和3F9H地址访问即访问接收缓冲寄存器(读)、发送保持寄存器(写)和中断允许寄存器。

MODEM控制寄存器

MODEM控制寄存器中D3~D0位的状态直接控制相关引脚的输出电平:
- D0=1,使引脚DTR=0,从而使RS-232C引脚DTR为0。
- D1=1,使引脚RTS=0,从而使RS-232C引脚RTS为0。
- D2=1,使引脚OUT1=0,PC系列机未使用。
- D3=1,使引脚OUT2=0,8250能送出中断请求。
D4位通常置0,设置8250工作在正常收/发方式;若D4置1,则8250工作在内部自环方式,即发送移位寄存器的输出在芯片内部被送回接收移位寄存器的输入。利用这个特点,可以测试8250的工作是否正常;但这只能测试CPU与8250之间及芯片的编程设置是否正常,不能测试与设备通信是否正常。

通信线状态寄存器
- D0位:接收数据准备好(接收缓冲器满)标志位。D0=1,表示接收器已接收到一帧完整的数据,并已转换成并行数据,存入接收缓冲器中。若8250工作在查询接收方式,在读取接收缓冲器之前要先查询此标志位,只有在此标志位为1时再去读接收缓冲器。
- D1位:溢出错标志位。D1=1,表示接收缓冲器中的数据未取走,8250又接收到新的数据,造成前一数据的破坏。
- D2位:奇偶校验错标志。D2=1,表示接收带的数据有奇偶错。
- D3位:帧错(接收格式错)标志位。D3=1,表示接收到的数据没有正确的停止位。
- D4位:线路间断标志位。D4=1,表示接收到长时间0信号(即中止信号)。
- D5位:发送保持寄存器空闲标志位。D5=1,表示数据已经从发送保持寄存器转移到发送移位寄存器,发送保持寄存器空闲,CPU可以写入新的数据。当新数据写入到发送保持寄存器后,D5为0。若8250采用查询发送方式,在写入数据前须查询此位,只有当此位为1时,才可以对发送保持寄存器进行写数据。
- D6位:发送移位寄存器空闲标志。D6=1,表示一帧数据已经发送完毕。当新的数据由发送保持寄存器移入发送移位寄存器时,该位为0。
D7位:恒为0。

D1~D4均为错误标志,只要其中一位为1,在中断允许的情况下,8250内部将产生“接收数据错”中断,当CPU读取状态寄存器后,自动复位。

MODEM状态寄存器

这个寄存器从考试方面来说,考到的机会几乎为0

8250应用程序

用两台计算机主串口进行短距离点——点全双工通信,要求:

  1. 数据格式:7个数据位,1个停止位,奇校验,通信速率为1200波特。
  2. 用查询方式将内存发送缓冲区中数据发送出去。发送数据由偏移地址BEG开始存放,结束字符为0DH
  3. 用中断方式接收数据,并依次放入数据偏移地址为REBEG开始的数据区中,当接收到结束字符0DH时,将FLAG单元置为FFH
  4. 假设双方同一时刻启动程序,当本方数据发送完毕,并且收到对方的结束字符则结束通信。
DATA SEGMENT
BEG			DB "123456789" ,0DH
COUNT    	EQU $-BEG
REBEG		DB COUNT DUP(00H)
FLAG		DB 00H
INTTAB		DD ?
INTIMR		DB ?
DATA ENDS

CODE SEGMENT
           ASSUME CS:CODE,DS:DATA
 START:  
            MOV AX ,DATA
            MOV DS ,AX
            CALL INIT8250
            PUSHF
            CLI
            CALL REPL74
            CALL REPLIMR
            STI
            MOV SI ,OFFSET BEG
            MOV CX ,COUNT
            CLD
 SCAN:   	MOV DX ,3FDH
            IN AL  ,DX
            AND AL ,00100000B
            JZ SCAN
            LODSB
            MOV DX ,3F8H
            OUT DX ,AL
            LOOP SCAN
 WAIT:   	MOV AL ,FLAG
            CMP AL ,0FFH
            JNE WAIT
            CLI
            CALL REST74
            CALL RESTIMR
            POPF
            MOV AH ,4CH
            INT 21H
           
INIT8250    PROC
            PUSHA
            MOV DX ,3FBH
            MOV AL ,80H
            OUT DX ,AL
            MOV DX ,3F8H
            MOV AL ,96
            OUT DX ,AL
            MOV DX ,3F9H
            MOV AL ,00H
            OUT DX ,AL
            MOV DX ,3FBH
            MOV AL ,00001010H
            OUT DX ,AL
            MOV DX ,3F9H
            MOV AL ,01H
            OUT DX ,AL
            MOV DX ,3FC
            MOV AL ,08H
            OUT DX ,AL
            POPA
            RET
INIT8250    ENDP

REPL74		PROC
            PUSHA
            PUSH ES
            MOV DI ,OFFSET INTTAB
            MOV AX ,00H
            MOV ES ,AX
            MOV BX ,1D0H
            MOV AX ,ES:[BX]
            MOV [DI] ,AX
            MOV AX ,OFFSET SERVICE
            MOV ES:[BX] ,AX
            ADD DI ,2
            ADD BX ,2
            MOV AX ,ES:[BX]
            MOV [DI] ,AX
            MOV AX ,SEG SERVICE
            MOV ES:[BX] ,AX
            POP ES
            POPA
            RET
 REPL74		ENDP
 
 REPLIMR    PROC
            PUSHA
            IN AL ,21H
            MOV INTIMR AL
            AND AL ,11101111B
            OUT 21H ,AL
            POPA
            RET 
 REPLIMR    ENDP
 
 REST74     PROC
            PUSHA 
            PUSH ES
            MOV AX ,00H
            MOV ES ,AX
            MOV BX ,1D0H
            MOV AX ,WORD PTR INTTAB
            MOV ES:[BX] ,AX
            ADD BX ,2
            MOV AX ,WORD PTR INTTAB+2
            MOV ES:[BX] ,AX
            POP ES
            POPA
            RET
   REST74   ENDP
   
   RESTIMR  PROC
            PUSHA
           	MOV AL INTIMR
            OUT 21H ,AL
            POPA
            RET
    RESTIMR ENDP
    
    SERVICE PROC
            PUSHA
            MOV DX ,3F8H
            IN AL ,DX
            MOV BX ,OFFSET REBEG
            MOV DI ,[BX+COUNT-1]
            MOV [BX][DI] ,AL
            CMP AL ,0DH
            JNE NOT0DH
            MOV BYTE PTR FLAG ,0FFH
            JMP EXIT
   NOT0DH:	ADD BYTE PTR [DI]
     EXIT:	MOV AL ,20H
            OUT 20H ,AL
           	POPA
            IRET
   SERVICE  ENDP
   
   CODE ENDS 
        END START

你可能感兴趣的:(微机原理)