📄 siemens_ic_sle4442.c
字号:
#define Siemens
//#include <at89x52.h>
#include "head.h"
uchar code Password_Bass[3]={0xad,0x6e,0x46};
//void nop(void);
void SendComm(uchar a,uchar b,uchar c); //发送命令
void ReadMode(uchar idata *pt,uchar count);
uchar ResetCard(void);
void BreakOperate(void);
void StartComm(void);
void StopComm(void);
uchar ReadByte(void);
void WriteByte(uchar ch);
void Delay10us(void);
void Delay5us(void);
void ReadMainMem(uchar addr,uchar idata *pt,uchar count);
void ReadSafeMemory(uchar *p);
void WriteSafeMemory(uchar Address,uchar Data);
uchar VerifyPassword(uchar *p);
void CalculatePassword(uchar *p);
void Process(uchar i);
uchar ResetCard(void)
{
uchar temp;
Delay5us();
card_rest = 0;
card_clk = 0;
card_dat = 1;
Delay5us();
Delay10us();
Delay10us();
card_rest = 1;
Delay5us();
card_clk = 1;
Delay10us();
Delay10us();
Delay10us();
Delay10us();
card_clk = 0;
Delay5us();
card_rest = 0;
Delay10us();
temp=ReadByte();
if(temp==0xa2)
{
temp = ReadByte();
temp = ReadByte();
temp = ReadByte();
card_clk = 0;
Delay5us();
card_dat = 1;
Delay5us();
card_clk = 0;
Delay5us();
return Siemens_IC_Sel4442;
}
else
{
return ATMEL_IC_24C01;
}
}
//-------------------------------------------------------------------------------------
// 函数名称: BreakOperate
// 函数功能: 停止操作
//-----------------------------------------------------------------------------------
void BreakOperate(void)
{
card_clk = 0;
card_rest = 0;
card_dat = 0;
Delay5us();
card_rest = 1;
card_dat = 1;
Delay5us();
card_rest = 0;
Delay5us();
//CT_PW = 1;
}
//------------------------------------------------------------------------------------
// 函数名称: StartComm()
// 函数功能: 启动I2C总线子程序
//-----------------------------------------------------------------------------------
void StartComm(void)
{
card_clk = 0;
card_dat = 1;
Delay5us();
card_clk = 1;
Delay5us();
card_dat = 0;
Delay5us();
}
//-------------------------------------------------------------------------------
// 函数名称: StopComm()
// 函数功能: 停止I2C总线数据传送子程序
//-----------------------------------------------------------------------------
void StopComm(void)
{
card_clk = 0;
card_dat = 0;
Delay5us();
card_clk = 1; //CLK: H
Delay5us();
card_dat = 1; //IO : H
Delay10us();
}
//-----------------------------------------------------------------------------------
// 函数名称: ReadByte
// 返回接收的数据
// 函数功能: 接收一字节子程序
//-----------------------------------------------------------------------------------
uchar ReadByte(void)
{
uchar i,ch;
ch = 0;
for (i = 0; i != 8; i++)
{
card_clk = 0;
ch = ch >> 1; //从低位读起
if((uchar)card_dat)
ch |= 0x80;
else ch &= 0x7f;
Delay5us();
card_clk = 1;
Delay5us();
}
Delay10us();
Delay10us();
return ch;
}
//----------------------------------------------------------------------------------
// 函数名称: WriteByte
// 入口参数: ch
// 函数功能: 发送一个字节
//------------------------------------------------------------------------------------
void WriteByte(uchar ch)
{
uchar i;
for(i = 8; i > 0; i--)
{
card_clk = 0;
card_dat = (bit)(ch & 0x01);
Delay5us();
card_clk = 1;
Delay10us();
ch = ch >> 1; //右移一位
}
}
//-------------------------------------------------------------------------------------
// 函数名称: ReadMode
// 入口参数: pt地址指针,指向接收缓冲区,count要接收的数据个数
// 函数功能: 接收n位数据子程序
//----------------------------------------------------------------------------------
void ReadMode(uchar idata *pt,uchar count)
{
//card_clk=0;
//StartComm();
//Delay5us();
do
{
*pt = ReadByte(); //读入一个字节
pt++; //指针加一
}while(--count); //计数器减一,判断
}
//------------------------------------------------------------------------
// 延时10us子程序,根据系统时钟需要调整
//------------------------------------------------------------------------
void Delay10us(void)
{
feed_dog();;;;;
}
//------------------------------------------------------------------------
// 延时5us子程序,根据系统时钟需要调整
//------------------------------------------------------------------------
void Delay5us(void)
{
feed_dog();
}
//******************处理过程**************//
void Process(uchar i)
{
//card_dat = 1;
card_clk = 0;
Delay5us();
card_dat = 0;
Delay5us();
for(;i>0;i--)
{
card_clk=1;
Delay5us();
card_clk = 0;
Delay5us();
}
card_dat = 1;
Delay5us();
card_clk=1;
Delay5us();
card_clk = 0;
Delay5us();
}
//---------------------------------------------------------------------------------
// 函数名称: ReadMainMem()
// 入口参数: addr: IC存储区地址;
// pt: 地址指针,指向接收缓冲区;
// count: 接收数据的个数
// 函数功能: 读存储区
//-----------------------------------------------------------------------------------
void ReadMainMem(uchar addr,uchar idata *pt,uchar count)
{
SendComm(RMM_COMM,addr,0xff);
ReadMode(pt,count);
BreakOperate();
}
void WriteMainMem(uchar addr,uchar idata *pt)
{
SendComm(WMM_COMM,addr,*pt);
Process(0xff);
}
//---------------------------------------------------------------------------------
// 函数名称: VerifyPassword()校验密码
// 入口参数:
// p: 地址指针,指向密码存储区;
// 出口参数: 0:失败 1:成功
// 函数功能: 读存储区
//-----------------------------------------------------------------------------------
uchar VerifyPassword(uchar *p)
{
uchar temp[4];//暂存4字节保护密码;
uchar i;
ResetCard();
ReadSafeMemory(temp);//读安全代码以取得错误计数器
if((temp[0]&0x07)!=0)
{if((temp[0]&0x07)==0x07) i=0x06;
if((temp[0]&0x07)==0x06) i=0x04;
if((temp[0]&0x07)==0x04) i=0x00;
WriteSafeMemory(0,i);
for(i=1;i<4;i++,p++)
{
SendComm(0x33,i,*p);
Process(0x02);
}
WriteSafeMemory(0,0xff);
ReadSafeMemory(temp);
if((temp[0]&0x07)==0x07) return(0x1);
}
return(0);
}
/**************读安全存储器************/
void ReadSafeMemory(uchar *p)
{
uchar i;
SendComm(0x31,0xff,0xff);
for(i=0;i<4;i++)
{*p=ReadByte();
p++;}
}
/*************写安全存储器***************/
void WriteSafeMemory(uchar Address,uchar Data)
{
SendComm(0x39,Address,Data);//Address=0,1,2,3
Process(0xff);
}
//-----------------------------------------------------------------------------
// 函数名称: SendComm()
// 入口参数: a: 命令字;
// b: 地址;
// c: 数据
// 函数功能: 发送一个完整的命令
//-------------------------------------------------------------------------------
void SendComm(uchar a,uchar b,uchar c)
{
StartComm(); //开始发送命令
WriteByte(a); //a: 发命令字
WriteByte(b); //b: 发地址
WriteByte(c); //c: 发数据
StopComm(); //结束发送命令
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -