注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
tiankai001的个人空间 https://home.eeworld.com.cn/space-uid-139222.html [收藏] [复制] [分享] [RSS]
日志

CPU卡设计实例及程序设计(四)

已有 792 次阅读2015-1-26 23:54 |个人分类:CPU卡开发设计程序实例| CPU卡, 设计实例, 程序

 1.1. CPU卡处理流程

本系统假设所有CPU卡和ESAM模块的文件可以自由读,但是写文件的时候需要权限认证。

当单片机控制电路检测到有CPU卡插入后,处理流程为:

1、卡上电和复位

2、选择要操作的卡上的主文件

3、ESAM模块上电和复位

4、选择要操作的ESAM模块的主文件

5、如果文件的读写权限自由,这时已经可以对文件进行读写操作,如果读写有权限,则需要向下经过内部认证和外部认证后进行文件的读写。

6、卡和ESAM之间的内部认证

7、卡和ESAM的外部认证

读(写)有权限的文件。

1.2端口配置

这里定义了以后程序里面用到的与CPU卡和ESAM模块有关的单片机端口定义。

1.1.1. 端口定义

#define P2_7EsamPower           BIT7  //ESAM上电

#define P3_1EsamSDA        BIT1  //ESAM数据端

#define P3_2CardSDA        BIT2  //卡数据端

#define P3_4CardRst              BIT4   //卡复位

#define P3_5CardInsChk           BIT5   //卡插入检测

#define P3_6CardPower            BIT6   //卡上电

#define P3_7EsamRST             BIT7   //ESAM复位

#define PJ_1MCLK    BIT1  // MCLK,卡和ESAMSCL信号输入端


在程序中经常要对端口的输入输出和电平高低状况进行改变,MSP430单片机不能对端口进行位操作,为了操作方便将端口的各种状态用宏定义进行规范,这样可以简化程序中队端口的操作,并且使程序可读性强,便于移植。

例如下面定义的CardPowerInput,直接从字面理解即为CPU卡的商店管脚作为输入口,而CardPowerOutputHigh意为卡上电端口输出高电平。这样不仅直观,而且避免了在程序中直接对端口进行配置。

 

//SDA管脚宏定义

#define  CardSDAOutput  P3DIR|=P3_2CardSDA

#define  CardSDAInput  P3DIR&=~P3_2CardSDA

#define  CardSDAOutputHigh  P3OUT|=P3_2CardSDA

#define  CardSDAOutputLow  P3OUT&=~P3_2CardSDA

#define  CardSDAInputCheck  P3IN&P3_2CardSDA

 

//卡复位管脚宏定义

#define  CardRSTOutput  P3DIR|=P3_4CardRst

#define  CardRSTInput  P3DIR&=~P3_4CardRst

#define  CardRSTOutputHigh  P3OUT|=P3_4CardRst

#define  CardRSTOutputLow  P3OUT&=~P3_4CardRst

#define  CardRSTInputCheck  P3IN&P3_4CardRst

 

//卡上电管脚宏定义

#define  CardPowerOutput  P3DIR|=P3_6CardPower

#define  CardPowerInput  P3DIR&=~P3_6CardPower

#define  CardPowerOutputHigh  P3OUT|=P3_6CardPower

#define  CardPowerOutputLow  P3OUT&=~P3_6CardPower

#define  CardPowerInputCheck  P3IN&P3_6CardPower

 

//卡插入管脚宏定义

#define  CardInsertCheckOutput  P3DIR|=P3_5CardInsChk

#define  CardInsertCheckInput  P3DIR&=~P3_5CardInsChk

#define  CardInsertCheckOutputHigh  P3OUT|=P3_5CardInsChk

#define  CardInsertCheckOutputLow  P3OUT&=~P3_5CardInsChk

#define  CardInsertCheck  P3IN&P3_5CardInsChk

 

//Esam SDA管脚宏定义

#define  EsamSDAOutput  P3DIR|=P3_1EsamSDA

#define  EsamSDAInput  P3DIR&=~P3_1EsamSDA

