||
本系统假设所有CPU卡和ESAM模块的文件可以自由读,但是写文件的时候需要权限认证。
当单片机控制电路检测到有CPU卡插入后,处理流程为:
1、卡上电和复位
2、选择要操作的卡上的主文件
3、ESAM模块上电和复位
4、选择要操作的ESAM模块的主文件
5、如果文件的读写权限自由,这时已经可以对文件进行读写操作,如果读写有权限,则需要向下经过内部认证和外部认证后进行文件的读写。
6、卡和ESAM之间的内部认证
7、卡和ESAM的外部认证
读(写)有权限的文件。
这里定义了以后程序里面用到的与CPU卡和ESAM模块有关的单片机端口定义。
#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,卡和ESAM的SCL信号输入端
在程序中经常要对端口的输入输出和电平高低状况进行改变,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
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 //密钥比较错误
unsigned char TxAndRxBuff[124];
卡或者ESAM读写过程中的数据通过此变量进行传输。
CPU卡在处理过程中,每次最多可接收和发送124个字节
//卡主目录3f 01,Esam主目录3f 00
#define MainDir 0x3f
#define CardMainDir 0x01
#define EsamMainDir 0x00
对卡或者ESAM的文件进行操作前,必须先选择该文件所在的主目录。
//响应状态字SW1,SW2,
//命令正确执行的响应数据为SW1SW2=90 00或SW1SW2=61 00
#define RespondStateByte1 0x90
#define RespondStateByte2 0x00
#define RespondStateByte3 0x61
//cTxAndRxStatus CPU卡接收数据正确标志
#define ReceINSRightBIT BIT0
该变量用以判定从卡或者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计算的校验和