⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iccard.c

📁 单相 CPU卡表复费率电能表,内部有提供I2C驱动,CPU卡驱动,NEC单片机0513等
💻 C
📖 第 1 页 / 共 3 页
字号:
    Cpu_card_comm.Serial_Buffer[2] = file_id | 0x80 ;
    Cpu_card_comm.Serial_Buffer[3] = s_pos & 0xff;
    Cpu_card_comm.Serial_Buffer[4] = w_len;
    CPU_card_send_command(0, 5);
    CPU_card_read_response(1);
    CPU_card_send_command(5, w_len);
    CPU_card_read_response(2);
    Cpu_card_comm.selectDevice = old_dev;
    if( ( Cpu_card_comm.Serial_Buffer[0] != 0x90 )||( Cpu_card_comm.Serial_Buffer[1] != 0x00 ) )
    {
        return ERROR;
    }

    return OK;
}

uchar IC_write_file_ex(uchar sel_dev, ushort s_pos, uchar w_len)
{
    uchar old_dev = Cpu_card_comm.selectDevice;

    Cpu_card_comm.selectDevice = sel_dev;
    Cpu_card_comm.Serial_Buffer[0] = 0x0;
    Cpu_card_comm.Serial_Buffer[1] = 0xd6;
    Cpu_card_comm.Serial_Buffer[2] = (uchar)(s_pos >> 8);
    Cpu_card_comm.Serial_Buffer[3] = (uchar)(s_pos & 0xff);
    Cpu_card_comm.Serial_Buffer[4] = w_len;
    CPU_card_send_command(0, 5);
    CPU_card_read_response(1);
    CPU_card_send_command(5, w_len);
    CPU_card_read_response(2);
    Cpu_card_comm.selectDevice = old_dev;

    if( ( Cpu_card_comm.Serial_Buffer[0] != 0x90 ) ||( Cpu_card_comm.Serial_Buffer[1] != 0x00 ) )
    {
        return ERROR;
    } 

    return OK;
}
	
uchar ESAM_update_key(void)
{
    uchar old_dev = Cpu_card_comm.selectDevice;

    Cpu_card_comm.selectDevice = SEL_ESAM;
    Cpu_card_comm.Serial_Buffer[0] = 0x84;
    Cpu_card_comm.Serial_Buffer[1] = 0xd4;
    Cpu_card_comm.Serial_Buffer[2] = 0x01;
    Cpu_card_comm.Serial_Buffer[3] = 0xff;
    Cpu_card_comm.Serial_Buffer[4] = 0x18;
    memcpy(Cpu_card_comm.Serial_Buffer + IC_WRITE_START_ADDR, IC_ESAM_KEY_BUFFER, IC_KEY_LEN);
    CPU_card_send_command(0, 5);
    CPU_card_read_response(1);
    CPU_card_send_command(IC_WRITE_START_ADDR, IC_KEY_LEN);
    CPU_card_read_response(2);
    Cpu_card_comm.selectDevice = old_dev;
    if( ( Cpu_card_comm.Serial_Buffer[0] != 0x90 ) ||( Cpu_card_comm.Serial_Buffer[1] != 0x00 ) )
    {
        return ERROR;
    }

    return OK;
}

uchar ESAM_read_MAC(uchar file_id, uchar start_pos, uchar len)
{
    uchar old_dev = Cpu_card_comm.selectDevice;

    Cpu_card_comm.selectDevice = SEL_ESAM;
    Cpu_card_comm.Serial_Buffer[0] = 0x04;
    Cpu_card_comm.Serial_Buffer[1] = 0xB0;
    Cpu_card_comm.Serial_Buffer[2] = 0x80|file_id;
    Cpu_card_comm.Serial_Buffer[3] = start_pos;
    Cpu_card_comm.Serial_Buffer[4] = 0x11;
    memcpy(&Cpu_card_comm.Serial_Buffer[IC_WRITE_START_ADDR], IC_CPU_RAND_DATA, 4);
    Cpu_card_comm.Serial_Buffer[9] = 0x04;
    Cpu_card_comm.Serial_Buffer[10] = 0xd6;
    Cpu_card_comm.Serial_Buffer[11] = 0x80|file_id;
    Cpu_card_comm.Serial_Buffer[12] = start_pos;
    Cpu_card_comm.Serial_Buffer[13] = len + 4;
    memcpy(&Cpu_card_comm.Serial_Buffer[14], IC_ATR_DATA, 8);
    CPU_card_send_command(0, 5);
    CPU_card_read_response(1);
    CPU_card_send_command(IC_WRITE_START_ADDR, 0x11);
    CPU_card_read_response(2);
    Cpu_card_comm.selectDevice = old_dev;
    if( ( Cpu_card_comm.Serial_Buffer[0] != 0x61 ) )
    {
        return ERROR;
    }
    return OK;
}

