📄 sum1356.c
字号:
#include "config.h"
#include"xor.h"
#define __SRC
#include"SUM1356.h"
#undef __SRC
uint8 ReadOut_SUM1356_DataBuf[16]={ 0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0
};
uint8 WriteIn_SUM1356_DataBuf[16]={ 0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0};
//EXTERN uint8 data_buf_SUM1356[30];
uint8 SUM1356_COM_Sleep[2+1]={0x02,0x12,0x10};
uint8 SUM1356_COM_SearchCard[3+1]={0x03,0x20,0x00,0x23};
uint8 SUM1356_COM_ReadBlock[10+1]=
{0x0a, 0x21, 0x00, 0x04, 0xff,0xff,0xff,0xff,0xff,0xff, 0x00};
/// 字长, 命令字,密码标识, 块地址, 6字节密码, 校验字(在使用的时候要经过计算)
uint8 SUM1356_COM_WriteBlock[26+1]=
{0x1a, 0x22, 0x00, 0x04, 0xff,0xff,0xff,0xff,0xff,0xff,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00};
//字长, 命令字,密码标识, 块地址, 6字节密码,
//16字节数据
//1字节的校验字
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
void Init_SUM1356_CheckPIN(void)
{
PINSEL0 = (PINSEL0&0xfffffcff) |(0x00<<8); //选择P0.4为GPIO
IO0DIR = (IO0DIR&(~(0x01<<4)))|(0x00<<4); //为输入口
}
uint8 Check_SUM1356_IN_ATAN(void)
{
if((IO0PIN&(0x01<<4))!=0)//当脚不为0时返回1
{
return 1;
}
else
{//表示有卡,同时,检测脚的电平也为0
return 0;
}
}
uint8 Read_SUM1356_Block(uint8 * pData,uint8 blockNUM)
{
uint8 DataBufTMP[50],i,rtn;
rtn=0;
for(i=0;i<50;i++)
{
DataBufTMP[i]=0;
}
SUM1356_COM_ReadBlock[3]=blockNUM;
SUM1356_COM_ReadBlock[10]=XOR_Canculate(SUM1356_COM_ReadBlock,10);//计算得到最后一个字节的校验值
Send_n_Byte(ADDR_SUM1356,SUM1356_COM_ReadBlock,10+1);
//发送读的命令
Delay_n10MS_forSUM1356(16);
//这个延时时间很重要,不然会导致程序对模块的读写不正确
IRcv_n_Byte(ADDR_SUM1356,DataBufTMP,18+1);
//读取块内容
if((XOR_Canculate(DataBufTMP,18+1)==0)&&(DataBufTMP[0]==0x12))//校验正确,并且是正确的返回
{
for(i=0;i<16;i++)
{
*(pData+i)=DataBufTMP[2+i];
}
rtn=1;//返回成功
}
else
{
rtn=0;//返回错误
}
return rtn;
}
uint8 Write_SUM1356_Block(uint8 *pData,uint8 blockNUM)
{
uint8 DataBufTMP[50],i,rtn;
rtn=0;
for(i=0;i<50;i++)
{
DataBufTMP[i]=0;
}
SUM1356_COM_WriteBlock[3]=blockNUM;
for(i=0;i<16;i++)
{
SUM1356_COM_WriteBlock[10+i]=*(pData+i);
}
SUM1356_COM_WriteBlock[26]=XOR_Canculate(SUM1356_COM_WriteBlock,26);//计算得到最后一个字节的校验值
Send_n_Byte(ADDR_SUM1356,SUM1356_COM_WriteBlock,26+1);
//发送读的命令
Delay_n10MS_forSUM1356(16);
//这个延时时间很重要,不然会导致程序对模块的读写不正确
IRcv_n_Byte(ADDR_SUM1356,DataBufTMP,2+1);
//读取块内容
if((XOR_Canculate(DataBufTMP,2+1)==0)&&(DataBufTMP[1]==0x22))//校验正确,并且是正确的返回
{
rtn=1;//返回成功
}
else
{
rtn=0;//返回错误
}
}
uint8 Search_SUM1356(void)
{
uint8 DataBufTMP[10];
uint8 rtn;
Send_n_Byte(ADDR_SUM1356,SUM1356_COM_SearchCard,3+1);
Delay_n10MS_forSUM1356(10);
IRcv_n_Byte(ADDR_SUM1356,DataBufTMP,6+1);
if((XOR_Canculate(DataBufTMP,6+1)==0)&&(DataBufTMP[0]==0x06))//校验正确,并且是正确的返回
{
rtn=1;//返回成功
}
else
{
rtn=0;//返回错误
}
return rtn;
}
uint8 Sleep_SUM1356(void)
{
Send_n_Byte(ADDR_SUM1356,SUM1356_COM_Sleep,2+1);
Delay_n10MS_forSUM1356(2);
}
void Delay_n10MS_forSUM1356(uint32 n)
{ uint32 i;
for(; n>0; n--)
for(i=0; i<1100; i++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -