英创信息技术EM9X60利用串口实现ISO7816介绍

描述

英利EM9160、EM9460系列产品,均以丰富的串口资源为特色,已大量地应用于工业环境中,特别是在电力系统中应用。最近公司即将推出一款新的产品EM9560工控主板,该主板是是以EM9460工控主板为基础,并针对客户应用的需求,增加了更多通用数字IO,该产品继续保持了Linux操作系统作为客户应用程序的软件平台。这三款主板均具备6个串口,其中的4个串口可支持ISO7816,用户可以通过简单的设置,即可将异步串口转换为符合ISO7816的接口,从而方便地实现和各种智能卡之间的通讯。本文将详细介绍在EM9160、EM9460、EM9560工控主板上设置ISO7816的方法。

1、ISO7816接口资源配置
        可支持ISO7816的串口资源包括:ttyS2 + GPIO14、ttyS4 + GPIO15、ttyS5 + GPIO15、ttyS6 + GPIO15,其中的GPIO14和GPIO15分别作为ISO7816的工作时钟输出,需要注意的是ttyS4、ttyS5、ttyS6这三个串口共用的是一个工作时钟输出,如果需要同时使用的话,要求波特率是一致的。以下为资源列表:

串口 管脚配置 备注
ttyS2   TXD:半双工数据线  
  RXD:复位输出控制   低电平有效
  GPIO14:作为SCK   输出频率与波特率等参数有关
ttyS4   TXD:半双工数据线  
  RXD:复位输出控制   低电平有效
  GPIO15:作为SCK   输出频率与波特率等参数有关
ttyS5   TXD:半双工数据线  
  RXD:复位输出控制   低电平有效
  GPIO15:作为SCK   输出频率与波特率等参数有关
ttyS6   TXD:半双工数据线  
  RXD:复位输出控制   低电平有效
  GPIO15:作为SCK   输出频率与波特率等参数有关


其中ttyS4-ttyS6缺省为TTL电平,所以建议客户首选其中之一作为ISO7816接口。ttyS2缺省出厂配置为RS232电平,如果选择了该串口,需要特别通知我们公司在出厂时将该串口设置为TTL电平。一旦GPIO14、GPIO15作为ISO7816的工作时钟,就不能再做其他用途使用。

2、硬件接口电路

Linux

需要注意的是我们将串口的RXD作为对ISO7816接口的复位信号,相应的在串口驱动中已实现了该功能,在后续应用程序介绍中会介绍对ISO7816进行复位的方法。

3、应用程序设置方法
        对于ISO7816设置我们已经在底层的串口驱动中完全实现,因此上层的应用程序在进行ISO7816设置、通讯时,和使用标准的串口方法是类似的。也是按照标准的方式打开串口,只是在设置串口的通讯参数时增加对ISO7816的设置即可,然后就可以按照串口数据收发的标准方式进行ISO7816的数据读写,只是需要注意的是ISO7816的半双工通讯模式。

根据ISO7816协议类型以及帧应答规范,所定义的ISO7816的相关参数均定义在我们公司提到个em9x60_drivers.h文件中。

#define EM9X60_ISO7816_T0 (1 << 27) // D27 of termios.c_cflag
        #define EM9X60_ISO7816_T1 (1 << 26) // D26 of termios.c_cflag
        #define EM9X60_ISO7816_RXD_RESET(1 << 23) // D23 of termios.c_cflag
        #define EM9X60_ISO7816_MODE (EM9X60_ISO7816_T0 | EM9X60_ISO7816_T1)

设置这些参数的方法和标准设置串口的波特率等其他通讯参数一样,直接调用标准函数tcsetattr( )就可完成。如:

int enable_iso7816(pport_info p_info)
        {
                struct termios cur_opt;
                int status;
                tcgetattr(p_info->port_fd,&cur_opt);
                // 修改模式,启动iso7816复位操作
                cur_opt.c_cflag |= ( EM9X60_ISO7816_T0 | EM9X60_ISO7816_RXD_RESET );
                status = tcsetattr(p_info->port_fd,TCSANOW,&cur_opt);
                if(status != 0)
                {
                        perror('Cannot set the serial port parameters');
                        return -1; 
                }
                // 修改模式,进入iso7816
                cur_opt.c_cflag &= ~EM9X60_ISO7816_RXD_RESET;
                status = tcsetattr(p_info->port_fd,TCSANOW,&cur_opt);
                if(status != 0)
                {
                        perror('Cannot set the serial port parameters');
                        return -1;
                }
                return status;
        }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分