uchar ESAM_spread_pwd(uchar auth_type)
{
    uchar old_dev = Cpu_card_comm.selectDevice;

    Cpu_card_comm.selectDevice = SEL_ESAM;
    Cpu_card_comm.Serial_Buffer[0] = 0x80;
    Cpu_card_comm.Serial_Buffer[1] = 0xFA;
    Cpu_card_comm.Serial_Buffer[2] = 0;
    Cpu_card_comm.Serial_Buffer[3] = auth_type;
    Cpu_card_comm.Serial_Buffer[4] = 0x08;
    memcpy(&Cpu_card_comm.Serial_Buffer[IC_WRITE_START_ADDR], IC_ATR_DATA, 8 );
    CPU_card_send_command(0, 5);
    CPU_card_read_response(1);
    CPU_card_send_command(IC_WRITE_START_ADDR, 8);
    CPU_card_read_response(2);
    Cpu_card_comm.selectDevice = old_dev;
    if( ( Cpu_card_comm.Serial_Buffer[0] != 0x90 ) ||( Cpu_card_comm.Serial_Buffer[1] != 0x00 ) )
    {
        return ERROR;
    }
    return OK;
}

uchar ESAM_encrypt_rand8(void)
{
    uchar old_dev = Cpu_card_comm.selectDevice;

    Cpu_card_comm.selectDevice = SEL_ESAM;
    Cpu_card_comm.Serial_Buffer[0] = 0x80;
    Cpu_card_comm.Serial_Buffer[1] = 0xFA;
    Cpu_card_comm.Serial_Buffer[2] = 0;
    Cpu_card_comm.Serial_Buffer[3] = 0x00;
    Cpu_card_comm.Serial_Buffer[4] = 0x08;
    memcpy( &Cpu_card_comm.Serial_Buffer[IC_WRITE_START_ADDR], IC_CPU_RAND_DATA, 8 );
    CPU_card_send_command(0, 5);
    CPU_card_read_response(1);
    CPU_card_send_command(IC_WRITE_START_ADDR, 8);
    CPU_card_read_response(2);
    Cpu_card_comm.selectDevice = old_dev;
    if( ( Cpu_card_comm.Serial_Buffer[0] != 0x61 ) ||( Cpu_card_comm.Serial_Buffer[1] != 0x08 ) )
    {
        return ERROR;
    }
	
    return OK;
}

uchar ESAM_external_auth(void)
{
    uchar old_dev = Cpu_card_comm.selectDevice;

    Cpu_card_comm.selectDevice = SEL_ESAM;
    Cpu_card_comm.Serial_Buffer[0] = 0x00;
    Cpu_card_comm.Serial_Buffer[1] = 0x82;
    Cpu_card_comm.Serial_Buffer[2] = 0;
    Cpu_card_comm.Serial_Buffer[3] = 0x05;
    Cpu_card_comm.Serial_Buffer[4] = 0x10;
    memcpy( &Cpu_card_comm.Serial_Buffer[IC_WRITE_START_ADDR], IC_CPU_ENCRYPT_DATA, 8 );
    memcpy( &Cpu_card_comm.Serial_Buffer[IC_WRITE_START_ADDR+8], IC_ATR_DATA, 8 );
    CPU_card_send_command(0, 5);
    CPU_card_read_response(1);
    CPU_card_send_command( IC_WRITE_START_ADDR, 16 );
    CPU_card_read_response(2);
    Cpu_card_comm.selectDevice = old_dev;
    if( ( Cpu_card_comm.Serial_Buffer[0] != 0x90 ) ||( Cpu_card_comm.Serial_Buffer[1] != 0x00 ) )
    {
        return ERROR;
    }

    return OK;
}

