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

📄 sle4442.c

📁 SLE4442卡的底层驱动函数
💻 C
📖 第 1 页 / 共 2 页
字号:
    }while(--ReadCount);             //计数器减一,判断
//    IC_IO  = 1; 
//    IC_IO_dir = input;
}

/********************************************************************************  
*函 数 名: ProcessMode()
*功    能: 处理模式,开始处理模式后,卡片将输入口拉低,处理完后输入口变成高电平
*说    明: 
*调    用: Delay10us()
*入口参数: 无
*返 回 值: 无
*********************************************************************************/
void ProcessMode(void)
{
    U16 i;
       
    IC_IO_dir = OUTPUT;
    IC_CLK = 1;    
    IC_IO  = 1;       
    Delay10us();
    IC_CLK = 0;    
    IC_IO  = 0;
    for (i = 0; i < 255; i++)
    {
        IC_CLK = 1;
        Delay10us();
        IC_CLK = 0;
        Delay10us();
    }
    IC_CLK = 1;
    IC_IO  = 1; 
    IC_IO_dir = INPUT;
}

/*********************************************************************************  
*函 数 名: SendComm()
*功    能: 发送命令
*说    明:
*调    用: StartComm(),WriteByte(),StopComm()
*入口参数: Control:命令字,Address:地址,data:发送数据
*返 回 值: 无
**********************************************************************************/
void SendComm(U16 Control,U16 Address,U16 data)
{
    StartComm();            //开始发送命令
    WriteByte(Control);     //Control: 发命令字
    WriteByte(Address);     //Address: 发地址
    WriteByte(data);        //data: 发数据
    StopComm();             //结束发送命令
}

/*********************************************************************************  
*函 数 名: SLE4442_ReadMainMem()
*功    能: 读SLE4442卡主存储区
*说    明: 
*调    用: ResetCard(),SendComm(),ReadMode(), BreakOperate()
*入口参数: Address:写入的地址,Readbuffer:读取数据的首地址,ReadCount:字节数 
*返 回 值: 无
**********************************************************************************/
void SLE4442_ReadMainMem(U16 Address,U16 *ReadBuffer,U16 ReadCount)
{
    U16 i,k;
    ResetCard();
    SendComm(RD_MAIN_RAM,Address,0xff);     //读主存储区命令字,地址,最后一个参数忽略
    ReadMode(ReadBuffer,ReadCount);             //读出
    BreakOperate();
    
    for(i = 0,k=0; i < ReadCount; i++)
    {
    	if(i%2)
    	{
            ReadBuffer[k++] = (ReadBuffer[i-1]&0x00ff) + (ReadBuffer[i]<<8);
    	}
    }
}

/*********************************************************************************  
*函 数 名: SLE4442_WriteMainMem()
*功    能: 写SLE4442卡主存储区,一次 1Byte
*说    明: 
*调    用: ResetCard(),SendComm(),ProcessMode(), BreakOperate()
*入口参数: Address:写入的地址,WriteBuffer:写入的数据 
*返 回 值: 无
*********************************************************************************/
void SLE4442_WriteMainMem(U16 Address,U16 WriteBuffer)
{
    ResetCard();
    SendComm(WR_MAIN_RAM,Address,WriteBuffer);     //写主存储区命令字,地址,数据
    ProcessMode(); 
    BreakOperate();    
}

/*********************************************************************************  
*函 数 名: SLE4442_ReadProtectMem()
*功    能: 读保护存储器
*说    明: 
*调    用: ResetCard(),SendComm(),ReadMode(),BreakOperate()
*入口参数: ReadBuffer:读取的数据
*返 回 值: 无:
*********************************************************************************/
void SLE4442_ReadProtectMem(U16 ReadBuffer[4])
{
    ResetCard();    
    SendComm(RD_PRO_RAM,0xff,0xff);       //读保护存储器的命令字,后两个参数忽略
    ReadMode(ReadBuffer,4);               //读出
    BreakOperate();        
}

/*********************************************************************************  
*函 数 名: SLE4442_WriteProtectMem()
*功    能: 写保护存储器
*说    明: 
*调    用: ResetCard(),SendComm(),ProcessMode(),BreakOperate()
*入口参数: Address:写入的地址;WriteBuffer:写入的数据
*返 回 值: 无:
*********************************************************************************/
void SLE4442_WriteProtectMem(U16 Address,U16 WriteBuffer)
{
	ResetCard();
	SendComm(WR_PRO_RAM,Address,WriteBuffer);     //写保护存储区命令字,地址,数据
	ProcessMode();
	BreakOperate();
}

