在新的国家电网智能终端相关标准中,规定了通过专门的加密芯片来保证设备数据安全性的方法,而设备主控单元与加密芯片采用了广泛应用的ISO7816通讯协议。工控主板EM9160为了适应这一新的技术需求,对其内核进行了升级,使其多个串口都可支持ISO7816协议,为客户进行智能终端整机设计时,提供了灵活的选择。

对EM9160工控主板,可在其异步串口的基础上,通过简单的设置,就可把串口转为符合ISO7816协议的接口,实现与各种智能卡的通讯。EM9160共有6个异步串口,在Windows CE环境中为“COM2:”- “COM7:”,其中支持ISO7816的串口如下表所示:

串口

管脚配置

备注

COM3

  TXD:半双工数据线  
  RXD:复位输出控制   低电平有效
  GPIO14:作为SCK   输出频率与波特率等参数有关

COM5

  TXD:半双工数据线  
  RXD:复位输出控制   低电平有效
  GPIO15:作为SCK   输出频率与波特率等参数有关

COM6

  TXD:半双工数据线  
  RXD:复位输出控制   低电平有效
  GPIO15:作为SCK   输出频率与波特率等参数有关

COM7

  TXD:半双工数据线  
  RXD:复位输出控制   低电平有效
  GPIO15:作为SCK   输出频率与波特率等参数有关

EM9160的“COM5:”- “COM7:”串口信号均为TTL电平,建议客户首选其中之一作为与ISO7816智能芯片的通讯接口。如果这些串口已分配给设备的其他功能,也可以考虑使用COM3口,需要注意的是COM3口的缺省配置是RS232电平,客户需要在购买时特别通知我们把COM3设置为TTL电平才能与安全模块相连。当然GPIO15或GPIO14一旦作为了ISO7816的工作时钟输出,就不能再用作其他的用途了。

作为应用程序,在操作ISO7816模式的串口(以COM5为例)时,一般的流程如下:
        1、按标准方法打开串口“COM5:”;
        2、通过DeviceIoControl(…)函数使能ISO7816通讯模式;
        3、设置包括波特率、奇偶校验在内的相关串口参数;
        4、根据需要可通过DeviceIoControl(…)函数对对端芯片进行一次复位操作;
        5、进行正常数据通讯;
        6、通过DeviceIoControl(…)函数禁止ISO7816通讯模式;
        7、按标准方法关闭串口“COM5:”。

在上述流程中,需要注意的是一定要先使能ISO7816模式,再设置波特率,才能保证得到正确的通讯参数。

为了实现从通常的异步串口到ISO7816的转换,EM9161的串口驱动增加了3个IOCTL功能如下:

