Files
final-exam/接口与通讯技术/复习文档/8251A串行通信接口.md
T

11 KiB
Raw Blame History

tags, create time
tags create time
接口与通讯技术
8251A
串行通信
可编程芯片
2026-06-26 23:05

8251A 串行通信接口

概述

8251A 是 Intel 公司生产的可编程串行通信接口芯片(USART,Universal Synchronous/Asynchronous Receiver/Transmitter),在试题 A、B、D 中均有出现。它负责 CPU(并行数据)与串行外设之间的数据格式转换,支持异步和同步两种通信方式。

[!tip] 考试要点

  • 两个控制字的写入顺序:先方式控制字,再命令控制字
  • 方式控制字各位含义:D7D6(波特率因子)、D1D0(数据位)
  • 异步帧格式:起始位 + 数据位 + 校验位 + 停止位的总位数计算
  • 状态信号:TXRDY、RXRDY 的含义

正文

1. 串行通信基础概念

异步通信 vs 同步通信

特性 异步通信 同步通信
同步方式 起始位/停止位实现字符同步 同步字符实现数据块同步
数据单位 逐字符传送 以数据块为单位
传输效率 较低(每字符有冗余位) 较高
适用场景 低速、不连续数据 高速、连续数据
硬件要求 简单 较复杂

异步通信帧格式

graph LR
    A["起始位(1)"] --> B["数据位(5~8)"]
    B --> C["校验位(0或1)"]
    C --> D["Stop Bit"]

[!example] 帧长度计算 1 位起始 + 8 位数据 + 1 位奇偶校验 + 1 位停止 = 10 位/帧

波特率 2400 bps → 每秒最多传输 2400 / 10 = 240 个字符

RS-232C 电平标准

逻辑值 RS-232C 电平 TTL 电平
逻辑 "1" -3V ~ -15V +2.4V ~ +5V
逻辑 "0" +3V ~ +15V 0V ~ +0.4V

[!warning] RS-232C 采用 负逻辑,与 TTL 电平 完全相反!因此 RS-232C 接口需要电平转换芯片(如 MAX232)。

2. 8251A 的两个控制字

8251A 的编程核心是 两个控制字,写入顺序不可颠倒:

graph LR
    A["硬件/软件复位"] --> B["写入方式控制字"]
    B --> C["写入命令控制字"]
    C --> D["正常工作"]
    D --> E["可随时写入新命令控制字"]

工作方式控制字

在复位后 必须首先写入,定义通信格式参数:

D7 D6     D5 D4       D3 D2      D1 D0
[波特率因子] [校验控制] [停止位]   [数据位]

异步模式下:
D7D6: 00=同步 01=x1  10=x16  11=x64
D5D4: 00=无校验 01=奇校验 10=偶校验
D1D0: 00=5位 01=6位 10=7位 11=8位

[!example] 方式控制字计算 要求:异步通信,波特率因子 x16,偶校验,8 位数据,1 位停止位

D7D6=10(x16), D5D4=10(偶校验), D3D2=01(1 位停止位), D1D0=11(8 位数据)

控制字 = 1010 0111B = A7H


要求:异步通信,波特率因子 x1,无校验,7 位数据

D7D6=01(x1), D5D4=00(无校验), D3D2=01(1 位停止位), D1D0=10(7 位数据)

控制字 = 0100 0110B = 46H

命令控制字

定义 8251A 的操作行为:

D7  D6    D5    D4    D3   D2   D1   D0
EH  IR    RTS   ER    SBRK  RxE   TxD   TxEN
0   1     0     1     0     0     0     0
复位

各位功能:

位 符号 含义
D0 TxEN 发送允许(1=允许发送)
D1 TxD 数据输出使能(0= TxD 输出无效)
D2 RxE 接收允许(1=允许接收)
D3 SBRK 发送 Break 字符
D4 ER 错误标志复位(1=清除 FE/OE/PE 错误标志)
D5 RTS 请求发送(1=RTS 有效为低电平)
D6 IR 内部复位(1=回到等待方式控制字状态)
D7 EH 进入搜索方式(同步模式用)

[!example] 命令控制字计算 要求:允许发送,允许接收,清除错误标志

对应位:TxEN(D0)=1, RxE(D2)=1, ER(D4)=1, 其余=0

按位排列:D7~D0 = 0001 0101B = 15H

[!info] 常见默认初始化值 许多教材给出的默认初始化值为 5BH(0101 1011),含义是:

  • IR=0(不断电)
  • RTS=1(有效,发出握手请求)
  • ER=1(清除错误标志)
  • RxE=1(允许接收)
  • TxD=1(使能发送数据输出)
  • TxEN=1(允许发送)

3. 状态信号

信号 含义 用途
TXRDY 发送缓冲器空且允许发送 通知 CPU 可以写入新数据
RXRDY 接收缓冲器满 通知 CPU 可以读取数据
TxE 发送器空 所有数据已发送完毕
SYNDET/BRKDET 同步检测/Break 检测 同步模式或 Break 条件

[!question] TXRDY 何时变高? 当发送缓冲器空 且 命令控制字中 TxEN=1(允许发送)时,TXRDY 变高。CPU 查询到 TXRDY=1 后可以写入下一个待发送的数据字节。

4. 引脚功能

引脚 功能
TxD 发送数据输出
RxD 接收数据输入
TxC 发送时钟(控制发送速率)
RxC 接收时钟(控制接收速率)
RTS 请求发送(输出,通知外设准备接收)
CTS 清除发送(输入,外设表示已准备好)
DTR 数据终端准备好(输出)
DSR 数据装置准备好(输入)

