第15章 串行通信及接口电路

课程:1A003 计算机组织与系统结构(第二部分) 教材:北京大学计算机组织与系统结构课程 文件类型:PowerPoint 97-2003 二进制格式

一、串行通信基本概念

1.1 串行通信的特点

  • 优点:数据在单条 1 位宽的传输线上按时间先后一位一位地传送,节省传输线
  • 缺点:数据传输率较低
  • 适用场景:长距离、低速率的通信

1.2 常用术语

1) 数据通信方向性结构

模式特点
单工(Simplex)仅能进行一个方向的数据传送
半双工(Half Duplex)数据可以在两个方向上传送,但不能同时进行(双向不同时)
全双工(Full Duplex)能够在两个方向同时进行数据传送

2) 数据传输率

  • 比特率:每秒传输的二进制位数,单位 bps(bit per second)
  • 波特率:每秒传输的”符号”(信号码元 Signal Element)的个数
  • 比特率 vs 波特率:
    • 二进制传输时(高低两种电平),每个符号信息量为 1 比特,波特率 = 比特率
    • 采用复合调制技术时(如相位+振幅),一个符号含多个比特,波特率 ≠ 比特率
    • 例:4 种相位 × 2 种振幅 = 8 种码元 → 每符号 3 位
  • 标准波特率系列:50, 75, 110, 150, 300, 600, 1200, …

3) 调制解调器(Modem)

  • 电话网是模拟通信系统,传输数字信号需经过调制/解调
  • 调制:用数字信号改变载波的幅值、频率或相位
  • 三种调制方式:
    • 调幅(ASK):改变载波幅度
    • 调频(FSK):改变载波频率
    • 调相(PSK):改变载波相位

4) 发送时钟和接收时钟

  • 主时钟 CLK 经分频后产生发送/接收移位脉冲
  • 接收端:RxD → 输入移位寄存器 → 数据输入寄存器
  • 发送端:数据输出寄存器 → 输出移位寄存器 → TxD
  • 分频系数:÷1, ÷16, ÷32 等

5) 波特率因子

时钟频率 F = 波特率因子 × 波特率
  • 给定时钟频率,选择不同的波特率因子可得到不同的波特率
  • 例:f = 19.2 kHz,波特率因子 = 16,则波特率 = 1200 bps
  • 8253 分频系数计算:计数初值 = 时钟频率 /(波特率 × 波特率因子)
    • 例:外部时钟 1 MHz,要得到 19.2 kHz → 分频系数 N = 1,000,000 / 19,200 ≈ 52

6) 异步方式与同步方式

异步方式(Asynchronous,起止同步式):

  • 数据格式:起始位(1位低电平) + 5-8位数据位 + 奇偶校验位 + 1/1.5/2位停止位(高电平)
  • 每个字符独立,字符间为空闲位(高电平)
  • 靠起始位和停止位实现字符同步
  • 协议开销较大,效率较低

同步方式(Synchronous):

  • 数据格式:同步字符(SYN) + 数据块
  • 收发双方使用同一时钟,字符连续传送无间隙
  • 效率高,适合大数据量传输
  • SDLC/HDLC 帧格式:标志(01111110, 8位) + 地址(8位) + 控制(8位) + 数据场 + CRC(16位) + 标志(01111110)
  • 效率计算:2048 位数据,协议开销 48 位 → 效率 = 2048/(2048+48) = 97%
  • 通用公式:协议开销 = 1 - N/(N+48)

二、可编程串行通信接口 8251A

Intel 8251A 是 USART(Universal Synchronous Asynchronous Receiver/Transmitter,通用同步/异步收发器),专为 Intel 微处理器设计。

2.1 基本性能

特性说明
工作模式同步 + 异步传送
同步传送5~8位/字符,内部或外部字符同步,自动插入同步字符
异步传送5~8位/字符,时钟倍率 1/16/64 倍波特率
异步特色中止字符(Break)生成,1/1.5/2 位停止位,假起始位检测,自动中止检测处理
波特率范围异步:DC19.2K;同步:DC64K
工作方式全双工、双缓冲发送和接收
差错检测奇偶错(PE)、溢出错(OE)、帧格式错(FE)
封装28 脚 DIP
电气兼容全部输入输出 TTL 兼容,单一 +5V 电源

2.2 结构与引脚

