超高频:
3.2.1)
Inventory_G2
():G2询查命令
功能描述:
询查命令的作用是检查有效范围内是否有符合协议的电子标签存在。
应用:
Functionint
StaticClassReaderB.Inventory_G2(unsigned
char
*ComAdr,
unsigned
charAdrTID,unsigned
char
LenTID,unsigned
char
TIDFlag,unsigned
char
*EPClenandEPC,
int*Totallen,int
*CardNum,int
FrmHandle)
参数:
ComAdr:输入变量,读写器地址。
AdrTID:输入变量,询查TID的起始地址。
LenTID:输入变量,询查TID的字数。
TIDFlag:输入变量,询查TID的标志。
TIDFlag=1:询查TID。
TIDFlag=0:询查EPC。
EPClenandEPC:指向输出数组变量(输出的是每字节都转化为字符的数据)。是读到的电子标签的EPC数据,是一张标签的EPC长度+一张标签的EPC号,依此累加。每个电子标签EPC号高字在前,每一个字的最高位在前。
Totallen:输出变量,EPClenandEPC的字节数。
CardNum:输出变量,电子标签的张数。
FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以 *** 作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1。
返回:
如果该函数调用成功,返回值:
0x01
询查时间结束前返回
0x02
询查时间结束使得询查退出
0x03
如果读到的标签数量行告者无法在一条消息内传送完,将分多次发送。
0x04
还有电子标签未读取,电子标签数量太多,MCU存储不了
返回其他值,请查看其他返回值定义,返回的错误代码请查看错误代码定义。
高频15693协议:
3.2.13)
GetSystemInformation():获得电子标签的详细信息
功能描述:
执行该命令后,将获得指定的电子标签的详细信息,这其中包括Information
Flag,UID,DSFID,AFI,Memory,IC
reference的信息,具体信息内容以及数量与各生产厂家电子标签定义相关。
应用:
Function
int
StaticClassReaderA.GetSystemInformation(unsignedchar
*ComAdr,
unsigned
char
*State,
unsigned
char
*UIDI,
unsigned
char*InformationFlag,
unsigned
char
*UIDO,
unsigned
char
*DSFID,
unsigned
char*AFI,
unsigned
char
*MemorySize,
unsigned
char
*ICReference,unsigned
char
*ErrorCode,
int
FrmHandle)
参数:
ComAdr
:
输入变量,读写器地址
State:
输入变量,具体情况如下:
Addressed模式:0x00
Selected模式:0x01
UIDI:指档薯向输入数组变量,8个字节的电子标签的唯一识别号,低字节在前,当State为Addressed模式时,须给出此参数,当State为Selected模式时,此参数值忽略
InformationFlag:输出变量,电子标签信息指示数据
UIDO:指向输出数组变量,8个字节的电子标签UID数据
DSFID:输出变量,电子标签的数据保存格式识别码
AFI:输出变量,电子标签的应用类型识别码
MemorySize:指向输出数组变量,电友悔子标签的存储容量信息,长度2个字节,第1个字节表示电子标签内存储数据块的总数,第2个字节表示每个数据块的字节长度。
ICReference:输出变量
ErrorCode:输出变量,函数执行后的返回值为错误代码0x0f时,为进一步的错误说明代码,其它情况下保留,为不定值
FrmHandle:输入变量,与读写器相连串口的句柄
返回:
如果该函数调用成功,返回一个零值。
否则,返回非零值,返回的错误代码请查看代码页。
/***************************************************************************** File : main.c*
* COPYRIGHT BY HUOYAN LTD.COMPANY *
* Version: V1.3 *
* *
* Created: 18.10.2005 *
* Last Change: 21.10.2005 *
* *
* Author: NIL *
* *
* Compiler: KEIL C51 V7.10 *
* *
* Description: AT89S52-Firmware for FM1702 Demo Serial Reader *
* *
****************************************************************************/
#include <reg52.h>亮念
#define __SRC
#include "main.h"
#undef __SRC
#include <intrins.h>
//#include <string.h>
//#include <stdio.h>
//#include <宴键高absacc.h>
#include "FM1702.h"
#define uchar unsigned char
#define uint unsigned int
//pin define mcu控制管脚定义
sbit RF_MISO = P2^3
sbit RF_MOSI = P2^1
sbit RF_SCK = P2^0
sbit RF_NSS = P2^2
sbit RF_RST = P2^4//由高变低时启动内部复位程序
sbit CARD_LED = P1^1
sbit SPEAKER= P1^0
sbit LED = P2^5
//晌尺sbit RF_MISO = P1^0
//sbit RF_MOSI = P1^1
//sbit RF_SCK = P1^2
//sbit RF_NSS = P1^3
//sbit RF_RST = P1^4 //由高变低时启动内部复位程序
//sbit LED = P2^4
//sbit SPEAKER= P2^0
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
//名称: spi_byte_transceive//
//功能: 该函数实现SPI通讯的数据收发//
// //
//输入://
// 发送数据 //
// //
//输出://
// 接收数据 //
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
char spi_byte_transceive(char sendbyte)
{
char i,temp
for(i=0i<8i++)
{
RF_SCK=0
if(sendbyte &0x80) //位运算,判断最高位是否为1
{
RF_MOSI=1
}
else
{
RF_MOSI=0
}
sendbyte <<= 1
RF_SCK=1
temp <<= 1
if(RF_MISO)
temp |= 0x01
}
RF_SCK=0
_nop_()
_nop_()
RF_MOSI=0
return (temp)
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
//名称: rc531_register_write //
//功能: 该函数实现通过SPI接口对RC531中一个寄存器写入值 //
// //
//输入://
// RC531目标寄存器地址和写入值 //
// //
//输出://
// N/A //
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
void SPIWrite(char reg_ad,char reg_data)
{
RF_SCK=0
reg_ad <<= 1
RF_NSS=0
reg_ad &= 0x7F
spi_byte_transceive(reg_ad)
spi_byte_transceive(reg_data)
RF_NSS=1
return
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
//名称: rc531_register_read//
//功能: 该函数实现通过SPI接口读取RC531中一个寄存器的值 //
// //
//输入://
// RC531目标寄存器地址 //
// //
//输出://
// 目标寄存器的值 //
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
unsigned char SPIRead(char reg_ad)
{ char temp
RF_SCK=0
_nop_()
_nop_()
RF_NSS=0
reg_ad <<= 1
reg_ad |= 0x80
spi_byte_transceive(reg_ad)
temp=spi_byte_transceive(0x00)
RF_NSS=1
return (temp)
}
///////////////////////////////////////////////////////////////////////
// 主函数
///////////////////////////////////////////////////////////////////////
void main(void)
{ //设置变量
uchar baud
SPEAKER=0
InitSystem()//初始化系统
SPEAKER=1
LED=0
while (1)
{
//检查命令标志
if (CmdValid) //if LEVEL 1
{
CmdValid = FALSE
if(RevBuffer[0]==11) //if LEVEL 2
{
RevBuffer[2]=RevBuffer[1]
RevBuffer[0]=1
RevBuffer[1]=0
CALL_isr_UART() //equal to 'SETB TI', defined in main.h
SPEAKER=0 //开蜂鸣器和指示灯
delay_10ms(RevBuffer[2])
SPEAKER=1
}
else if(RevBuffer[0]==13) //设置通讯波特率 //if LEVEL 2
{
switch(RevBuffer[1])
{
case 0:
baud=BAUD_9600
break
case 1:
baud=BAUD_14400
break
case 2:
baud=BAUD_19200
break
case 3:
baud=BAUD_28800
break
case 4:
baud=BAUD_38400
break
case 5:
baud=BAUD_57600
break
case 6:
baud=BAUD_115200
break
default:
baud=BAUD_19200
break
} //switch body
RevBuffer[0]=1 //contact
RevBuffer[1]=0
CALL_isr_UART()
delay_10ms(5)
TR1 = 0
TH1 = baud
TL1 = TH1
delay_10ms(2)
TR1 = TRUE
}//if LEVEL 2
else
{
cmd_process() // 进入IC卡处理程序
CALL_isr_UART()
}
}
}//while循环体
}//main函数
///////////////////////////////////////////////////////////////////////
// 系统初始化
///////////////////////////////////////////////////////////////////////
void InitSystem(void)
{
RF_NSS=1
RF_RST=0
ET2 = 0 //Timer 2 disabled
T2CON = 0x04 //start Timer 2(internal timer, auto reload)
PCON = 0x80 //baud rate double
SCON = 0x70 //UART mode 1, enable receive, if No valid stop bit, RI not activated.
//TMOD = 0x22
TMOD = 0x21 //Timer 1 8bit auto reload TR1 control
//Timer 0 16bit TR0 control
TH1 = BAUD_9600 //默认波特率
TL1 = TH1
TR1 = TRUE // 波特率发生器
TH0 = 0x60
TL0 = 0x60
TR0 = 0 //Timer 0 doesn't run
ET0=0
ET1=0
EA=1
EX0=1
IT0 = 1
TR2=0
ES = TRUE //enable UART interrupt
CmdValid=0 //flag initiation
//喇叭和指示灯测试
delay_10ms(10)
delay_10ms(10)
Init_FM1702(0)
}
///////////////////////////////////////////////////////////////////////
// 串口接收和发送中断
///////////////////////////////////////////////////////////////////////
void isr_UART(void) interrupt 4 using 1
{
uchar len, i
unsigned int j=0
if(RI)
{
len=SBUF
RI=0
for(i=0i<leni++)
{
while(!RI)
{
j++
if(j>1000)
{
break
}
}
if(j<1000)
{
RevBuffer[i]=SBUF
RI=0
j=0
}
else
{
break
}
}
if(i==len)
{
REN=0
CmdValid=1
}
}
else if(!RI &&TI)
{
TI=0
len=RevBuffer[0]
for(i=0i<len+1i++)
{
SBUF=RevBuffer[i]
while(!TI)
TI=0
}
REN=1
}
}
/****************************************************************/
/*名称: Load_keyE */
/*功能: 该函数实现把E2中密码存入FM1702的keyRevBuffer中*/
/*输入: Secnr: EE起始地址*/
/*输出: True: 密钥装载成功*/
/* False: 密钥装载失败*/
/****************************************************************/
uchar Load_key_CPY(uchar *buff)
{
char idata status
uchar coded_keys[12]
uchar temp
M500HostCodeKey(buff,coded_keys)////////////////
temp=Command_Send(0x0c,coded_keys,LoadKey)
if(temp == FALSE)
{
return FM1702_LOADKEYERR
}
status=(SPIRead(ErrorFlag)) &0x40
if (status==0x40)
return FM1702_AUTHERR
return FM1702_OK
}
///////////////////////////////////////////////////////////////////////
// IC卡处理函数
///////////////////////////////////////////////////////////////////////
void cmd_process(void)
{
uchar cmd
uchar status
cmd = RevBuffer[0]
switch(cmd)
{
case 1: // Halt the card //终止卡的 *** 作
status=MIF_Halt()
RevBuffer[0]=1
RevBuffer[1]=status
break
case 2:
status = Request(RF_CMD_REQUEST_ALL) //RF_CMD_REQUEST_STD=0x26, request Idle
if(status != FM1702_OK)
{
status = Request(RF_CMD_REQUEST_ALL)
if(status != FM1702_OK)
{
RevBuffer[0] = 1
RevBuffer[1] = FM1702_REQERR
break
}
}
if(tagtype[0]==2)
cardtype=mifarepro// Mifare Pro 卡
else if(tagtype[0]==4)
cardtype=mifare1 // Mifare One 卡
else if(tagtype[0]==16)
cardtype=mifarelight // Mifare Light 卡
else
cardtype=unknowncard
RevBuffer[0]=3
RevBuffer[1]=status
RevBuffer[2]=tagtype[0]
RevBuffer[3]=tagtype[1]
break
case 3: // 防冲突 读卡的系列号 MLastSelectedSnr
status = AntiColl()
if(status!=FM1702_OK)
{
RevBuffer[0]=1
RevBuffer[1]=FM1702_ANTICOLLERR
break
}
//memcpy(MLastSelectedSnr,&RevBuffer[2],4)
RevBuffer[0]=5
RevBuffer[1]=status
RevBuffer[2]=UID[0]
RevBuffer[3]=UID[1]
RevBuffer[4]=UID[2]
RevBuffer[5]=UID[3]
break
case 4: // 选择卡 Select Card
status=Select_Card()
if(status!=FM1702_OK)
{
RevBuffer[0]=1
RevBuffer[1]=FM1702_SELERR
break
}
RevBuffer[0]=1
RevBuffer[1]=status
break
case 5:
//下载密钥
// status = Load_keyE2(RevBuffer[2],RevBuffer[1]) //%40
status = Authentication(UID, RevBuffer[2], RevBuffer[1])
if(status != FM1702_OK)
{
RevBuffer[0]=1
RevBuffer[1]=status
break
}
RevBuffer[0]=1
RevBuffer[1]=status
break
case 6: // Key loading into the MF RC500's EEPROM
// 校验卡密码(E2) Load_keyE2_CPY(uchar Secnr, uchar Mode)
// RevBuffer[5] = 0xff
// RevBuffer[6] = 0xff
// RevBuffer[7] = 0xff
// RevBuffer[8] = 0xff
// RevBuffer[9] = 0xff
// RevBuffer[10] = 0xff
status = Load_key_CPY(&RevBuffer[3])
// status = Load_keyE2_CPY(RevBuffer[2],RevBuffer[1]) //%40
// if(status != FM1702_OK)
// {
// RevBuffer[0]=1
// RevBuffer[1]=status
// break
// }
RevBuffer[0]=1
RevBuffer[1]=status
break
这里不能全部发完,你加我的QQ吧,574301093 我发给你接收完后麻烦采纳下我的答案。谢谢了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)