uchar UNIC_internal_auth_proc(void)
{		
    if( ESAM_spread_pwd(AUTH_CPU_INTERNAL) != OK )
    {
         test_value = 1;
         return ERROR;        
    }

    if( IC_get_rand_data(SEL_CARD, 8) != OK )
    {
        test_value = 2;
        return ERROR;
    }

    if( IC_internal_auth(AUTH_CPU_INTERNAL) != OK )
    {
        test_value = 3;
        return ERROR;        
    }

    if( IC_get_data_back(SEL_CARD, 8) != OK )
    {
        test_value = 4;
        return ERROR;
    }

    memcpy( IC_CPU_ENCRYPT_DATA, &Cpu_card_comm.Serial_Buffer[1], 8 );
    if( ESAM_encrypt_rand8() != OK )
    {
        test_value = 5;
        return ERROR;        
    }

    if( IC_get_data_back(SEL_ESAM, 8) != OK )
    {
        test_value = 6;
        return ERROR;
    }

    memcpy( IC_ESAM_ENCRYPT_DATA, &Cpu_card_comm.Serial_Buffer[1], 8 );
    if( OK != IsEqual( IC_ESAM_ENCRYPT_DATA, IC_CPU_ENCRYPT_DATA, 8 ) )
    {
        test_value = 7;
        return ERROR;         
    }

    test_value = 0;
    return OK;
}

uchar UNIC_esam_external_auth_proc(void)
{	
    if( IC_get_rand_data(SEL_ESAM, 8) != OK )
    {
        return ERROR;       
    }

    if( IC_internal_auth(AUTH_ESAM_EXTERNAL) != OK )
    {
        return ERROR;      
    }

    if( IC_get_data_back(SEL_CARD, 8) != OK )
    {
        return ERROR;      
    }

    memcpy( IC_CPU_ENCRYPT_DATA, &Cpu_card_comm.Serial_Buffer[1], 8 );
    if( ESAM_external_auth() != OK )
    {
        return ERROR;     
    }
	
    return OK;
}

uchar UNIC_ic_external_auth_proc(void)
{	
    if( ESAM_spread_pwd(AUTH_CPU_EXTERNAL) != OK )
    {
        return ERROR;       
    }

    if( IC_get_rand_data(SEL_CARD, 8) != OK )
    {
        return ERROR;        
    }

    if( ESAM_encrypt_rand8() != OK )
    {
        return ERROR;        
    }

    if( IC_get_data_back(SEL_ESAM, 8) != OK )
    {
        return ERROR;      
    }

    memcpy( IC_ESAM_ENCRYPT_DATA, &Cpu_card_comm.Serial_Buffer[1], 8 );
    if( IC_external_auth() != OK )
    {
        return ERROR;
    }

    return OK;
}

