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

196 lines
6.2 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["停止位(1, 1.5, 2)"]
```
> [!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 位数据
>
> D7D6=10(x16), D5D4=10(偶校验), D3D2=01(1 位停止位), D1D0=11(8 位数据)
>
> 控制字 = `1010 0111B` = **A7H**
>
> ---
>
> **要求**:异步通信,波特率因子 x16,偶校验,8 位数据,1 位停止位
>
> D7D6=01(x1 → 按试卷答案 D7D6=01 即因子 1), D3D2=11, D1D0=11
>
> 控制字 = `0100 1111B` = **4FH**
#### 命令控制字
定义 8251A 的操作行为:
```
D7 D6 D5 D4 D3 D2 D1 D0
EH IR RTS ER SBRK RxE TxD TxEN
0=正常 0 0=RTS高 0 0 0 0 0=禁止
1=内部 1 1=RTS低 1 1 1 1 1=允许
复位
```
各位功能:
| 位 | 符号 | 含义 |
|:--:|------|------|
| D0 | **TxEN** | 发送允许(1=允许发送) |
| D1 | **DTR** | 数据终端准备好(0=DTR 输出低) |
| D2 | **RxE** | 接收允许(1=允许接收) |
| D3 | **SBRK** | 发送 Break 字符 |
| D4 | **ER** | 错误标志复位(1=清除 FE/OE/PE 错误标志) |
| D5 | **RTS** | 请求发送(0=RTS 输出低电平) |
| D6 | **IR** | 内部复位(1=回到等待方式控制字状态) |
| D7 | **EH** | 进入搜索方式(同步模式用) |
> [!example] 命令控制字计算
> **要求**:允许发送和接收,清除错误标志
>
> TxEN=1, RxE=1, ER=1, 其余=0
>
> 命令控制字 = `0001 0101B` = **15H**
### 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)进行内部复位,再按顺序重写两个控制字。
## 关联笔记
- [[8255A可编程并行接口]]
- [[8254定时计数器]]
- [[8259A中断控制器]]
- [[接口与通讯技术/DMA控制器8237A]]
- [[接口与通讯技术/试题册/index|试题册索引]]