⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sum1356.c

📁 这个是一个带有IC卡
💻 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 + -