1、用 PIC 单片机实现的 IC 卡读写器引言本设计的主要目的是介绍 IC 卡的数据存储技术和 IC 卡的数据通信,因而使用存储器卡。由于本设计中既可与 IC 卡进行串行同步通信,又要与上位机进行中行异步通信,因而需要选择一种同时具有这两种通信方式的单片机。因为 PIC16F877不仅具有本设计所需要的两种通信方式,而且还具有运行速度快、低功耗、价格低等优点,所以选择 PIC16F877单片机作为本设计的单片机。图1是本设计的电路图,图中电源变换电路和发光二极管等指示电路没有画出。图中的二极管电路是单片机与 IC 卡通信数据线的保护电路。当数据线上的电压为负电压时,与地相连的二极管导通;当数据线
2、上的电压大于 5V 时,与 5V 相连的二极管导通,从而保证数据线上的电压在0V 5V 之间,保护单片机和 IC 卡不受损坏。图中单片机的15脚和23脚分别与 IC 卡的输出引脚3和4相连。由于 IC 卡的输出电压为 CMOS 电平,而单片机能够正确的识别 IC 卡的输出信号,需要加上拉电阻。1 SPI 工作方式串行外围设备接口 SPI( Serial Peripheral InteRFace)总线技术是 Motrola 公司推出的一种同步串行接口。SPI 总线是一种三线同步总线,因其硬件能力很强,与 SPI 有关的软件就相当简单,使 CPU 有更多的时间处理其它事务,因此得到广泛应用。 SP
3、I 模式允许 8位数据同步发送和接收,支持 SPI 的所有四种方式。SPI 模式传输数据需要四根信号线:串行数据输出(SDO)线、串行数据输入(SDI )线、串行时钟(SCK)和从选择(SS) 。其中,从选择线只用于从属模式。1.1 SPI 主模式由于控制时钟 SCK 的输出,主模式可以在任何时候开始传输数据。主模式通过软件协议控制从模式的数据输出。在主模式中,一旦 SSPUF 寄存器写入,数据就会发送或接收。在接收数据时,SSPSR 寄存器按照时钟速率移位,一旦接收到一个字节,数据就传输到 SSPBUF,同时中断标志位和状态标志位置位。时钟的极性可以通过编程改变。在主模式中,时钟 SCK 的
4、频率可以设置为:fosc/4(即 Tcy)、fosc/16(即4Tcy) 、fosc/64(即16Tcy) 和定时器 2(Timer2)输出的二分频等四种。在芯片时钟为20MHz 时,SCK 的最大频率为5.0MHz。在本设计中,使用的就是 SPI 主模式,由单片机控制时钟 SCK 的输出。当向 IC 卡中写数据时,随时可以发送数据;当读 IC 卡内的数据时,先要发送任意一个数据(此时 IC卡不处于写入状态,不会接收该数据) , 给 IC 卡提供输出数据的时钟,然后再接收 IC 卡发出的数据。其时序如图2所示。 (发送和接惦的数据均为6FH)如果要连续发送数据,那么每次将数据送到 SSPBUF
5、 寄存器后,都要判断是否已经发送完该数据,即判断 PIR1寄存器的 SSPIF 位是否为1。如果 SSPIF 位为1,则表明数据已经发送完毕,可以继续发送下一个数据。但此时还不能立即发送下一个数据,因为 SSPIF位必须在程序中由软件清零,只有将 SSPIF 位软件清零后,才能继续发送下一个数据。1.2 SPI 从模式在 SPI 从模式,数据的发送和接收领先 SCK 引脚上输入的外时钟脉冲,当最后一位被锁存后,中断标志位 SSPIF(PIR1的 D3)位。在休眠模式,从模式仍可发送和接收数据,一旦接收到数据,芯片就从休眠中唤醒。如果采用 SS 控制的从模式,当 SS 引脚接到 VDD 时,SP
6、I 模式复位;如果 彩 CKE=1控制的从模式,必须开放 SS 引脚控制。在本设计中,由于 IC 卡是存储器卡,不能提供时钟信号,因此不能采用从模式,只能采用主模式,由单片机控制时钟信号。单片机的 SPI 方式初始化程序如下:MOVLW20H ;将20H 送到累加器MOVWF SSPCON ;将累加器中的数送到 SSPCON 寄存器BSF STATUS,RP0 ;将定 RAM 区的第1页BCF SSPSTAT,SMP ;将 SSPSTAT 寄存器的 SMP 位置0BSF SSPSTAT,CKE ;将 SSPSTAT 寄存器的 CLK 位置1BCF TRISC,3 ;将端口 C 的第3位设置为输
7、出BCF TRISC,5 ;将端口 C 的第5位设置为输出其中,上述第1、2 行程序是配置控制寄存器,将 SPI 方式配置为主控模式,时钟频率为单片机时钟频率的1/4,并将时钟的高电平设置为空闲状态。第3行程序为换页指令,将指针转到第1页。因为 PIC16F877单片机的数据存储器是分页的,而所要操作的寄存器在第1页,因此要用换页指令将指针到第1页。第4 、5行程序是配置状态寄存器,将 SPI 方式设置为数据输出时钟的中间采样,时钟 SCK 的上升沿触发。第6、7行程序则是将 RC 口的 RC3和 RC5设置为输出。2 USART 方式通用同步异步接收发送模块(USART)是两个串行通信接口之
8、一,USART 又称为SCI(Serial Communication InteRFace) 。USART 可以设置为全双工异步串行通信系统,这种方式可以与个人计算机 PC 或串行接口 CRT 等外围设备进行串行通信:也可以设置为半双工异步串行通信系统,与串行接口的 A/D 或 D/A 集成电路、串行 EEPROM 等器件连接。USART 是二线制串行通信接口,它可以被定义如下三种工作方式:全双工异步方式、半双工同步主控方式、半双工同步从动方式。为了把 RC6和 RC7分别设置成串行通信接口的发送/时钟(TX/CK)线和接收/ 数据(TX/DT)线,必须首先把 SPEN 位(TCSTAT 的
9、RD7)和方向寄存器 TRISC 的D7:D6置1 。USART 功能模块含有两个8位可读/写的状态/ 控制寄存器,它们是发送状态/控制寄存器 TXSTA 和接收状态/控制寄存器 TCSTA。USART 带有一个8 位波特率发生器 BRG(Baud Rato Generator) ,这个 BRG 支持 USART 的同步和异步工作方式。用 SPBRG 寄存器控制一个独立的 8 位定时器的周期。在异步方式下,发送状态/控制寄存器 TXSTA 的 BRGH 位(即 D2)也被用来控制波特率(在同步方式下忽略 BRGH 位) 。 向波特率寄存器 SPBRG 写入一个新的初值时,都会使 BRG 定时器
10、复位清零,由此可以保证 BRG 不需要等到定时器溢出后就可以输出新的波特率。对 USART 方式进行初始化的程序如下:BSF STATUS,RP0 ;将指针指向数据存储器的第1页MOVLW 0x19MOVWF SPBRG ;设置波特率为9600BCF STATUS,RP0 ;将指针指向数据存储器的第0页CLRF RCSTA ;将接收控制和状态寄存器清零BSF RCSTA,SPEN ;串口允许CLRF PIR1 ;清除中断标志BSF STATUS,RP0 ;将指针指向数据存储器的第1页CLRF TXSTA ;将发送控制和状态寄存器清零BSF TXSTA,BRGH ;设置为异步、高速波特率BSF
11、TXSTA,TXEN ;允许发送BCF STATUS,RP0 ;将指针指向数据存储器的第0页BSF RCSTA,CREN ;允许接收初始化完成后,即可发送或接收数据。在发送或接收数据时,通过查询发送/接收中断标志位即可判断是否发送完一个数据/接收到一个数据。发送/ 接收中断标地不需要也不有用软件复位。在异步串行发送的过程中,只要 TXREG 寄存器为空,中断标志 TXIF 就置位。因此,TXIF 为1并不是发送完毕的标志,但仍可以用 TXIF 标志来判断。因此当 TXREG 为空时,将数据送入后,数据会保留在 TXREG 寄存器中,直到前一个数据从发送移位寄存器中移出,即前一个数据发送完。3
12、IC 卡IC 卡是集成电路卡(Integrated Circuit Card)的简称,有些国家和地址称其为智能卡(Smart Card) 、芯片卡(Chip Card) 。国际标准化组织(ISO )在 ISO7816标准中规定,IC 卡是指在由聚氯乙烯(PVC)或聚氯乙烯酸脂(PVCA )材料制成的塑料卡内嵌入式处理器和存储器等 IC 芯片的数据卡。近年来,由于导半体技术的进步,集成化程度和存储器容量有了很大提高,并使 CPU 和存储器集成在一个芯片上,从而提高了数据的安全性。在本设计中,IC 卡采用的是 AT45DB041B-SC 芯片,该芯片的特点如一下: 单一的2.7V3.6V 电源;
13、串行接口结构; 页面编程操作,单一的循环重复编程(擦除和编程,2048页(每页264字节)主存; 两个264 字节的 SRAM 数据缓存,允许在重编程非易失性存储器时接收数据; 内置的编程和控制定时器; 低功耗,4mA 有源读取电流,2 A CMOS 备用电流; 15MHz 的最大时钟频率; 串行外围接口方式(SPI) 模式0 和3; CMOS 的 TTL 兼容的输入和输出; 5.0V 可承受的输入,SI 、SCK、CS (低电平有效) 、 RESET(低电平有效) 。在本设计的调试过程中,曾测试过 IC 卡的输入输出电平,结果证明这种 IC 卡的输入电平与 TTL 兼容,而输出电平与 TTL
14、 不兼容。4 IC 卡的电源提供电路在本设计中,由于 IC 卡的电源电压范围为 2.7 3.6V,而 PIC 单片机需要的电源为 5V,而且稳压源提供的电压也是 5V,因此,要设计一个稳压模块,给 IC 卡提供 3V 左右的电压。设计电路如图3所示。00该电路的主要元件为 LM317芯片,它是三端可调集成稳压器 ,输出电压为1.25 37V 范围内可调。当其 Vin 端的输入电压在2 40V 范围内变化时,电路均能正常工作,输出端Vout 和调整端 ADJ 间的电压等于基准电压1.25V。该芯片内的基电路的工作电流 IREF 很小,约为50 A,由一个恒流性很好的恒流源提供,所以它的大小不受供
15、电电压的影响,非常稳定。在图3中,B 点为电压输出端,为 IC 卡提供电压。 A 点为控制端,与单片机的一个端口引脚相连,当该引脚为低电平时,三极管 Q1不工作, B 点输出电压约为3.15V;当该引脚为高电平时,三极管 Q1工作,B 点输出电压约为1.25V。在程序中查询 IC 卡插座中是否有 IC 卡,当有 IC 卡时,将 A 点所连的单片机引脚设置为低电平,从而为 IC 卡提供电源;当没有 IC 卡或对 IC 卡的操作结束时,将 A 点连的单片机引脚设置为高电平,从而不给 IC 卡提供电源。IC 卡的上电和下电程序如下。IC 卡上电子程序 IC 卡下电子程序PowerON POWEROO
16、F BSF STATUS,RP0 BSFSTATUS,RP0BCF TRISE,0 BCF TRISE,0BCF RTISE,1 BCF TRISE,1BCF STATUS,RP0 BCF STATUS,RP0BCF PORTE,0 BSF PORTE,0BCF PORTE,1 BSF PORTE,1CALL DLYTIM CALL DLYTIMRETURN RETURN在本设计中,单片机与 IC 卡通信的主程序流程图如图4所示。5 与 PC 机的通信在本设计中,有 PIC 单片机 与 PC 机串行通信的功能。由于本设计所用的单片机PIC16F877有 USART 方式,该方式可将 C 口的 RC5和 RC7设置成异步串行通信模式,因而在本设计中,与 PC 机的通信模块电路就比较简单。将单片机 C 口的 RC6和 RC7设置为异步串行通信模式,经过 MAX232A 芯片进行电平转换后,将 TTL 电平转换为RS232电平,再与 DB9接口相连,即可实现通信。在 PC 机端,可以用 VC 等编程工具根据通信协议编写软件来控制对 IC 卡的读写操作。