|
发表于 2013-9-9 10:54:46
|
显示全部楼层
我用过,以下供参考,必须按4442手册上时序操作,几年前写的,调试用过OK。
//定义对各存储器的操作命令
#define RD_MAIN_RAM 0X30 //读主存储器 ic卡模式:outgoing data
#define WR_MAIN_RAM 0X38 //写主存储器 ic卡模式:processing
#define RD_PRO_RAM 0X34 //读保护存储器 ic卡模式:outgoing data
#define WR_PRO_RAM 0X3C //写保护存储器 ic卡模式:processing
#define RD_PSC_RAM 0X31 //读安全存储器 ic卡模式:outgoing data
#define WR_PSC_RAM 0X39 //写安全存储器 ic卡模式:processing
#define COMP_PSC_RAM 0X33 //比较安全存储器 ic卡模式:processing
//****************************************************************************//
// 读取安全存储器4个字节的数据,数据一地址指针rd_data_ptr中
// 安全寄存器=RD_PSC_RAM
//****************************************************************************//
void rd_psc_ram(U8 * data_temp)
{
U8 i;
ic_start();
out_byte(RD_PSC_RAM);
out_byte(RD_PSC_RAM);
out_byte(RD_PSC_RAM);
ic_stop();
for (i=0;i<4;i++)
{
*data_temp++ = read_data();
}
}
//----------------------------------------------------------------------------//
// ic_card 在处理模式时进行监测是否处理完毕,最大延时255个时钟
//----------------------------------------------------------------------------//
void proc_mode_chek()
{
U16 i;
C_SDA_ChangeInput(1);
for (i=0;i<512;i++)
{
if (C_SDA)
{
i=511;
}
else
{
clock();
}
}
}
void write_eepram(U8 comm_type, U8 write_start_addr, U8 write_data)
{
ic_start();
out_byte(comm_type);
out_byte(write_start_addr);
out_byte(write_data);
ic_stop();
proc_mode_chek();
}
//****************************************************************************//
//密码校验函数
//正确 返回'y' 不正确返回'n'
//****************************************************************************//
U8 csc_4442(U8 *pws)
{
U8 ptr[4];
rd_psc_ram( ptr );
if ( ptr[0] & 0x07 == 0 )
{
return('N');
}
else
{
switch ( ptr[0] & 0x07 )
{
case 1:
write_eepram(WR_PSC_RAM,0,0xf8);
break;
case 2:
write_eepram(WR_PSC_RAM,0,0xf8);
break;
case 3:
write_eepram(WR_PSC_RAM,0,0xf9);
break;
case 4:
write_eepram(WR_PSC_RAM,0,0xf8);
break;
case 5:
write_eepram(WR_PSC_RAM,0,0xf9);
break;
case 6:
write_eepram(WR_PSC_RAM,0,0xfa);
break;
case 7:
write_eepram(WR_PSC_RAM,0,0xfb);
break;
}
}
write_eepram(COMP_PSC_RAM,1,*pws++);
write_eepram(COMP_PSC_RAM,2,*pws++);
write_eepram(COMP_PSC_RAM,3,*pws);
write_eepram(WR_PSC_RAM,0,0xff);
rd_psc_ram(ptr);
if (ptr[0] == 7)
{
return 'Y';
}
else
{
return ptr[0];
}
} |
|