📄 sle4442.c
字号:
}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 + -