[!info] 硬件流控制 RTS/CTS 和 DTR/DSR 两对信号实现硬件握手中的数据流方向控制:

  • 发送方:发 RTS(请求发送)→ 等待 CTS(允许发送)→ 开始发送
  • 接收方:通过 CTS 控制发送方是否可以继续发数据

5. 8251A 初始化流程

; 8251A 完整初始化程序
; 端口地址:04F0H(数据口),04F2H(控制口)

; 步骤 1:确保复位状态
MOV DX, 04F2H       ; 控制口
MOV AL, 00H
OUT DX, AL
OUT DX, AL
OUT DX, AL          ; 连续写 3 次 00
MOV AL, 40H
OUT DX, AL          ; 内部复位命令

; 步骤 2:写方式控制字
MOV AL, 4FH         ; 波特率 x16, 偶校验, 8 位数据
OUT DX, AL

; 步骤 3:写命令控制字
MOV AL, 15H         ; 允许收发, 清除错误标志
OUT DX, AL

[!danger] 初始化顺序不可乱 8251A 硬件复位后处于"等待方式控制字"状态。必须先写方式控制字,再写命令控制字。若想重新初始化,需先写命令控制字中 IR=1(40H)进行内部复位,再按顺序重写两个控制字。

6. 深度理解

波特率因子的工作原理

波特率因子是连接 系统时钟频率 与 实际传输速率 的桥梁:

graph TD
    CLK["系统输入时钟"] --> DIV["除以 N (N=1,16,64)"]
    DIV --> TXC["TxC — 发送波特率时钟"]
    DIV --> RxC["RxC — 接收波特率时钟"]
    TXC --> RATE["实际比特率 = CLK/N"]
    RxC --> RATE2["实际比特率 = CLK/N"]

[!info] 计算示例

  • 系统时钟 = 1 MHz,波特率因子 x16 → 实际波特率 = 1,000,000 / 16 = 62,500 bps
  • 波特率因子越小,实际传输速率越高
  • x1: 最高速率;x16: 适中;x64: 最低速率(适合低速设备)

校验位的作用机制

校验类型 规则 检测能力
无校验 不发送额外位 无法检测任何错误
奇校验 使数据位+校验位中 "1" 的个数为奇数 检测单比特错误
偶校验 使数据位+校验位中 "1" 的个数为偶数 检测单比特错误
空格校验 校验位固定为 0 同上

[!tip] 奇偶校验的局限 只能检测奇数个比特的错误。如果同时发生偶数个比特翻转(如第 3 位和第 5 位同时出错),奇偶校验无法发现。因此在高速通信中常采用 CRC 等更强大的校验方式。

握手协议详解

除了前面提到的 RTS/CTS 硬件握手机制外,8251A 还支持 DTR/DSR 两对信号:

sequenceDiagram
    participant CPU as CPU + 8251A
    participant Line as 通信线路
    participant Peer as 对端设备
    
    CPU->>Line: DTR 置有效
    Note over CPU: 表明己方终端已就绪
    Peer->>CPU: DSR 置有效
    Note over Peer: 确认对方已就绪
    
    CPU->>Line: RTS 置有效
    Note over CPU: 请求开始发送
    Peer->>CPU: CTS 置有效
    Note over Peer: 允许开始发送
    CPU->>Peer: 开始发送 TxD
    Peer->>CPU: 逐字符响应 RXRDY

[!question] 为什么要两套握手信号? RTS/CTS 通常用于逐字节流控(每发一字节前检查一次);DTR/DSR 用于会话级准备(整个通信开始前确认双方都已上线)。两者配合可实现完整的两层流控。

自测问答

通过以下问题检验对 8251A 的掌握程度:

[!question] Q1:为什么必须先写入方式控制字,再写入命令控制字? 答:8251A 复位后默认进入"等待方式控制字"状态。只有收到合法的方式控制字后,芯片才会解析出波特率因子、校验模式等底层参数,从而切换到可接受命令的状态。若颠倒顺序,命令控制字会被当作方式控制字处理,导致配置失效。

[!question] Q2:异步通信下,若使用 x16 波特率因子,波特率为 9600 bps,传输一个 10 位帧的字符需要多长时间? 答:时间 = 10 bit / 9600 bps ≈ 1.04 ms。注意:实际波特率已经由 x16 因子确定,无需再用该因子除。

[!question] Q3:TXRDY 和 TxE 有什么区别?编程时应如何区分使用? 答:

  • TXRDY:表示发送保持寄存器为空,可以写入新数据——用于发送循环中判断能否写入下一字节。
  • TxE:表示所有数据已全部发送完毕(包括移位寄存器中的位)——用于判断发送是否彻底结束,常用于程序退出前的同步等待。

[!question] Q4:将奇校验的控制字从 1010 0111B 改为偶校验,值变为多少? 答:只需修改 D5D4:10(偶校验)。其余不变。结果 = 1010 0111B → 等等,这个例子中原就是偶校验(10)!若原为奇校验 1010 0111B 的 D5D4=01,改偶校验后 D5D4=10,新值 = A7H(实际上本例 A7H 本来就是偶校验配置)。

[!question] Q5:在同步通信模式下,8251A 还需要设置哪些不同于异步的参数? 答:主要区别有三点:

  1. D7D6=00(同步模式,不使用波特率因子)
  2. D3D2 不再代表停止位(同步通信没有起始位/停止位概念)
  3. 初始化完成后需要在命令控制字中设置 EH=1,让芯片进入搜索同步字符的状态

关联笔记