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

📄 1507op1104_avr.c

📁 华虹TYPEA射频芯片1507的控制程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	SendLPT(BCNR,0x10);//接收bit数
	SendLPT(TOC,0x0a);//超时计数器,超时长度=151us*TOC

	SendLPT(DATAREG,0x26);//寻卡指令

	status = DVStatus();//等待dv弹起			
	SendLPT(TOC,0x00);//停止toc

	if(status & TE_1507)	return TE_1507;//超时
	if(status & BE_1507)	return BE_1507;//数据长度

	outbuf[0] = RcvLPT(DATAREG);
	outbuf[1] = RcvLPT(DATAREG);

	return OK;
}


/******************************************/
//函数:Wupa_04
//说明:卡片唤醒指令,返回2字节寻卡返回值
/******************************************/
uchar Wupa_04(uchar *outbuf)
{
	uchar status;	
	
	SendLPT(GAINCTR,0x07);//接收增益

	SendLPT(TRANS0L,0x00);//设为100%调制模式
	SendLPT(TRANS0H,0x00);
	SendLPT(TRANS1L,0xff);
	SendLPT(TRANS1H,0xff);

	SendLPT(RFSEL,0x0);//使能数字和模拟部分
	SendLPT(BAUDRAT,0x0e);//设置速率106kbps
	SendLPT(MODE,0xc1);//设置nPause宽度
	SendLPT(RCODE,0x03);//设置解码

	SendLPT(STACON,0x8c);//复位CDM,选择TYPEA模式
	SendLPT(STACON,0x0c);

	Delay_1ms(1);	

	SendLPT(ENABLE,0xc1);//复位各错误标识

	SendLPT(BCNS,0x07);//发送bit数
	SendLPT(BCNR,0x10);//接收bit数
	SendLPT(TOC,0x0a);//超时计数器,超时长度=151us*TOC

	SendLPT(DATAREG,0x52);//卡片唤醒指令

	status = DVStatus();//等待dv弹起			
	SendLPT(TOC,0x00);//停止toc

	if(status & TE_1507)	return TE_1507;//超时
	if(status & BE_1507)	return BE_1507;//数据长度

	outbuf[0] = RcvLPT(DATAREG);
	outbuf[1] = RcvLPT(DATAREG);

	return OK;
}

/******************************************/
//函数:Antcollision_04
//说明:抗冲突指令,返回4字节卡号及1字节XOR
/******************************************/
uchar Antcollision_04(uchar *outbuf)
{
	uchar status,xor,i;
		
	SendLPT(STACON,0x8c);//复位CDM,选择TYPEA模式,
	SendLPT(STACON,0x0d);//打开抗冲突
	SendLPT(ENABLE,0xc1);//复位各错误标识

	SendLPT(BCNS,0x10);//发送bit数		
	SendLPT(TOC,0x0a);//超时计数器,超时长度=151us*TOC

	SendLPT(DATAREG,0x93);//抗冲突指令
	SendLPT(DATAREG,0x20);

	status = DVStatus();//等待dv弹起			
	SendLPT(TOC,0x00);//停止toc
	SendLPT(STACON,0x0c);//关闭抗冲突

	if(status & TE_1507)	return TE_1507;//超时
	if(status & BE_1507)	return BE_1507;//数据长度
	
	for(i=0,xor=0;i<5;i++){
		outbuf[i] = RcvLPT(DATAREG);
		xor ^= outbuf[i];
	}

	if(xor)	return XE_1507;

	return OK;
}

/******************************************/
//函数:SelectCard_04
//说明:选卡指令,sn为卡号及xor,返回1字节SAK
/******************************************/
uchar SelectCard_04(uchar *sn, uchar *outbuf)
{
	uchar status;
		
	SendLPT(STACON,0x8c);//复位CDM
	SendLPT(STACON,0x0d);//打开抗冲突
	SendLPT(ENABLE,0xf1);//复位各错误标识,打开crc校验

	SendLPT(BCNS,0x38);//发送bit数	
	SendLPT(BCNR,0x08);//接收bit数	
	SendLPT(TOC,0x0a);//超时计数器,超时长度=151us*TOC

	SendLPT(DATAREG,0x93);//选卡指令
	SendLPT(DATAREG,0x70);
	SendLPT(DATAREG,sn[0]);
	SendLPT(DATAREG,sn[1]);
	SendLPT(DATAREG,sn[2]);
	SendLPT(DATAREG,sn[3]);
	SendLPT(DATAREG,sn[4]);

	status = DVStatus();//等待dv弹起			
	SendLPT(TOC,0x00);//停止toc
	SendLPT(STACON,0x0c);//关闭抗冲突

	if(status & TE_1507)	return TE_1507;//超时
	if(status & BE_1507)	return BE_1507;//数据长度错误
	if(status & CE_1507)	return CE_1507;//CRC错误

	outbuf[0] = RcvLPT(DATAREG);

	return OK;
}

