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

286 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags:
- 接口与通讯技术
- 8251A
- 串行通信
- 可编程芯片
create time: 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 同步通信
| 特性 | 异步通信 | 同步通信 |
|------|----------|----------|
| 同步方式 | 起始位/停止位实现字符同步 | 同步字符实现数据块同步 |
| 数据单位 | 逐字符传送 | 以数据块为单位 |
| 传输效率 | 较低(每字符有冗余位) | 较高 |
| 适用场景 | 低速、不连续数据 | 高速、连续数据 |
| 硬件要求 | 简单 | 较复杂 |
#### 异步通信帧格式
```mermaid
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 的编程核心是 **两个控制字**,写入顺序不可颠倒:
```mermaid
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 初始化流程
```asm
; 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. 深度理解
#### 波特率因子的工作原理
波特率因子是连接 **系统时钟频率** 与 **实际传输速率** 的桥梁:
```mermaid
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 两对信号:
```mermaid
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,让芯片进入搜索同步字符的状态
## 关联笔记
- [[8255A可编程并行接口]]
- [[8254定时计数器]]
- [[8259A中断控制器]]
- [[接口与通讯技术/DMA控制器8237A]]
- [[接口与通讯技术/试题册/index|试题册索引]]