五大组成部分

  1. 接收器:串-并转换、接收缓冲、接收控制
  2. 发送器:并-串转换、发送缓冲、发送控制
  3. 数据总线缓冲器:与 CPU 数据总线接口
  4. 调制解调器控制电路:DTR/DSR/RTS/CTS 四根联络线
  5. 读写控制逻辑电路:接收 CPU 的读写控制信号

与 CPU 接口信号

  • D7~D0:8 位双向数据线
  • RESET:复位信号
  • CS:片选信号
  • C/D:控制/数据选择(1=控制/状态,0=数据)
  • RD/WR:读/写信号
  • TXRDY:发送器准备好(中断/查询)
  • RXRDY:接收器准备好(中断/查询)
  • TXEMPTY:发送器空
  • SYNDET/BRKDET:同步检测/中止检测(双向)
  • CLK:主时钟

读写控制真值表:

CSC/DRDWR操作
0001CPU 从 8251A 读数据
0010CPU 往 8251A 写数据
0101CPU 从 8251A 读状态
0110CPU 往 8251A 写控制命令

与外设接口信号

  • RXC:接收器时钟
  • TXC:发送器时钟
  • RXD:串行数据输入
  • TXD:串行数据输出
  • DTR:数据终端就绪(输出,低有效)
  • DSR:数据装置就绪(输入,低有效)
  • RTS:请求发送(输出,低有效)
  • CTS:允许发送(输入,低有效)

2.3 编程(控制字与状态字)

1) 方式指令字(Mode Instruction)

复位后首先写入,定义工作方式(8 位):

D7 D6 D5 D4 D3 D2 D1 D0
S2 S1 EP PEN L2 L1 B2 B1
  • B2B1(D1D0):波特率因子
    • 00 = 同步方式
    • 01 = 异步 ×1
    • 10 = 异步 ×16
    • 11 = 异步 ×64
  • L2L1(D3D2):字符长度
    • 00=5位, 01=6位, 10=7位, 11=8位
  • PEN(D4):奇偶校验允许(1=允许, 0=禁止)
  • EP(D5):偶校验选择(1=偶校验, 0=奇校验)
  • S2S1(D7D6):
    • 异步时:停止位数量(01=1位, 10=1.5位, 11=2位, 00=无效)
    • 同步时:同步字符数+同步方式
      • 00=2个同步字符+内同步
      • 01=2个同步字符+外同步
      • 10=1个同步字符+内同步
      • 11=1个同步字符+外同步

2) 命令指令字(Command Instruction)

方式字之后写入,控制实际操作(8 位):

D7 D6 D5 D4 D3 D2 D1 D0
EH IR RTS ER SBRK RXE DTR TXEN
  • TXEN(D0):允许发送(1=允许)
  • DTR(D1):数据终端准备好(1=DTR输出有效)
  • RXE(D2):允许接收(1=允许)
  • SBRK(D3):发送中止字符(1=中止, 0=正常)
  • ER(D4):清除错误标志(1=复位PE/OE/FE)
  • RTS(D5):请求发送(1=RTS输出有效)
  • IR(D6):内部复位(1=使8251A复位,回到方式字状态)
  • EH(D7):进入搜索同步字符方式(同步方式用,1=允许搜索)

3) 状态字(Status Word)

CPU 可读状态字查询工作状态(8 位):

D7  D6          D5  D4 D3 D2       D1    D0
DSR SYNDET/    FE  OE PE TXEMPTY RXRDY TXRDY
    BRKDET
  • TXRDY(D0):发送缓冲器空(状态位只反映缓冲器,引脚还需 CTS=0 和 TXEN=1)
  • RXRDY(D1):接收器准备好
  • TXEMPTY(D2):发送器空
  • PE(D3):奇偶校验错
  • OE(D4):溢出错(超越错)
  • FE(D5):帧格式错
  • SYNDET/BRKDET(D6):同步/中止检测
  • DSR(D7):数据装置就绪

注意:TXRDY 状态位 vs TXRDY 输出引脚

  • 状态位为 1:仅反映发送缓冲器已空
  • 引脚为 1:发送缓冲器空 且 CTS=0 且 TXEN=1
  • 状态位用于 CPU 查询,引脚用于中断请求

2.4 初始化流程

RESET
  ↓
输出方式指令字
  ↓
异步? ──N──→ 输出第一个同步字符
  │Y              ↓
  ↓            单同步? ──N──→ 输出第二个同步字符
输出命令指令字        ↓Y
  ↓              输出命令指令字