#define  EsamSDAOutputHigh  P3OUT|=P3_1EsamSDA

#define  EsamSDAOutputLow  P3OUT&=~P3_1EsamSDA

#define  EsamSDAInputCheck  P3IN&P3_1EsamSDA

 

//Esam 复位管脚宏定义

#define  EsamRSTOutput  P3DIR|=P3_7EsamRST

#define  EsamRSTInput  P3DIR&=~P3_7EsamRST

#define  EsamRSTOutputHigh  P3OUT|=P3_7EsamRST

#define  EsamRSTOutputLow  P3OUT&=~P3_7EsamRST

#define  EsamRSTInputCheck  P3IN&P3_7EsamRST

 

//Esam 上电管脚宏定义

#define  EsamPowerOutput  P2DIR|=P2_7EsamPower

#define  EsamPowerInput  P2DIR&=~P2_7EsamPower

#define  EsamPowerOutputHigh  P2OUT|=P2_7EsamPower

#define  EsamPowerOutputLow  P2OUT&=~P2_7EsamPower

#define  EsamPowerInputCheck  P2IN&P2_7EsamPower

 

//MCLK管脚宏定义

#define  MCLKOutput  PJDIR|=PJ_1MCLK

#define  MCLKInput  PJDIR&=~PJ_1MCLK

#define  MCLKOutputHigh  PJOUT|=PJ_1MCLK

#define  MCLKOutputLow  PJOUT&=~PJ_1MCLK

#define  MCLKInputCheck  PJIN&PJ_1MCLK

#define  MCLKSEL  PJSEL|=PJ_1MCLK

 

1.2. 变量及宏定义

1.1.1. 卡处理结果变量

unsigned int uiCardError;

该变量定义了在卡处理过程中出现的各种异常状态,用以提示在那一步出现了问题,便于问题查找及解决。

以下是该变量各个位的定义。

#define ErrorResetBIT         BIT0 //卡复位错

#define ErrorReadWriteBIT     BIT1 //卡读写错误         

#define ErrorPasswBIT         BIT2 //卡与Esam内部认证错误 

#define ErrorCardExtAuthBIT   BIT8 //卡外部认证错误 

#define ErrorEsamExtAuthBIT   BIT9 //ESAM模块外部认证错误

#define ErrorKeyUpdateBIT     BITD //密钥更新错误

#define ErrorKeyBIT           BITF //密钥比较错误

  

1.1.2. CPU卡通信字节长度 

unsigned char TxAndRxBuff[124]; 

卡或者ESAM读写过程中的数据通过此变量进行传输。

CPU卡在处理过程中,每次最多可接收和发送124个字节

1.1.3. 卡和ESAM文件主目录宏定义

//卡主目录3f 01,Esam主目录3f 00

#define MainDir         0x3f 

#define CardMainDir     0x01

#define EsamMainDir     0x00

对卡或者ESAM的文件进行操作前,必须先选择该文件所在的主目录。

1.1.4. 响应状态字

//响应状态字SW1,SW2,

//命令正确执行的响应数据为SW1SW2=90 00SW1SW2=61 00

#define RespondStateByte1   0x90

#define RespondStateByte2   0x00

#define RespondStateByte3   0x61

1.1.5. 数据接收结果变量

//cTxAndRxStatus  CPU卡接收数据正确标志

#define ReceINSRightBIT       BIT0 

该变量用以判定从卡或者ESAM接受的数据是否正确。

1.1.6. 卡(ESAM操作标志变量)

此变量用以标明是对卡还是对ESAM进行操作,并且还标明从卡或者ESAM来的数据的校验结果正确与否

//icflag1

#define ICSAM           BIT0     //0--SAM操作   1--对卡操作

#define CARDPRO_ERR   BIT1     //0--读写卡操作正常 1--读写卡错误  

#define cCheckOrRe       BIT2

#define CheckflagBit       BIT5

#define ICXOR           BIT6     ///ESAM传来的校验和

#define MXOR           BIT7     //CPU计算的校验和

 

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章