--- 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|试题册索引]]