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