对于刚接触智能卡的工程师来说,在阅读7816-3规范的时候,常常被其中的一些术语迷惑,读起来会觉得有些别扭。尤其是在看到复位应答中的F和D设置,以及对应的etu的时候,会觉得有些复杂和难以理解。

  其实从本质上说,7816-3定义了智能卡(这里指的是接触式CPU卡,对于逻辑加密卡以及非接触IC卡不在此列)和读写设备之间的通讯协议,说白了就是数据位传输的格式。

  如果学习或者接触过单片机,那么对于RS232一定不会陌生,它属于异步串行通讯接口(UART),通过RxD、TxD进行数据的收发,RS232曾经是PC机的标配,但是目前在多数PC上基本不复存在了(当然还可以通过USB-232转换器来扩展)。

  接下来我们看看7816-3定义的通讯协议,其实基本上可以说是RS232的翻版并在此基础上进行的改进,7816中只有一个IO同时兼具数据收发的功能,这点和RS232用RxD和TxD进行数据收发是不同的。在RS232中我们有9600波特率、起始位、奇偶校验位、停止位这些概念,而在7816-3中都完整地保留了下来,只不过7816-3中引入了etu,没有使用bps,但是基本原理是一致的。etu的定义可以更加精确地描述每个数据位在传输过程中收发双方的职责和角色转换

  根据定义在智能卡上电复位的时候 1 etu = 372 / f ,其中f = 读写设备通过CLK管脚提供给智能卡的时钟频率,通常在1--5 MHz之间。etu的单位是时间单位秒(毫秒、微秒),等同于传输每个数据位所需的时间。对其取倒数得出来的就是每秒传输的数据位,也就是bps。我们取f = 3.579545 MHz,用3579545除以372结果等于9622.4,约为9600 bps。

  通用的etu计算公式: 1 etu = (F / D) * (1 / f) ,F和D的值根据7816-3规范中的约定来进行设置。对于上电复位时的取值 F = 372,D = 1即作为默认值Fd和Dd。如果智能卡支持其他速率则需要在ATR中的TA1来指出其他的F和D的值,比如设定F=372,可以把D分别设定为2/4,那么智能卡能支持的通讯速率可以分别为19200/38400。

  那么为什么要选择时钟频率为3.579545 MHz?为什么默认的F值选择为372呢?首先3.579545 MHz 是常用石英晶振的标称值,9600 * 372 = 3.5712 MHz,与之最为接近。再说为什么是372,372 = 12 * 31。标准的8051单片机每个指令周期为12个时钟周期,而且定时/计数器也按照1/12 进行分频后再计数的,这样设定对于智能卡芯片来说可以比较容易实现对IO数据通讯的控制,也可以更好地和PC机串口9600速率配合(当然这是指上个世纪80年代的时候,对于现在的智能卡芯片设计技术而言实现任意分频的控制都不是问题了)。

  由此可见,这些参数的选择都是为了能够更好地利用当时既有的标准和技术,要知道7816-3在1989年的时候就已经制定了,按照当时的主流PC机配置把串口速率设为9600,用一个232接口芯片(比如Max232)再加上3.579545MHz的晶振,再配合几片74系列的门电路,外加5伏的直流电源和几个阻容器件,这就是最基本的RS232串口读卡器了。

最新文章

  1. C++-前缀和后缀
  2. wsgi协议
  3. c语言知识(2)
  4. cacti手册选译(1)
  5. 【Unity3D】生成工程报错解决—UnityEditor.HostView:OnGUI() Error building Player: Couldn't build player because of unsupported data on target platform.
  6. 【宽搜】【并查集】Vijos P1015 十字绣
  7. <微信应用开发系列>定时刷新AccessToken
  8. [转载]MATLAB中FFT的使用方法
  9. Qt for Windows:使用WinPcap开发高性能UDP服务器
  10. SSL探03
  11. Grunt安装中遇到的问题汇总
  12. 请详细描述(以硬盘启动)Linux系统从打开主机电源到进入登录界面整个过程的流程。
  13. 学习pthreads,使用互斥量进行同步
  14. 基于Python的数据分析(2):字符串编码
  15. C# 操作Word目录——生成、删除目录
  16. 高可用Redis(五):瑞士军刀之慢查询,Pipeline和发布订阅
  17. detailFormatter bootstrapTable
  18. Centos7安装Tomcat并部署DubboAdmin的War包并配置自动启动
  19. 解放你生产力的10款效率工具,赶紧mark起来
  20. 初识python面向对象编程

热门文章

  1. Linux系统编程(35)—— socket编程之TCP服务器的并发处理
  2. Cookie和Session(转)
  3. Html5 Canvas Hit Testing
  4. HDU 5496 - BestCoder Round #58 - Beauty of Sequence
  5. Findbugs初探-使用idea获取findbugs插件
  6. java socket报文通信(一) socket的建立
  7. SOFTWARE_INTRODUCE_01
  8. javascript中闭包的真正作用
  9. js中的循环语句
  10. Eclipse设置保存时自动给变量加final