/******************************************/
//函数:LoadKey_04
//说明:加载密钥指令
//参数:keytype:0指定keyA,1指定keyB
//      key:6字节密钥
/******************************************/
uchar LoadKey_04(uchar keytype,uchar *key)
{
	uchar i,temp;

	if(keytype)	keytype = 0x01;//保证keytype的值仅为0/1

	SendLPT(KEYSTAC,0x40);//以SHC1101方式加载密钥
	SendLPT(KEYADR,(keytype<<6));//设定密钥加载地址
	for(i=0;i<6;i++){
		memcpy_P(&temp,TransKey1507,6);
		SendLPT(KEYDATA,temp);//加载SHC1507传输密钥
	}
	for(i=0;i<6;i++)	SendLPT(KEYDATA,key[i]);//加载卡密钥
	if( RcvLPT(STACON) & AE_1507 )	return AE_1507;//认证错

	return OK;
}

/******************************************/
//函数:Authen_04
//说明:认证指令
//参数:keytype:0指定keyA,1指定keyB
//      blknum:被认证块号
/******************************************/
uchar Authen_04(uchar keytype,uchar blknum)
{
	uchar status;

	if(keytype)	keytype = 0x01;//保证keytype仅为0/1
	
	SendLPT(STACON,0x8c);//复位CDM
	SendLPT(STACON,0x0c);
	SendLPT(ENABLE,0xf1);//复位各错误标识,打开crc校验

	SendLPT(KEYSTAC,0xc0);//以SHC1101方式加载密钥		
	SendLPT(KEYADR,(keytype<<6));//取卡密钥

	SendLPT(BCNS,0x10);//发送bit数	
	SendLPT(BCNR,0x08);//接收bit数	
	SendLPT(TOC,0x30);//超时计数器,超时长度=151us*TOC

	SendLPT(DATAREG,0x60|keytype);//认证指令
	SendLPT(DATAREG,blknum);//块地址

	status = DVStatus();//等待dv弹起			
	SendLPT(TOC,0x00);//停止toc

	if(status & TE_1507)	return TE_1507;//超时
	if(status & BE_1507)	return BE_1507;//数据长度错误
	if(status & AE_1507)	return AE_1507;//认证错误
	if(status & PE_1507)	return PE_1507;//奇偶校验错误

	return OK;
}


/******************************************/
//函数:Read_04
//说明:读卡指令
//参数:blknum:块号
//      outbuf:保存16字节返回值
/******************************************/
uchar Read_04(uchar blknum, uchar *outbuf)
{
	uchar i,status;
	
	SendLPT(BCNS,0x10);//发送bit数	
	SendLPT(BCNR,0x80);//接收bit数	
	SendLPT(TOC,0x30);//超时计数器,超时长度=151us*TOC
	
	SendLPT(DATAREG,0x30);//读卡指令
	SendLPT(DATAREG,blknum);//块地址

	status = DVStatus();//等待dv弹起			
	SendLPT(TOC,0x00);//停止toc

	if(status & TE_1507)	return TE_1507;//超时
	if(status & BE_1507)	return BE_1507;//数据长度错误
	if(status & CE_1507)	return CE_1507;//认证错误
	if(status & PE_1507)	return PE_1507;//奇偶校验错误

	for(i=0;i<0x10;i++)	outbuf[i] = RcvLPT(DATAREG);

	return OK;	
}

/******************************************/
//函数:Write_04
//说明:写卡指令
//参数:blknum:块号
/******************************************/
uchar Write_04(uchar blknum, uchar *inbuf)
{
	uchar i,status;

	SendLPT(BCNS,0x10);//发送bit数	
	SendLPT(BCNR,0x04);//接收bit数	
	SendLPT(TOC,0x1f);//超时计数器,超时长度=151us*TOC
	
	SendLPT(DATAREG,0xa0);//写卡指令
	SendLPT(DATAREG,blknum);//块地址

	status = DVStatus();//等待dv弹起			
	SendLPT(TOC,0x00);//停止toc

	if(status & TE_1507)	return TE_1507;//超时
	if(status & BE_1507)	return BE_1507;//数据长度错误

	if( (RcvLPT(DATAREG)|0x0f) != 0x0a )	return RE_1507;

	//-------------//

	SendLPT(BCNS,0x80);//发送bit数	
	SendLPT(BCNR,0x04);//接收bit数	
	SendLPT(TOC,0x5f);//超时计数器,超时长度=151us*TOC
	
	for(i=0;i<0x10;i++)	SendLPT(DATAREG,inbuf[i]);//写数据

	status = DVStatus();//等待dv弹起			
	SendLPT(TOC,0x00);//停止toc

	if(status & TE_1507)	return TE_1507;//超时
	if(status & BE_1507)	return BE_1507;//数据长度错误

	if( (RcvLPT(DATAREG)|0x0f) != 0x0a )	return RE_1507;

	return OK;	
}


/******************************************/
//函数:Halt_04
//说明:停卡指令
/******************************************/
uchar Halt_04(void)
{
	uchar status;

	SendLPT(BCNS,0x10);//发送bit数	
	SendLPT(BCNR,0x04);//接收bit数	
	SendLPT(TOC,0x0a);//超时计数器,超时长度=151us*TOC

	SendLPT(DATAREG,0x50);//停卡指令
	SendLPT(DATAREG,0x00);

	status = DVStatus();//等待dv弹起			
	SendLPT(TOC,0x00);//停止toc

	if(status & TE_1507)	return OK;//卡片无返回,指令成功
	
	return RE_1507;//返回错误

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -