nullPSAM卡驱动设计PSAM卡驱动设计 黄 文 林
东南大学国家专用集成电路系统工程技术研究中心PSAM卡简单介绍PSAM卡简单介绍PSAM卡Psam1Init( )Psam1Init( )函数名称: VOID Psam1Init(VOID)
入口参数: 无
返回值: 无
函数功能: PSAM卡初始化,配置各I/O口,包括:contorl、reset、data三个端口。
RES --- PC5
CLK --- PC12
DATA---PE9Psam1Init( )Psam1Init( )*(RP)PORTE_DIR |= 0x0200; //将PE9中断口配成psamcard1的data口;
*(RP)PORTE_SEL |= 0x0200;
*(RP)PORTE_INTRCTL |= 0x000c0000;
*(RP)PORTE_INCTL |= 0x0200;
*(RP)PORTE_INTRCLR |= 0x0200;
*(RP)PORTE_INTRCLR = 0X0000;
*(RP)PORTC_SEL |= 0x0020; //将PC5配成psamcard1的reset口;
*(RP)PORTC_DATA &= (~0x0020);
*(RP)PORTC_DIR &= (~0x0020);
*(RP)PORTC_SEL |= 0x1000; //将pc12配成psamcard1的control口
*(RP)PORTC_DATA |= 0x1000;
*(RP)PORTC_DIR &= (~0x1000);
Psam1_Str_Init( )Psam1_Str_Init( )函数名称: VOID Psam1_Str_Init(VOID)
入口参数: 无
返回值: 无
函数功能: PSAM卡收发结构体的初始化
Psam1_Str_Init( )Psam1_Str_Init( )typedef struct _psam{
CHAR send_data[5]; //命令头
INT command_len; //命令长度
CHAR command_data[MAXLEN]; //命令字节
CHAR receive_data[MAXLEN]; //接收字节
INT receive_len; //接收长度
}psamcard;
memset(psam1.send_data,0,5);
psam1.command_len = 0;
memset(psam1.command_data,0,MAXLEN);
memset(psam1.receive_data,0,MAXLEN);
psam1.receive_len = 0;Psam1Init( )Psam1Init( )*(RP)PORTE_DIR |= 0x0200; //将PE9中断口配成psamcard1的data口;
*(RP)PORTE_SEL |= 0x0200;
*(RP)PORTE_INTRCTL |= 0x000c0000;
*(RP)PORTE_INCTL |= 0x0200;
*(RP)PORTE_INTRCLR |= 0x0200;
*(RP)PORTE_INTRCLR = 0X0000;
*(RP)PORTC_SEL |= 0x0020; //将PC5配成psamcard1的reset口;
*(RP)PORTC_DATA &= (~0x0020);
*(RP)PORTC_DIR &= (~0x0020);
*(RP)PORTC_SEL |= 0x1000; //将pc12配成psamcard1的control口
*(RP)PORTC_DATA |= 0x1000;
*(RP)PORTC_DIR &= (~0x1000);
Psam1Init( )Psam1Init( )*(RP)PORTE_DIR |= 0x0200; //将PE9中断口配成psamcard1的data口;
*(RP)PORTE_SEL |= 0x0200;
*(RP)PORTE_INTRCTL |= 0x000c0000;
*(RP)PORTE_INCTL |= 0x0200;
*(RP)PORTE_INTRCLR |= 0x0200;
*(RP)PORTE_INTRCLR = 0X0000;
*(RP)PORTC_SEL |= 0x0020; //将PC5配成psamcard1的reset口;
*(RP)PORTC_DATA &= (~0x0020);
*(RP)PORTC_DIR &= (~0x0020);
*(RP)PORTC_SEL |= 0x1000; //将pc12配成psamcard1的control口
*(RP)PORTC_DATA |= 0x1000;
*(RP)PORTC_DIR &= (~0x1000);
Psam1ResetCold( ) Psam1ResetCold( ) 函数名称: VOID Psam1ResetCold(VOID)
入口参数: 无
返回值: 无
函数功能: PSAM卡冷复位Psam1ResetCold( )Psam1ResetCold( )*(RP)PORTC_SEL |= 0x0020;
*(RP)PORTC_DATA |= 0x0020;
*(RP)PORTC_DIR &= (~0x0020);Psam1CommandSend( )Psam1CommandSend( )函数名称:VOID Psam1CommandSend(CHAR *command,INT len)
入口参数:CHAR *command 发送命令内容的首指针
INT len 发送命令的长度
返回值: 无
函数功能: 发送PSAM卡命令的一个字节Psam1CommandSend( )Psam1CommandSend( )将data口置为普通I/O口
起始位
8位数据
校验位(奇校验)
发送完成后,将data口置为中断口(
图)Psam1Lisr( )Psam1Lisr( )函数名称: VOID Psam1Lisr(VOID)
入口参数: 无
返回值: 无
函数功能: 响应PSAM卡产生的低级中断,激活其高级中断程序。 Psam1Lisr( )Psam1Lisr( )mask_irq(10);
psam1.receive_len ++;
NU_Activate_HISR(&PSAM1HISR);
*(RP)PORTE_INTRCLR |= 0X0200;
*(RP)PORTE_INTRCLR &= (~0X0200);Psam1Hisr( )Psam1Hisr( )函数名称: VOID Psam1Hisr(VOID)
入口参数: 无
返回值: 无
函数功能: 处理PSAM卡产生的高级中断。将data口配置为通用口,以接收data口上产生的8位数据。
(流程图)
Psam1Hisr( )Psam1Hisr( )for(j=0;j<234;j++);//246
*(RP)PORTE_SEL |= 0X0200;
*(RP)PORTE_DIR |= 0X0200;
for(i=0;i<8;i++){
temp = *(RP)PORTE_DATA;
if(temp&0X0200)
{
verify ++;
data = 0x01;
psam1.receive_data[psam1.receive_len-1]|= (data<
格式 PSAM卡命令格式 PSAM卡命令包含两部分:固定的四个字节命令头和长度可变的命令体
PSAM卡命令格式PSAM卡命令格式CLA字节指出命令的类型:0x00或0x80。
INS字节
示命令编码,P1和P2为具体命令参数。
Lc字节表示数据的长度,只有一个字节表示,取值范围为1-110。如果Lc为0表示没有数据域。
Le表示期望卡返回的数据长度,由单字节表示,取值范围1-112。Psam1Pro( )Psam1Pro( )函数名称: VOID Psam1Pro(CHAR *buffer)
入口参数: CHAR *buffer 发送命令的首指针
返回值: 无
函数功能: 完成PSAM卡命令发送的全过程。程序首先发送命令头的五个字节内容,然后根据接收到的中间数据,进行后继的不同操作。Psam1_Demo( )Psam1_Demo( )函数名称: INT Psam1_Demo(VOID)
入口参数: 无
返回值: 1 为 失败
0为成功
函数功能:PSAM卡演示程序