注册名:

密码:

个人注册

企业注册

商务申请

商务管理平台

企业管理平台

个人管理平台

我的工控博客

中国工控网www.chinakong.com

首页 | 新闻中心 | 工控论坛 | 经验视点 | 工控商务 | 电气手册 | 工控博客 | 招聘求职 | 网上调查 | 企业中心 | 供求信息 | 资料中心 | 工控书店

所在位置:工控论坛 -- 行业技术论坛 -- 行业技术论坛(非专题) -- 工艺技术

中国工控网搜索:

 登陆:密码:  注册  密码

搜索:

行业技术论坛(非专题)分类  

全部论题

工艺技术

行业标准

机械装备

技术经验

发表人:emtronix 发表时间:2011/1/10 0:28:00  

 

 本栏论题: ISO7816通讯协议在工控主板EM9160中的实现方案  [1898]

    在新的国家电网智能终端相关标准中,规定了通过专门的加密芯片来保证设备数据安全性的方法,而设备主控单元与加密芯片采用了广泛应用的ISO7816通讯协议。工控主板EM9160为了适应这一新的技术需求,对其内核进行了升级,使其多个串口都可支持ISO7816协议,为客户进行智能终端整机设计时,提供了灵活的选择。
   
    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 <winioctl.h>
    #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
   
   
   
    选择蓝色区域的值,可得到对应的黄色区域的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');
    }
   
    设置了ISO模式后,应用程序仍然可以像操作普通串口那样,进行数据的读写,只是需要注意的是ISO7816的半双工模式的,所以数据通讯的过程更像是RS485的过程。用户可参考英创网站的《RS485接口通讯的WinCE编程要点》一文,来规划自己的应用程序通讯流程。
   
   
   

如果要回复本栏论题,请首先中国工控网www.chinakong.com

·如果你已经是中国工控网www.chinakong.com成员,请直接登录。

·如果你还不是中国工控网www.chinakong.com成员,请首先注册,注册为免费!

注册名:

密  码:

           注册中国工控网www.chinakong.com
           忘记密码

关闭该窗口

关于我们     免责声明     服务项目     广告联系     友情链接     联系方式     意见反馈     设为首页     加入收藏

 ©2023-2025 中国工控网(www.chinakong.com) 版权所有 豫ICP备17046657号

管理员信箱:chinakong98@163.com  服务热线:13525974529

洛阳博德工控自动化技术有限公司

中国    洛阳