ISO 7816 智能卡接口:半双工 T=0/T=1、卡时钟与 UART 复用
更新时间:2026-09-19。前置:UART 波特率/FIFO、UART RTS/CTS。SIM/UICC、银行卡、社保卡这类接触式智能卡遵循 ISO/IEC 7816,物理和帧格式与普通 UART 很像,但有几个关键差异。
本文要回答的问题
- 智能卡只有一根 I/O,怎么双向收发?
- 上电后的 ATR 复位应答、T=0 和 T=1 协议是什么?
- 卡的波特率/采样时刻由什么决定(etu、guard time)?
- 激活/去激活、单线方向切换和错误重传有哪些坑?
一、物理接口:接触触点
ISO 7816-2 定义卡面触点(常用):
- C1 VCC:卡电源(5V/3V/1.8V,接口设备 IFD 供电,可切换等级)。
- C2 RST:复位(接口设备驱动)。
- C3 CLK:卡时钟,接口设备提供(常用 1~5MHz),卡的通信速率由它分频得到。
- C5 GND:地。
- C7 I/O:唯一的数据线,半双工、双向、开漏 + 上拉(类似 I2C 线与,见 I2C 开漏),卡和接口设备分时驱动。
- C4/C8 保留(USB/额外用)、C6 VPP(编程电压,现代基本不用)。
与全双工 UART(独立 TX/RX)不同,7816 只有一根 I/O,发送和接收必须分时,并需要方向控制(开漏共享,见 SPI 从机三态的总线释放理念)。
二、位帧与 etu(基本时间单元)
线上位格式接近反向 UART:
- 每字节 10 位(T=0)/起始约定:1 个起始位(低)+ 8 数据位(LSB 先)+ 1 个校验位 + 保护时间。
- 注意电平与多数 UART 相反:空闲为高、起始位为低(常规),但校验位采用偶校验、且约定上有时按反向逻辑(direct/inverse convention),ATR 首个字符 TS 决定后续是直接还是反相约定。
- etu(elementary time unit):1 位的时间,由卡时钟分频得到:
etu = F/(D·f),其中 f 是 CLK 频率,F(时钟率转换整数)、D(波特率调整因子)由 ATR 给出。初始用默认 F=372、D=1(如 f=3.579MHz 时约 9600 波特),ATR 协商后可提速率(PPS)。 - Guard Time(GT):连续两个字节前沿之间的最小间隔(默认 12 etu),给对端处理时间;卡可在保护时间内把 I/O 拉低申请额外等待时间(clock wait/block wait 之外)。
三、激活、冷复位与 ATR
接口设备必须按固定时序激活:
去激活(空闲)态: RST=L, CLK 停, VCC 关, I/O 上拉(高)
激活: 先上 VCC → 稳定后给 CLK → 再拉高 RST(冷复位)
卡复位后在规定时间内通过 I/O 发 ATR(Answer To Reset):
TS(初始字符,定直接/反相约定)
T0(格式字节: Y1 + 历史字节数)
TA1/TB1/TC1/TD1...(接口字节: F/D/Fi/Di、保护时间、协议选择、后续是否还有)
历史字节(historical bytes)
TCK(校验字符,某些协议)- TS:接口设备先按默认采样 TS,用它确定电平约定和同步,后续字节据此解码(类似 UART 自动波特率 里靠已知字符对齐)。
- ATR 的接口字节告诉接口设备卡支持的电压、最大时钟、F/D、T=0 还是 T=1;之后可用 **PPS(Protocol and Parameters Selection)**协商更高 D(速率)。
- 热复位(不断电再拉 RST)与冷复位时序略不同;去激活要按相反顺序:先 RST 低、再停 CLK、再断 VCC。
四、T=0 与 T=1 两种传输协议
- T=0(面向字节,半双工):每命令由接口设备发 5 字节 APDU 头(CLA/INS/P1/P2/P3),卡回一个过程字节(procedure byte):
ACK(=INS 或 INS^FF)表示继续,接口设备据此发剩余数据或准备收数据;NULL(0x60)表示卡还在处理,接口设备继续等;- 状态字 SW1/SW2(如 90 00 成功)结束命令。 T=0 要靠过程字节逐字节握手,命令/数据方向由过程字节管理(如 GET RESPONSE 取卡数据)。
- T=1(面向块,全/半双工块):数据组织成块(block):起始字段(头:NAD/PCB/LEN)+ 信息字段(APDU)+ EDC(校验,LRC/CRC)。分信息块、接收就绪块(R-block,ACK/NAK)、系统块(S-block,等待时间扩展/复位)。类似带帧头和校验的链路协议,吞吐和错误处理更清晰。
校验与重传:字节级偶校验错时,接收方在保护时间内把 I/O 拉低(error signal),发送方重发该字节(T=0);T=1 用块 EDC 校验,错误发 NAK 请求重传块。
五、控制器实现:UART 复用
多数 SoC 的「智能卡控制器/USART smartcard 模式」复用 UART:
- 配置成 half-duplex / single-wire + 开漏,发送时使能驱动、发完立刻释放 I/O(由 TE/RE + 方向控制),否则卡应答时总线被拉死——这和 RS485 DE 控制类似,但 7816 是同线回环。
- 使能 0.5/1.5 位采样?实际要按 etu 采样(采样点在位中间),并支持偶校验、guard time、可配 etu 分频(来自 CLK)。
- 提供 CLK 输出(单独定时器/PWM 分频,见 定时器/PWM)和 RST/VCC 控制(常配合电源 IC/电平转换)。
- 卡可能插入/拔出,需要触点检测去抖(见 GPIO 去抖)和上电序列状态机。
六、常见的坑
- 全双工当半双工:发送后不释放 I/O,卡的 ACK/ATR 被主机驱动顶住,读到自己回环的数据。
- 电平/约定未看 TS:inverse convention 下仍按直接逻辑解码,ATR 全错。
- etu/F/D 算错:ATR 后没按新 Fi/Di 调波特率,后续乱码;初始必须 372/1。
- 激活/去激活顺序错:先给 RST 再上 VCC 或去激活不按反序,卡不复位甚至损伤。
- guard time 不足:字节间隔小于要求,慢卡丢字节;忽略卡的时钟等待/过程字节 NULL。
- T=0 过程字节处理错:不识别 ACK/NULL/SW1SW2,命令方向和 GET RESPONSE 走错。
- 校验错不重传:忽略卡的错误信号(拉低 I/O)或 T=1 NAK。
- 时钟/电压等级不配:卡只支持 1.8V 却供 5V,或 CLK 超 ATR 允许的最大值。
- 开漏上拉不当:上拉太强/太弱导致边沿慢或电平冲突。
- 拔插抖动/带电拔卡:无触点检测与安全下电序列,通信中断/状态错乱。
- T=1 块长度/EDC 错:LEN 与 LRC/CRC 计算错,NAK 风暴。
- 把 SIM 普通 UART 直连:缺开漏半双工模式、CLK/RST/供电控制,物理层就不工作(需专用卡接口 IC 或支持 7816 的 USART+电源时序)。
相关与延伸
帧/采样基础见 UART 波特率与 FIFO;自动对齐见 UART 自动波特率;开漏共享见 I2C 主机;单线方向控制类比见 UART 流控/RS485。
总结
ISO 7816 智能卡用接触触点上的单根开漏 I/O(C7)做半双工通信,外加接口设备提供的 CLK(C3)、RST(C2)和可切 5/3/1.8V 的 VCC;位帧是 LSB 先、偶校验、由卡时钟分频出的 etu 定速率(初始 F=372/D=1≈9600),上电按「VCC→CLK→RST」激活后卡先发决定电平约定和 F/D 参数的 ATR,再在面向字节、靠 ACK/NULL/SW1SW2 过程字节逐拍握手的 T=0 与带块头和 EDC、用 ACK/NAK 重传的 T=1 中选一种;控制器通常复用 UART 的单线开漏半双工模式并在发完立即释放 I/O、按 guard time 和卡时钟等待管理节奏——发后不释放总线、不按 TS 解约定、etu 协商错和激活时序错是四大根因。