求助 关于SLE4442卡 校验问题

2020-01-27 11:20发布

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);
                 }

        }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
codeman
2020-01-27 16:32
我用过,以下供参考,必须按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];
   }
}

一周热门 更多>