sle4442 的底层驱动参考的是 论坛里共享的,现在 卡可以读取,但是密码校验的时候,总是校验失败
但是我读取 密码寄存器的时候,发现错误计数器还是0xff,说明卡还没费啊,那么就是 我写的程序根本就没有实行校验了,太奇怪了。
uchar password[3]={0xff,0xff,0xff};
以下是 main 函数:
void main()
{
serial_init();
while(1)
{
Delay_ms(2000);
SendComm(RSM_COMM,1,1); //读保密存储区的命令字
Read_Mod(tp,4); //读出
shu = Verify(password);
if(shu)
{
Umm(0x01,b[0]); //写主存
Delay_ms(200);
while(1)
{
Rmm(0x01,a,1); // 读主存
UART_Send_Byte(a[0]);
Delay_ms(2000);
}
}
else
while(1)
{
UART_Send_Byte(tp[0]);
Delay_ms(2000);
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
//定义对各存储器的操作命令
#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];
}
}
一周热门 更多>