来源:中国一卡通网 作者:不详 发布时间: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.
推荐文章
论坛热帖