vault backup: 2026-06-26 23:43:44
This commit is contained in:
+105
-15
@@ -39,7 +39,7 @@ create time: 2026-06-26 23:05
|
||||
graph LR
|
||||
A["起始位(1)"] --> B["数据位(5~8)"]
|
||||
B --> C["校验位(0或1)"]
|
||||
C --> D["停止位(1, 1.5, 2)"]
|
||||
C --> D["Stop Bit"]
|
||||
```
|
||||
|
||||
> [!example] 帧长度计算
|
||||
@@ -83,7 +83,7 @@ D1D0: 00=5位 01=6位 10=7位 11=8位
|
||||
```
|
||||
|
||||
> [!example] 方式控制字计算
|
||||
> **要求**:异步通信,波特率因子 x16,偶校验,8 位数据
|
||||
> **要求**:异步通信,波特率因子 x16,偶校验,8 位数据,1 位停止位
|
||||
>
|
||||
> D7D6=10(x16), D5D4=10(偶校验), D3D2=01(1 位停止位), D1D0=11(8 位数据)
|
||||
>
|
||||
@@ -91,11 +91,11 @@ D1D0: 00=5位 01=6位 10=7位 11=8位
|
||||
>
|
||||
> ---
|
||||
>
|
||||
> **要求**:异步通信,波特率因子 x16,偶校验,8 位数据,1 位停止位
|
||||
> **要求**:异步通信,波特率因子 x1,无校验,7 位数据
|
||||
>
|
||||
> D7D6=01(x1 → 按试卷答案 D7D6=01 即因子 1), D3D2=11, D1D0=11
|
||||
> D7D6=01(x1), D5D4=00(无校验), D3D2=01(1 位停止位), D1D0=10(7 位数据)
|
||||
>
|
||||
> 控制字 = `0100 1111B` = **4FH**
|
||||
> 控制字 = `0100 0110B` = **46H**
|
||||
|
||||
#### 命令控制字
|
||||
|
||||
@@ -103,9 +103,8 @@ D1D0: 00=5位 01=6位 10=7位 11=8位
|
||||
|
||||
```
|
||||
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=允许
|
||||
EH IR RTS ER SBRK RxE TxD TxEN
|
||||
0 1 0 1 0 0 0 0
|
||||
复位
|
||||
```
|
||||
|
||||
@@ -114,20 +113,29 @@ EH IR RTS ER SBRK RxE TxD TxEN
|
||||
| 位 | 符号 | 含义 |
|
||||
|:--:|------|------|
|
||||
| D0 | **TxEN** | 发送允许(1=允许发送) |
|
||||
| D1 | **DTR** | 数据终端准备好(0=DTR 输出低) |
|
||||
| D1 | **TxD** | 数据输出使能(0= TxD 输出无效) |
|
||||
| D2 | **RxE** | 接收允许(1=允许接收) |
|
||||
| D3 | **SBRK** | 发送 Break 字符 |
|
||||
| D4 | **ER** | 错误标志复位(1=清除 FE/OE/PE 错误标志) |
|
||||
| D5 | **RTS** | 请求发送(0=RTS 输出低电平) |
|
||||
| D5 | **RTS** | 请求发送(1=RTS 有效为低电平) |
|
||||
| D6 | **IR** | 内部复位(1=回到等待方式控制字状态) |
|
||||
| D7 | **EH** | 进入搜索方式(同步模式用) |
|
||||
|
||||
> [!example] 命令控制字计算
|
||||
> **要求**:允许发送和接收,清除错误标志
|
||||
> **要求**:允许发送,允许接收,清除错误标志
|
||||
>
|
||||
> TxEN=1, RxE=1, ER=1, 其余=0
|
||||
> 对应位:TxEN(D0)=1, RxE(D2)=1, ER(D4)=1, 其余=0
|
||||
>
|
||||
> 命令控制字 = `0001 0101B` = **15H**
|
||||
> 按位排列:D7~D0 = `0001 0101B` = **15H**
|
||||
>
|
||||
> > [!info] 常见默认初始化值
|
||||
> > 许多教材给出的默认初始化值为 `5BH`(0101 1011),含义是:
|
||||
> > - IR=0(不断电)
|
||||
> > - RTS=1(有效,发出握手请求)
|
||||
> > - ER=1(清除错误标志)
|
||||
> > - RxE=1(允许接收)
|
||||
> > - TxD=1(使能发送数据输出)
|
||||
> > - TxEN=1(允许发送)
|
||||
|
||||
### 3. 状态信号
|
||||
|
||||
@@ -149,8 +157,8 @@ EH IR RTS ER SBRK RxE TxD TxEN
|
||||
| **RxD** | 接收数据输入 |
|
||||
| **TxC** | 发送时钟(控制发送速率) |
|
||||
| **RxC** | 接收时钟(控制接收速率) |
|
||||
| **RTS** | 请求发送(输出,通知外设) |
|
||||
| **CTS** | 清除发送(输入,外设应答) |
|
||||
| **RTS** | 请求发送(输出,通知外设准备接收) |
|
||||
| **CTS** | 清除发送(输入,外设表示已准备好) |
|
||||
| **DTR** | 数据终端准备好(输出) |
|
||||
| **DSR** | 数据装置准备好(输入) |
|
||||
|
||||
@@ -186,6 +194,88 @@ 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可编程并行接口]]
|
||||
|
||||
Reference in New Issue
Block a user