/*********************************************************************************  
*函 数 名: SLE4442_ReadSecurityMem()
*功    能: 读密码存储区
*说    明: 
*调    用: ResetCard(),SendComm(),ReadMode(),BreakOperate()
*入口参数: ReadBuffer:读取的数据
*返 回 值: 无:
*********************************************************************************/
void SLE4442_ReadSecurityMem(U16 ReadBuffer[4])
{
	ResetCard();
	SendComm(RD_SEC_RAM,0xff,0xff);       //读密码存储区命令字,后两个参数忽略
	ReadMode(ReadBuffer,4);               //读出
	BreakOperate();	
}

/*********************************************************************************  
*函 数 名: SLE4442_WriteSecurityMem()
*功    能: 写密码存储区
*说    明: 
*调    用: ResetCard(),SendComm(),ProcessMode(),BreakOperate()
*入口参数: Address:地址,WriteBuffer:写入数据
*返 回 值: 无
*********************************************************************************/
void SLE4442_WriteSecurityMem(U16 Address,U16 WriteBuffer)
{
	ResetCard();
	SendComm(WR_SEC_RAM,Address,WriteBuffer);    //写密码存储区命令字,地址,数据
	ProcessMode();
	BreakOperate();	
}

/********************************************************************************  
*函 数 名: SLE4442_CompareVerifyData()
*功    能: 校验密码
*说    明: 
*调    用: SendComm(),ReadMode(),ProcessMode()
*入口参数: data:存放的密码
*          密码:BCD码,从低往高放,比如:114086 *data=0x11 *data+1=0x40 *data+2=0x86
*返 回 值: 成功返回1,失败返回0,卡已锁也返回0
*********************************************************************************/
U16 SLE4442_CompareVerifyData(U16 data[3])
{
     U16 buff[4],i;                       //暂存4字节的保密区内容
     
     SendComm(RD_SEC_RAM,0xff,0xff);      //读密码存储区的命令字,第2,3个参数在此命令中被忽略
     ReadMode(buff, 4);                   //读出
     
     if((buff[0] & 0x07) != 0)            //第一字节是错误计数器,如果错误计数器为0,直接退出
     {
         if((buff[0] & 0x07)==0x07)       // ****0111
                i = 0xfe;
         else if((buff[0] & 0x07)==0x03)  // ****0011 
                   i = 0xfc;
         else if((buff[0] & 0x07)==0x01)  // ****0001
                   i = 0xf8;              //将其中一位为1的改为0
        SendComm(WR_SEC_RAM,0,i);         //修改错误计数器
        ProcessMode();
                            
        for (i = 1; i < 4; i++)           //校对3字节的密码
        {
             SendComm(COMP_VER_RAM,i,data[i-1]);  //发出校对命令,
             ProcessMode();               
        }
        SendComm(WR_SEC_RAM,0,0xff);      //擦除错误计数器
        ProcessMode();                    
        SendComm(RD_SEC_RAM,0xff,0xff);   //读密码存储区的命令字,第2,3个参数在此命令中被忽略
        ReadMode(buff, 4);                //读错误计数器的内容
        if((buff[0] & 0x07)==0x07)        //如果没有被成功擦除,表明校对失败
        {
            return 1;
        }
     }
     return 0;
}

/*********************************************************************************  
*函 数 名: SLE4442_Card_test()
*功    能: 有无IC卡,及卡型检测
*说    明: 
*调    用: 
*入口参数: 
*返 回 值: 0:无卡或不是SLE4442卡,1:为SLE4442卡
*********************************************************************************/
U16 SLE4442_Card_test(void)
{	
	U16 testdata /* = 0x1581 */;
//	U16 buffer[1];
	
	SLE4442_Card_Init();
	testdata = ResetCard();
					
//	SLE4442_ReadMainMem(0x06,buffer,2);
	SLE4442_Card_End();
	if(testdata==(0xa2+0x13+0x10+0x91))
		return 1;
/* 	if(testdata == buffer[0])
		  return 1; */
	return 0;
}

/*********************************延时子程序*************************************/ 

void Delay5us(void)
{
	UTL_Delay_Cycle(142);
}

void Delay10us(void)
{
	UTL_Delay_Cycle(290);
}

⌨️ 快捷键说明

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