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<