有复位命令? ←──────────┐
  │Y                    │
  ↓                    ↓
回到方式字状态       传送数据
                    ↓
                  数据完否?

关键规则:

  • 初始化必须在复位后先写方式指令字
  • 异步方式:方式字 → 命令字 → 数据传送
  • 同步方式:方式字 → 同步字符(1或2个) → 命令字 → 数据传送
  • 传送过程中可随时写命令字或读状态字
  • 使用 IR=1 的内部复位命令可回到方式字状态,重新编程

2.5 编程举例

例1:异步方式初始化

设定:异步方式,波特率因子 64,7 位数据,偶校验,2 位停止位

  • 方式字 = 1111 1011B = FBH
  • 命令字 = 0001 0111B = 17H(发送允许+接收允许+错误复位+DTR有效)
MOV  AL, 0FBH   ; 方式指令字
OUT  51H, AL    ; 写入控制端口
MOV  AL, 17H    ; 命令指令字
OUT  51H, AL    ; 写入控制端口

例2:同步方式初始化

设定:同步方式,双同步字符,同步字符 16H,内同步,偶校验,7 位数据

  • 方式字 = 0011 1000B = 38H
  • 命令字 = 1001 0111B = 97H(发送允许+接收允许+错误复位+搜索同步+DTR有效)
MOV  AL, 38H   ; 方式指令字
OUT  51H, AL
MOV  AL, 16H   ; 同步字符 1
OUT  51H, AL
OUT  51H, AL   ; 同步字符 2(双同步)
MOV  AL, 97H   ; 命令指令字
OUT  51H, AL

2.6 应用:双机串行通信

近距离(<15米)双机通信方案:

  • 不用 Modem,直接 RS-232C 相连
  • 双方均为 DTE,需加电平转换电路(EIA ↔ TTL)
  • 可不用四根联络信号,CTS 接地即可
  • 支持半双工或全双工
  • CPU 与接口之间可用查询或中断方式

发送端程序(查询方式、半双工、异步):

START: MOV  DX, 8251A_CTRL
       MOV  AL, 7AH      ; 异步,7位数据,1停止位,偶校验,×16
       OUT  DX, AL
       MOV  AL, 11H      ; 发送允许,错误复位
       OUT  DX, AL
       MOV  SI, OFFSET SEND_BUF
       MOV  CX, SEND_LEN
NEXT:  MOV  DX, 8251A_CTRL
       IN   AL, DX       ; 读状态字
       TEST AL, 01H      ; TXRDY?
       JZ   NEXT
       MOV  DX, 8251A_DATA
       MOV  AL, [SI]
       OUT  DX, AL       ; 发送一字节
       INC  SI
       LOOP NEXT
       HLT

接收端程序:

BEGIN: MOV  DX, 8251A_CTRL
       MOV  AL, 7AH      ; 同发送端方式字
       OUT  DX, AL
       MOV  AL, 14H      ; 接收允许
       OUT  DX, AL
       MOV  DI, OFFSET RECV_BUF
       MOV  CX, RECV_LEN
L1:    MOV  DX, 8251A_CTRL
       IN   AL, DX       ; 读状态字
       TEST AL, 02H      ; RXRDY?
       JZ   L1
       TEST AL, 08H      ; 奇偶校验错?
       JNZ  ERR          ; 有错转出错
       MOV  DX, 8251A_DATA
       IN   AL, DX       ; 接收一字节
       MOV  [DI], AL
       INC  DI
       LOOP L1
       HLT

2.7 初始化的特殊问题:先写 3 次”0”

上电时 8251A 可能处于任意状态(方式字/同步字符/命令字)。为确保在发复位命令前处于命令字格式,需执行最坏情况初始化序列:

MOV  DX, CTRL_PORT
MOV  AL, 0
OUT  DX, AL    ; 第1次写0
OUT  DX, AL    ; 第2次写0(第1个同步字符)
OUT  DX, AL    ; 第3次写0(第2个同步字符→进入命令字状态)
 
MOV  AL, 40H   ; 内部复位命令
OUT  DX, AL    ; 复位,回到方式字状态
 
MOV  AL, 4EH   ; 方式指令字
OUT  DX, AL
MOV  AL, 27H   ; 命令指令字
OUT  DX, AL

原理:连续写 3 个 00H → 配置为同步方式并写入两个空同步字符 → 此时已处于命令字格式 → 写 40H(内部复位命令)确保可靠复位。

三、与相关知识的关联