#include   
#define IOCTL_SERIAL_ENABLE_ISO7816 \
             CTL_CODE(FILE_DEVICE_SERIAL_PORT,40,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_DISABLE_ISO7816  \
             CTL_CODE(FILE_DEVICE_SERIAL_PORT,41,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_SERIAL_RESET_ISO7816 \
             CTL_CODE(FILE_DEVICE_SERIAL_PORT,42,METHOD_BUFFERED,FILE_ANY_ACCESS)

使能ISO7816的DeviceIoControl调用,需要同时设置相应的参数。这些参数包括ISO7816的协议类型,帧数据的应答规范等,定义相应的参数如下:

#define AT91C_US_USMODE_ISO7816_0   0x4   // ISO7816 protocol: T = 0
#define AT91C_US_USMODE_ISO7816_1   0x6   // ISO7816 protocol: T = 1
#define AT91C_US_INACK    (0x1 << 20) // Inhibit Non Acknowledge
#define AT91C_US_DSNACK    (0x1 << 21) // Disable Successive NACK

此外ISO的波特率按如下公式计算:

BR = SCK /(FI / DI)

上式中的SCK = 串口波特率×(FI / DI),例如串口波特率为9600,则SCK时钟频率为3.5712MHz。在EM9161中,对DI和FI的设置,是通过设置(FI/DI)这个比值来实现的,其中有效的值如下表所示:

 

DI = 1

DI = 2

DI = 4

DI = 8

DI = 16

DI = 32

DI = 12

DI = 20

  FI = 372

372

186

93

47

23

12

31

19

  FI = 558

558

279

140

70

35

17

47

28

  FI = 774

774

372

186

93

47

23

62

37

  FI = 1116

1116

558

279

140

70

35

93

56

  FI = 1488

1488

744

372

186

93

47

124

74

  FI = 1806

1806

930

465

233

116

58

155

93

  FI = 512

512

256

128

64

32

16

43

26

  FI = 768

768

384

192

96

48

24

64

38

  FI = 1024

1024

512

256

128

64

32

85

51

  FI = 1536

1536

768

384

192

96

48

128

77

  FI = 2048

2048

1024

512

256

128

64

171

102

选择蓝色区域的值,可得到对应的黄色区域的FI和绿色区域的DI,由此可计算相应的波特率。

在具体的调用中,参数的传递是通过两个DWORD实现的,代码如下:

DWORD dwMode, dwFI_DI_Ratio;
DWORD pBuf[2];

dwMode = AT91C_US_USMODE_ISO7816_0;
dwFI_DI_Ratio = 372;
pBuf[0] = dwMode;
pBuf[1] = dwFI_DI_Ratio;
if (!DeviceIoControl ( m_hSer,        // 串口handle
                                 IOCTL_SERIAL_ENABLE_ISO7816,    // 命令码
                                 pBuf, sizeof(pBuf),         // input parameters  
                                 NULL, 0,            // output parameters
                                 NULL, NULL )) 
{
      printf('IOCTL_SERIAL_ENABLE_ISO7816 failed!\r\n');
}

关闭ISO7816通讯模式比较简单,没有任何参数:

if (!DeviceIoControl ( m_hSer,        // 串口handle
                                 IOCTL_SERIAL_DISABLE_ISO7816,    // 命令码
                                 NULL, 0,         
                                 NULL, 0,       
                                 NULL, NULL )) 
{
      printf('IOCTL_SERIAL_DISABLE_ISO7816 failed!\r\n');
}

对ISO7816对端芯片的复位,需要设置复位时间,以ms为单位:

DWORD dwMilliseconds = 1;   // 可以设为0,实际复位时间为几十微秒
if (!DeviceIoControl ( m_hSer,
                                 IOCTL_SERIAL_RESET_ISO7816,
                                 &dwMilliseconds, sizeof(DWORD), // input parameters
                                 NULL, 0,       // output parameters 
                                 NULL, NULL )) 
{
      printf('IOCTL_SERIA, L_RESET_ISO7816 , failed!\r\n');
}

&am, p;nb, sp;     设置了ISO模式后, ,应用程序仍然可以像操作普通串口那样,进行数据的读写,只是需要注意, 的, 是I, SO7816的半双工模式的,所以数据通讯的过程更像是RS485的过程。用户可参考英创网站的《RS485接口通讯的WinCE编程要点》一文,来规划自己的应用程序通讯流程。

ISO7816通讯协议在工控主板EM9160中的实现方案的更多相关文章

  1. CPU卡中T=0通讯协议的分析与实现

    IC卡的应用越来越广泛,从存储卡到逻辑加密卡,目前CPU卡已经逐渐在应用中占据主导地位.CPU卡根据通讯协议可分为两种:接触式和非接触式.接触式CPU卡主要采用两种通讯协议:T=0和T=1通讯协议.T ...

  2. html文件在head标签中引入js地址和直接写js代码,所用时间是不同的,因为引入js地址,文件加载的时候需要通过通讯协议去解析地址,读取外部文件

    html文件在head标签中引入js地址和直接写js代码,所用时间是不同的,因为引入js地址,文件加载的时候需要通过通讯协议去解析地址,读取外部文件

  3. 基于dubbo框架下的RPC通讯协议性能测试

    一.前言 Dubbo RPC服务框架支持丰富的传输协议.序列化方式等通讯相关的配置和扩展.dubbo执行一次RPC请求的过程大致如下:消费者(Consumer)向注册中心(Registry)执行RPC ...

  4. MODBUS-RTU通讯协议简介

    MODBUS-RTU通讯协议简介   什么是MODBUS? MODBUS 是MODICON公司最先倡导的一种软的通讯规约,经过大多数公司 的实际应用,逐渐被认可,成为一种标准的通讯规约,只要按照这种规 ...

  5. CNN 美国有线电视新闻网 wapCNN WAP 指无线应用通讯协议 ---- 美国有线电视新闻网 的无线应用

    wapCNN  wap指无线应用通讯协议  CNN美国有线电视新闻网   固, wapCNN 美国有线电视新闻网的无线应用 -------------------------------------- ...

  6. Netty 对通讯协议结构设计的启发和总结

    Netty 通讯协议结构设计的总结 key words: 通信,协议,结构设计,netty,解码器,LengthFieldBasedFrameDecoder 原创 包含与机器/设备的通讯协议结构的设计 ...

  7. 几种通讯协议的比较RMI > Httpinvoker >= Hessian >> Burlap >> web service

    一.综述本文比较了RMI,Hessian,Burlap,Httpinvoker,web service等5种通讯协议的在不同的数据结构和不同数据量时的传输性能.RMI是java语言本身提供的远程通讯协 ...

  8. 射频识别技术漫谈(6)——通讯协议概述【worldsing笔记】

    通讯协议是通讯的双方或多方在交流时遵守的规矩,包括谁先发起通讯,先交流什么,后交流什么,一方如何问,另一方如何答等.在这里通迅的双方指的是读写器和卡片. 首先是谁先发起通讯,很显然有两种,读写器先发言 ...

  9. STUN/TURN/ICE协议在P2P SIP中的应用(二)

    1       说明 2       打洞和穿越的概念... 1 3       P2P中的打洞和穿越... 2 4       使用STUN系列 协议穿越的特点... 2 5       STUN/ ...

随机推荐

  1. BZOJ3314: [Usaco2013 Nov]Crowded Cows

    3314: [Usaco2013 Nov]Crowded Cows Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 86  Solved: 61[Subm ...

  2. 【转】 Android ListView与Button的显示----不错不错

    原文网址:http://blog.csdn.net/zy987654zy/article/details/39225819 在开发中有时候会碰见一些很简单的问题,但是当初没想通的时候 死都搞不定. 我 ...

  3. SQL with as 替代临时表的用法

    原文地址:http://www.cnblogs.com/zerocc/archive/2011/11/28/2266180.html SQL中 WITH AS 的用法和注意事项 1.为什么使用with ...

  4. HDU-1869六度分离

    Problem Description 1967 年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不 ...

  5. 基于网络的服装定制MTM系统研究 - 硕士论文 - 道客巴巴

    国内的mtm系统_百度搜索 基于网络的服装定制MTM系统研究 - 硕士论文 - 道客巴巴 PDF文档(共76页) - 下载需1800积分 天津工业大学 硕士学位论文基于网络的服装定制MTM系统研究 姓 ...

  6. JS(六)

    没有视频看了,心里有点慌啊,像这种每天都会灌输很多知识的学习方式,我觉得提前预习真的是有奇效,不然不容易跟上老师的思维. 1.发送验证码:简单 <!DOCTYPE html> <ht ...

  7. IOS如何延长LaunchScreen.xib启动画面

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...

  8. Android adb

    查看原文:http://blog.csdn.net/u010818425/article/details/52266593 (一)基础操作 安装app adb install -r xxx.apk / ...

  9. jQuery插件开发 格式与解析3之$.extend()用途

    前叙:$.extend()——用途:扩展和继承 1.Object extend() 用一个或多个对象扩展另一个对象,并返回已修改的原始对象.这对于简单继承是一个非常有用的实用工具. (1)扩展:(Do ...

  10. Spark的日志配置

    在測试spark计算时.将作业提交到yarn(模式–master yarn-cluster)上,想查看print到控制台这是imposible的.由于作业是提交到yarn的集群上,so 去yarn集群 ...