📄 sle4442.c
字号:
//******************************************************************************//
//**模块名:SLE4442.C
//**模块说明:此库是读写SLE4442的驱动函数;读主存储区函数中的数据存放是以字的形式存放,
//** 拼装方式如下:
//** word 0 word 1
//** __________________________ ___________________________
//** | byt1 | byte0 |,| byte3 | byte2 |.............
//** -------------------------- ----------------------------
//**
//**模块修改记录:
//**
//**
//**编写:王鲲 2007-11-23 wangkun@yifengcom.com
//**版权:江苏怡丰通信设备有限公司开发部
//******************************************************************************//
#include "..\Include\Include.h"
/*******************************************************************************
* interface routines
*******************************************************************************/
/*******************************************************************************
*函 数 名: SLE4442_Card_Init()
*功 能: SLE4442卡初始化
*说 明:
*调 用:
*入口参数: 无
*返 回 值: 无
********************************************************************************/
void SLE4442_Card_Init(void)
{
MEMO_CTL_dir = OUTPUT;
MEMO_CTL = 1;
IC_CLK_dir = OUTPUT;
IC_RST_dir = OUTPUT;
IC_RST = RES_LOW;
}
void SLE4442_Card_End(void)
{
MEMO_CTL_dir = OUTPUT;
MEMO_CTL = 0;
IC_RST = RES_LOW;
}
/*******************************************************************************
*函 数 名: StartComm()
*功 能: 开始命令模式
*说 明: ____________
* CLK ______/
* ___________
* IO \_______
*调 用:
*入口参数: 无
*返 回 值: 无
*******************************************************************************/
void StartComm(void)
{
IC_IO_dir = OUTPUT;
IC_CLK = 0;
IC_IO = 1;
Delay10us();
IC_CLK = 1;
Delay5us();
IC_IO = 0;
Delay5us();
IC_CLK = 0;
}
/*******************************************************************************
*函 数 名: StopComm()
*功 能: 结束命令模式
*说 明: _____________
* Clk ______/
* _______
* IO _____________/
*调 用:
*入口参数: 无
*返 回 值: 无
*******************************************************************************/
void StopComm(void)
{
IC_IO_dir = OUTPUT;
IC_CLK = 0;
IC_IO = 0;
Delay5us();
IC_CLK = 1;
Delay5us();
IC_IO = 1;
Delay10us();
}
/*******************************************************************************
*函 数 名: ResetCard()
*功 能: 卡复位和复位应答
*说 明: 复位和复位应答时序 空读 32Bit (4Byte)
* ___
* RST _| |______________________________
* _ _ __ __
* CLK __|0|_|1|_ ..._|31|_|32|____________
* _ __ __ ___ ___________
* \/ \/D0\ ... \/D31\/
* I/O _/\__/\__/ /\___/
*调 用: ReadByte(),Delay10us(),Delay5us()
*入口参数: 无
*返 回 值: 无
*******************************************************************************/
U16 ResetCard(void)
{
U16 temp[4]={0};
IC_IO_dir = INPUT;
Delay10us();
IC_RST = RES_LOW;
IC_CLK = 0;
// IC_IO = 1;
Delay10us();
IC_RST = RST_HIGH;
Delay5us();
IC_CLK = 1;
Delay10us();
Delay10us();
Delay10us();
Delay10us();
IC_CLK = 0;
Delay5us();
IC_RST = RES_LOW; //复位和复位应答时序
// Delay5us();
temp[0] = ReadByte();
temp[1] = ReadByte();
temp[2] = ReadByte();
temp[3] = ReadByte(); //空读 32Bit (4Byte)
IC_CLK = 0;
Delay10us();
return (temp[0]+temp[1]+temp[2]+temp[3]);
}
/*******************************************************************************
*函 数 名: BreakOperate()
*功 能: SLE4442 IC卡操作中止
*说 明:
*调 用: Delay10us()
*入口参数: 无
*返 回 值: 无
********************************************************************************/
void BreakOperate(void)
{
IC_IO_dir = OUTPUT;
IC_CLK = 0;
IC_RST = RES_LOW;
IC_IO = 0;
Delay10us();
IC_RST = RST_HIGH;
IC_IO = 1;
Delay10us();
IC_RST = 0;
Delay10us();
}
/********************************************************************************
*函 数 名: ReadByte()
*功 能: 从SLE4442读一个字节
*说 明:
*调 用: Delay10us()
*入口参数: 无
*返 回 值: Rdata:读出的数据
*********************************************************************************/
U16 ReadByte(void)
{
U16 i,Rdata;
Gen_Type_Def data;
data.Word = 0;
IC_IO_dir = INPUT;
for (i = 0; i < 8; i++)
{
IC_CLK = 0;
data.Word = data.Word >> 1; //从低位读起
data.Bits.bit7 = IC_IO;
Delay10us();
IC_CLK = 1;
Delay10us();
}
IC_CLK = 0;
Rdata = data.Word;
return Rdata;
}
/*********************************************************************************
*函 数 名: WriteByte()
*功 能: 往SLE4442写一个字节
*说 明:
*调 用: Delay10us(),Delay5us()
*入口参数: Wdata:写入的数据
*返 回 值: 无
**********************************************************************************/
void WriteByte(U16 Wdata)
{
U16 i;
Gen_Type_Def data;
data.Word = Wdata;
IC_IO_dir = OUTPUT;
for(i = 0; i < 8; i++)
{
IC_CLK = 0;
Delay5us();
IC_IO = data.Bits.bit0;
Delay5us();
IC_CLK = 1;
Delay10us();
data.Word = data.Word >> 1; //右移一位
}
IC_CLK = 0;
}
/********************************************************************************
*函 数 名: ReadMode()
*功 能: 连续输出i(=<255)个字节,存放到以ReadBuffer开头的指针中,必须在某一
* 读数据命令模式之后使用
*说 明:
*调 用: Delay10us(),ReadByte()
*入口参数: ReadBuffer:读取数据的起始地址,ReadCount:数据个数
*返 回 值: 无
*********************************************************************************/
void ReadMode(U16 *ReadBuffer,U16 ReadCount)
{
IC_CLK=0;
Delay10us();
do
{
*ReadBuffer = ReadByte(); //读入一个字节
ReadBuffer++; //指针加一
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -