📄 sle4442.c
字号:
typedef unsigned char uchar;
typedef unsigned int uint;
#include "DELAY.h"
#include "io.h"
#define IC_IOSDA PINB.5 ///读卡引脚
/**********************************************************/
//启动4442卡
void sle4442_start(void)
{
IC_CLK_LOW();
delay_us(2); //delay_us
IC_RST_HIGH();
delay_us(4);
IC_IO_HIGH();
delay_us(4);
IC_RST_LOW();
delay_us(4);
IC_CLK_HIGH();
delay_us(4);
IC_IO_LOW();
delay_us(2);
}
/**********************************************************/
// 停止4442卡
void sle4442_stop(void)
{
IC_CLK_LOW();
IC_IO_LOW();
delay_us(4);
IC_CLK_HIGH();
delay_us(4);
IC_IO_HIGH();
delay_us(4);
}
/**********************************************************/
//时钟
sle4442_wait_clk(uchar count)
{
IC_CLK_LOW();
delay_us(2);
IC_IO_LOW();
delay_us(2);
do
{
IC_CLK_HIGH();
delay_us(2);
IC_CLK_LOW();
delay_us(2);
}while(count--);
IC_IO_HIGH();
}
/**********************************************************/
//写4442卡,一个字节
void sle4442_wb(uchar datas)
{
uchar i;
for(i=0;i<8;i++)
{
IC_CLK_LOW();
delay_us(4);
if(datas & 0x01)
{
IC_IO_HIGH();
}
else
{
IC_IO_LOW();
}
delay_us(4);
IC_CLK_HIGH();
delay_us(4);
datas = datas >> 1;
}
}
/**********************************************************/
//读4442卡,一个字节
uchar sle4442_rb(void)
{
uchar i,return_code;
return_code = 0x00;
IC_IO_DIR = INPUT;
for(i=0;i<8;i++)
{
return_code = return_code >> 1;
IC_CLK_LOW();
delay_us(4);
IC_CLK_HIGH();
delay_us(4);
if(IC_IOSDA) // 从PINB。5输入
return_code = return_code | 0x80;
}
return return_code;
}
/**********************************************************/
//发送3个字节命令 控制字,地址,数据
void sle4442_command(uchar cmd,uchar addr,uchar datas)
{
sle4442_wb(cmd);
sle4442_wb(addr);
sle4442_wb(datas);
}
/**********************************************************/
//写4442卡
uchar sle4442_write_byte(uchar dat,uchar addr)
{
if(addr<32) return 1;
sle4442_start();
sle4442_command(0x38,addr,dat);
sle4442_stop();
sle4442_wait_clk(255);
return 1;
}
/**********************************************************/
//读4442数据块程序 数据指针,数据个数,地址
void sle4442_read_block(uchar *buffer,uchar data_len,uchar addr)
{
uchar i;
sle4442_start(); //启动4442卡
sle4442_command(0x30,addr,0x00); //
sle4442_stop();
for(i=0;i<data_len;i++) //
buffer[i] = sle4442_rb(); //
}
/**********************************************************/
uchar sle4442_rdEC(void)
{
sle4442_start();
sle4442_command(0x31,0x00,0x00);
sle4442_stop();
return (sle4442_rb());
}
/**********************************************************/
uchar sle4442_vPSC(uchar p1,uchar p2,uchar p3)
{
uchar e_code;
e_code = sle4442_rdEC();
if(e_code == 0) return 1;
if(e_code ==0x07) e_code = 0x06;
else if(e_code ==0x06) e_code = 0x04;
else if(e_code ==0x04) e_code = 0x00;
sle4442_start();
sle4442_command(0x39, 0x00,e_code);
sle4442_stop();
sle4442_wait_clk(255);
sle4442_start();
sle4442_command(0x33, 0x01,p1);
sle4442_stop();
sle4442_wait_clk(8);
sle4442_start();
sle4442_command(0x33, 0x02,p2);
sle4442_stop();
sle4442_wait_clk(8);
sle4442_start();
sle4442_command(0x33, 0x03,p3);
sle4442_stop();
sle4442_wait_clk(8);
sle4442_start();
sle4442_command(0x39, 0x00,0xff);
sle4442_stop();
sle4442_wait_clk(124);
e_code = sle4442_rdEC();
if(e_code==0x07) return 0;
else return 1;
}
/**********************************************************/
//复位与应答
//0xa2, 0x13, 0x10, 0x91
uchar sle4442_reset_answer(void)
{
uchar buf[4];
IC_RST_HIGH();
delay_us(4);
IC_CLK_HIGH();
delay_us(4);
IC_CLK_LOW();
delay_us(4);
IC_RST_LOW();
buf[0] = sle4442_rb();
buf[1] = sle4442_rb();
buf[2] = sle4442_rb();
buf[3] = sle4442_rb();
if(buf[0]!=0xa2) return 1;
if(buf[1]!=0x13) return 1;
if(buf[2]!=0x10) return 1;
if(buf[3]!=0x91) return 1;
return 0;
}
/**********************************************************/
uchar ic_check(void) //检查是否有卡
{
uchar status;
status = sle4442_reset_answer();
if(status !=0x00) return 1;
status = sle4442_vPSC(PS1,PS2,PS3);
return status;
}
/**********************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -