DS5250与磁卡读卡器的连接 - 中国一卡通网
用户名密码 [免费注册] [找回密码] 推广技巧 发布求购 建商铺  发产品  会员体制比较  
 

DS5250与磁卡读卡器的连接

来源:中国一卡通网  作者:不详  发布时间:2012-06-12 09:53:54  字体:[ ]

关键字:智能卡  磁卡  智能卡芯片   

摘   要:背面带有编码磁条的卡通常称为磁卡,广泛用于银行、储值等金融领域。信用卡、ATM和借记卡都是典型的磁卡,有的卡片还嵌入了智能卡芯片。其它应用包括:游戏、影印和公交等领域的礼品卡、安全卡以及房间钥匙卡等。采用标准ISO格式时,这些磁卡的最大容量只有160字节,一般不能存储大量数据。与智能卡或便携式闪存相比,磁卡的存储容量足以支持金融和银行应用,被广泛应用于该领域。而且,磁卡价格低,比较可靠,不需要内部供电,读取相对方便。

  简介 

  背面带有编码磁条的卡通常称为磁卡,广泛用于银行、储值等金融领域。信用卡、ATM和借记卡都是典型的磁卡,有的卡片还嵌入了智能卡芯片。其它应用包括:游戏、影印和公交等领域的礼品卡、安全卡以及房间钥匙卡等。采用标准ISO格式时,这些磁卡的最大容量只有160字节,一般不能存储大量数据。与智能卡或便携式闪存相比,磁卡的存储容量足以支持金融和银行应用,被广泛应用于该领域。而且,磁卡价格低,比较可靠,不需要内部供电,读取相对方便。

  本应用笔记介绍怎样使用DS5250安全微控制器实现和磁卡读卡器的接口。之所以选择DS5250,是因为它具有开发常用读卡设备(例如销售终端POS等设备)所需要的安全和加密功能。

  磁卡读卡器电路可以执行底层任务:把磁条磁通量解码成比特流。DS5250管理顶层任务:将这些比特转换成字符,读取并验证数据。

  硬件和软件要求 

  硬件
  本实例采用了DS5250评估(EV)板(B版),进行了以下改动:
  去掉了端口0的上拉电阻(RN2)
  实际应用还需要以下硬件:
  读卡器—MagTek®三磁道读卡器,含有3V解码器ASIC;序列号为21030001,G版或更新版本 (www.magtek.com/)
  两个上拉电阻(大约10kΩ)
  线性稳压器(能够从5V电源产生3V至3.6V供电)
  用于测试的磁卡(ATM卡、信用卡等) 

  软件
  本实例应用程序以C语言编写,采用了Keil的µVision® IDE 2.40a版进行编译(www.keil.com/)。利用Maxim的微控制器工具包(MTK)将编译后的应用程序装载到DS5250中。

  应用程序的详细信息
  下面几节介绍实例应用程序的实现。可以从Maxim的FTP网站下载完整的C语言代码。

  连接读卡器
  MagTek读卡器有5个接口引脚(包括电源和地):
  引脚1—STROBE
  该信号仅用于读卡器输入。由主机微控制器驱动,逐位输出卡的数据位,触发复位过程。
  引脚2—DATA
  该信号通常是读卡器的输出,包含磁道A/B/C的卡数据位,由STROBE信号同步输出。在某些情况下(例如,触发复位时),可以由主机微控制器驱动该信号。
  引脚3—VDD
  读卡器的电源(2.7V至3.6V)。
  引脚4—GND
  引脚5—GND
  由于STROBE和DATA引脚的工作电平为3V,DS5250无法直接通过标准端口引脚驱动。因此,以端口0 (该端口工作在开漏模式)替代,当DS5250将引脚置为三态时,通过电阻将信号电平上拉至3.6V。由于DS5250端口的VIH电平能够兼容3V I/O电平,因此,DS5250可以直接从DATA线读取DATA信号(请参考DS5250数据资料,了解详细信息)。

  读卡器工作电平为3V;它不能直接采用DS5250的5V电源供电。由于DS5250评估板不提供3V供电,因此,采用了单独的线性稳压器(例如, MAX1658)对读卡器供电。

  复位
  首次上电后,主机微控制器在进行读卡之前必须复位读卡器。每次进行卡扫描之后,也必须按顺序进行复位,以清除内部读卡器ASIC的内存,使读卡器能够准备就绪。接收新的读卡操作。

  复位读卡器时,主机微控制器(例如,本应用笔记的DS5250)必须按照以下顺序驱动STROBE和DATA (请参考MagTek文档,了解确切的电压电平和时序参数)。
  DATA和STROBE都以高电平(空闲)状态开始。
  将DATA置为低电平。
  保持DATA为低电平,将STROBE驱动为低电平,然后再次驱动为高电平。
  再次驱动STROBE为低电平,随后释放DATA,使其能够浮空至高电平。
  当DATA浮空为高电平时,将STROBE驱动为低电平,然后再次驱动为高电平。在这一点,复位读卡器,处于低功耗等待状态。
  将STROBE驱动为低电平,然后再次驱动为高电平。对读卡器进行“配置”,使其能够进行读卡操作。
  // Generate a long delay for card reset and read intervals.
  
  void longDelay()
  {
  int i, j;

  for (i = 1; i < 5; i++) {
  for (j = 1; j < 5000; j++) {
  ;
  }
  }
  }

  // Generate a shorter delay (used between STROBE/DATA transitions).

  void delay()
  {
  int i;

  for (i = 1; i < 1000; i++) {
  ;
  }
  }

  // Release the DATA line (P0.0) and allow it to float high.

  void dataHigh()
  {
  P0 |= 0x01;
  delay();
  }

  // Drive the DATA line (P0.0) low.

  void dataLow()
  {
  P0 &= 0xFE;
  delay();
  }

  // Release the STROBE line (P0.1) and allow it to float high.

  void strobeHigh()
  {
  P0 |= 0x02;
  delay();
  }

  // Drive the STROBE line (P0.1) low.

  void strobeLow()
  {
  P0 &= 0xFD;
  delay();
  }

  void resetCardReader()
  {
  dataHigh();
  strobeHigh();
  longDelay();

  dataLow(); // Force DATA low.
  longDelay();
  strobeLow(); // Drive STROBE low, then high again.
  strobeHigh();
  strobeLow(); // Drive STROBE low, then release DATA.
  dataHigh();
  longDelay();

  strobeHigh(); // Drive STROBE low and high again two more times
  strobeLow(); // to complete the reset and leave the card reader
  strobeHigh(); // in the ready state, prepared to scan a card.
  strobeLow();
  }
  检测读卡操作
  读卡器一旦复位并进行配置后,就可以进行读卡操作。读卡时,MagTek读卡器执行一次完整的读周期;不需要主控制器干预。卡的磁条中所有三个磁道A、B、C的全部内容都被存储到读卡器IC中。读卡周期完成后,可以由主控制器将数据逐位同步输出。

  读卡器通过握手周期告诉主机什么时候开始读卡,什么时候完成读卡。
  该周期以STROBE低电平和DATA浮空高电平(空闲状态)开始。
  当读卡器探测到磁条移过读卡器探头时,开始对卡进行扫描。它将DATA线驱动为低电平,告诉主机开始读卡操作。
  主机驱动STROBE为高电平,然后再变为低电平,做出响应。
  读卡器将DATA再次驱动为高电平。
  一旦读卡周期完成后,读卡器再次将DATA驱动为低电平。这一操作告诉主机已经完成了读卡过程,可以同步输出卡数据。
  // Wait for the DATA line to be driven low by the card reader.

  void waitForDataLow()
  {
  int i = 0xFF;

  dataHigh(); // Make sure that DATA is floating high.

  while ((i & 1) == 1) {
  i = P0;
  }  
  }

  ....
  
  resetCardReader();
  printf("\r\n");
  printf("Waiting for card swipe...\r\n");
  printf("\r\n");

  waitForDataLow(); // DATA low indicates that card swipe has begun.
  strobeHigh();
  longDelay();
  strobeLow();
  longDelay();
  waitForDataLow(); // DATA low indicates that card swipe is complete. 

更多

新闻投稿合作邮箱:yktchina-admin@163.com    字体[ ] [收藏] [进入论坛]

推荐文章

论坛热帖