void ICCardPolling(void)
{
    unsigned char cd_code = OK, *recv_buf;
    unsigned char read_len, err_num = 0;

    recv_buf = &Cpu_card_comm.Serial_Buffer[1];
    CPU_CARD_IC_DIR = IC_IO_DIR_INPUT;
    if( CPU_CARD_IC ) 
    { 
        card_in_slot = 0;
        IC_Card_flag = 0;
        return;
    }
	
    if( card_in_slot ) return;
    card_in_slot = 1;
    //等待一段时间以消除干扰	
    Delay20ms(2);
    if( CPU_CARD_IC ) 
    { 
        card_in_slot = 0;
        IC_Card_flag = 0;
        return;
    }
	
BEGIN_CARD_PROC:
    ClrWdt();
    MemsetZero( cd_data, ICCARD_MAX_DLEN );	
    Cpu_card_comm.selectDevice = SEL_ESAM;
    CPUCardReset();
    CPU_card_read_response(RESET_RESPONSE_DATA_NUBER);
    if( Cpu_card_comm.FramePointer != RESET_RESPONSE_DATA_NUBER )
    {
        err_num++;
        if( err_num < MAX_READ_CARD_NUM )
        {
            goto BEGIN_CARD_PROC;
        }			
        else
        {
            cd_code = EPM_E__1;
            goto ICCard_End;
        }
    }

    Cpu_card_comm.selectDevice = SEL_CARD;
    CPUCardReset();
    CPU_card_read_response(RESET_RESPONSE_DATA_NUBER);
    if( Cpu_card_comm.FramePointer != RESET_RESPONSE_DATA_NUBER )
    {
        err_num++;
        cd_code = EPM_E__2;
        goto ICCard_End;
    }

    if( IC_get_ATR() != OK )
    {
        err_num++;
        cd_code = EPM_E__12;
        goto ICCard_End;
    }
		
    if( IC_select_file(SEL_TYPE_DF, 0x3f01) != OK )
    {
        err_num++;
        cd_code = EPM_E__9;
        goto ICCard_End;	
    }
	
#if 0
    if( ( cd_code = UNIC_ic_external_auth_proc() ) != OK )
    {
        cd_code = EPM_E__8;	
        goto ICCard_End;	
    }	
#endif	

    //读取主电表应用文件
    if( OK != IC_read_file( SEL_CARD, 1, 0, 3 ) )
    {
        err_num++;
        cd_code = EPM_E__4;
        goto ICCard_End;
    }

    if( ( recv_buf[0] != 0x68 ) )
    {
        err_num++;
        cd_code = EPM_E__27;
        goto ICCard_End;		
    }
	
    //判断是否为修改密钥卡
    if( recv_buf[1] == 0x06)
    {		
        goto Update_key;		
    }

    read_len = recv_buf[2];
    //如果文件内容过长,则异常退出	
    if( read_len > MAX_485_GPRS_UART_LEN )
    {	
        err_num++;		
        cd_code = EPM_E__18;
        goto ICCard_End;
    }
	
    Delay20ms(10);
    if( OK != IC_read_file(SEL_CARD, 1, 0, read_len + 5 ) )
    {
        err_num++;
        cd_code = EPM_E__4;
        goto ICCard_End;					
    }
	
    if( FRAME_END_FLAG != recv_buf[read_len + 4] )
    {
        err_num++;
        cd_code = EPM_E__27;
        goto ICCard_End;
    }
	
    //检查校验和
    if( recv_buf[read_len + 3] != GetSum( &recv_buf[1], read_len + 2 ) )
    {
        err_num++;
        cd_code = EPM_E__16;
        goto ICCard_End;
    }

Update_key:				
    cd_code = recv_buf[1];
    Delay20ms(10);	
    switch(cd_code)
    {
        case 0x02:/* 购电卡 - 有写卡操作 */            			
            IC_Card_flag |= IC_CARD_BUY;
            PlaySoundInfo( 3, (uchar *)&IC_SOUND_BUY[0] );
            cd_code = ic_refilling();
            break;

        case 0x04: /* 检查卡 */
            cd_code = ic_checking();
            break;

        case 0x06:/* 修改密钥卡 */
            cd_code = ic_updating_pwd();
            break;

        case 0x83:/* 设置卡 */
            IC_Card_flag |= IC_CARD_CLR;
            PlaySoundInfo( 4, (uchar *)&IC_SOUND_CLR[0] );
            cd_code = ic_setting();
            break;
			
        default:
            cd_code = EPM_E__4;
            break;
    }
	
ICCard_End:
    if( cd_code != OK )
    {
        err_num++;
        if( err_num < MAX_READ_CARD_NUM )
        {
            goto BEGIN_CARD_PROC;
        }
        else
        {
            if( IC_Card_flag & IC_CARD_BUY )
            {
                /* 购电失败*/
                PlaySoundInfo( 1, (uchar *)&IC_SOUND_BUY_ERR[0] );
            }
            else
            {
                /* 无法识别卡*/
                PlaySoundInfo( 1, (uchar *)&IC_SOUND_NOT_IDENTIFY[0] );
            }
        }
    }
    else
    {	
        if( IC_Card_flag & IC_CARD_CLR )
        {
            /* 已完成清零*/
            PlaySoundInfo( 1, (uchar *)&IC_SOUND_CLR_OK[0] );
        }
        else if( IC_Card_flag & IC_CARD_BUY )
        {
            /* 购电成功*/
            PlaySoundInfo( 1, (uchar *)&IC_SOUND_BUY_OK[0] );
            SoundData.play_ptr++;
            /* 播当前剩余电量*/
            PlaySoundPowerInfo(2);
        }
    }
    Delay20ms(10);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -