英创信息技术工控主板EM9161对ISO7816协议的支持概述

在当前的金融pos终端及相关领域,iso7816通讯协议得到了广泛应用。英创的工控主板em9161,可在其异步串口的基础上,通过简单的设置,就可把串口转为符合iso7816协议的接口,实现与各种智能卡的通讯。本文主要介绍采用em9161的com2口,实现iso7816通讯的基本方法。
上图表示em9161作为iso7816主控方与智能卡的连接示意图,其中原com2口的数据发送管脚txd2作为iso7816的半双工数据信号dio;原com2口的rts2n控制线作为iso7816的时钟信号sck。两个信号线的电平均为3.3v的ttl信号电平。
应用程序进行iso7816通讯的基本流程为:
1、按标准方法打开串口“com2:”,并设置相应串口参数;
2、通过deviceiocontrol(…)函数使能iso7816通讯模式,并设置相关参数;
3、设置波特率,注意在使能iso7816模式后,必须重新设置波特率;
4、进行数据通讯,数据帧的奇偶校验位需要与通讯对端匹配;
5、通过deviceiocontrol(…)函数禁止iso7816通讯模式;
6、按标准方法关闭串口“com2:”。
为了实现从通常的异步串口到iso7816的转换,em9161的串口驱动增加了2个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)
使能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 = (di / fi)× sck
上式中的sck = 串口波特率×fi / di,例如串口波特率为9600,fi / di = 372,则sck时钟频率为3.57mhz。在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;
dwordpbuf[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 buffer
null, 0, // output buffer
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');
}

一文详解ISP的工作原理、内部架构设计
为什么MOS管各个端口阻抗有的高有的低?
科学家研发“人体芯片”代替动物实验
双11必购讯飞翻译机2.0覆盖中国人95%出境目的地
各种换热器结构动态原理图分享
英创信息技术工控主板EM9161对ISO7816协议的支持概述
恒温恒湿箱,恒温恒湿试验箱,高低温试验箱
无线智能电表采集网关支持modbus协议采集
武汉裕诚科汇推动AloT物联网芯片行业赋能
Android 11可提示手机未正确放置在无线充电板
新能源自动化转型之路—高端制造+新能源+工业4.0
手机频繁断网怎么办?
水冷散热器的安装和使用手册
基于UCC28881型号的700V 最低静态电流离线开关
新基建时代下的智慧工地管理系统,它的具体作用是什么
2018年苹果新款iPad Pro将采用刘海屏和A12处理器,将于9、10月份与大家见面
chatGPT谈5G对人工智能会有什么影响?
苹果推出tvOS应用“iBooks StoryTime”
一种无绳电话后备电源的制作方法
三大运营商一季度的经营情况已经陆续公布,三者都实现了各自的增长