|
楼主 |
发表于 2010-3-25 13:51:39
|
显示全部楼层
while(1)
{
// IS014443B
/*
当完成MF RC531复位和初始化之后,读卡模块天线产生高频磁场,并循环发送REQB命令
“0x05 0x00 0x00”,对“二代证”进行询卡操作。当“二代证”靠近读卡模块天线,距离在
100mm以内时,“二代证”内部的线圈接收到读卡模块天线发出的磁场能量,产生感应电压对
“二代证”内部芯片进行供电。当“二代证”内部芯片正常工作并接收到读卡模块发送的REQB
命令后,会返回12个字节的卡类型代码给读卡模块。
5000000000D1038605008080
询卡成功后,读卡模块发送SELECT命令“0x1D 0x00 0x00 0x00 0x00 0x00 0x08 0x01 0x08”
,对“二代证”进行选卡操作,这时“二代证”会返回状态码。最后读卡模块发送GUID命令“0x00
0x36 0x00 0x00 0x08”,读取“二代证”的8字节的唯一序列号UID。
*/
M500PcdConfigISOType(TYPEB);
status = M531PiccRequestB(PICC_REQBWUP,0,0,ReadBuf); // ReqB with 1 slot
if(status==MI_OK || status==MI_COLLERR) //这里就开始错误 一直是0XFF
{
if(status == MI_COLLERR) // more then 1 card
{
char M500PcdConfigISOType(unsigned char type)
{
if(type==TYPEA)
{
WriteIO(RegTxControl,0x5b); // Force100ASK, TX1 & TX2 enable
WriteIO(RegCoderControl,0x19); // Miller coding, 106kbps
WriteIO(RegRxControl1,0x73);
WriteIO(RegDecoderControl,0x08); // Manchester Coding
WriteIO(RegCRCPresetLSB,0x63); // set CRC preset to 0x6363
WriteIO(RegCRCPresetMSB,0x63);
WriteIO(RegRxThreshold,0x88); // set max MinLevel & ColLevel.
TYPE = TYPEA;
}
else
{ /*
WriteIO(RegTxControl,0x4b); // disable Force100ASk
WriteIO(RegCoderControl,0x20); // NRZ-L, TypeB baud 106kbps
WriteIO(RegRxControl1,0x73); //
WriteIO(RegDecoderControl,0x19); // BPSK coding
WriteIO(RegCRCPresetLSB,0xff); // set CRC preset to 0xffff
WriteIO(RegCRCPresetMSB,0xff);
WriteIO(RegTypeBFraming,0x23); // EGT=0
WriteIO(RegBPSKDemControl,0x3e); // ignore EOF, on amp. detect
WriteIO(RegModConductance,0x06); // set modulation index at 12%
WriteIO(RegRxThreshold,0x44); // Reduce MinLevel & ColLevel.
// Increase higher nibble if carrier
// present but not detect
*/ //源码
//ISO14443B电子标签 JB8_NE64_RC531
//第2页 传送器与编码器控制
WriteIO(RegTxControl, 0x4b); //0x4b, 13.56MHz
WriteIO(RegCwConductance, 0x3f); //0x3f, 设置输出驱动的电导系数
WriteIO(RegModConductance, 0x06); //0x06, 幅移键控ASk 12%
WriteIO(RegCoderControl, 0x20); //0x20, TypeB,波特率106kbps, NRZ编码
WriteIO(RegTypeBFraming, 0x23); //0x23, 定义ISO14443B帧格式
//第3页 接收器与解码器控制
WriteIO(RegDecoderControl, 0x19); //0x19, ISO14443B帧,BPSK编码
WriteIO(RegRxThreshold, 0x44); //0x44, 可接收的最小信号强度
WriteIO(RegBPSKDemControl, 0x3e); //0x3e, 忽略EOF,打开高通滤波
WriteIO(RegClockQControl, 0x07); //0x3f, Q时钟控制
//第4页 射频时间和通道冗余
WriteIO(RegRxWait, 0x06); //0x06, 设置接收延时
WriteIO(RegChannelRedundancy, 0x2c); //0x2c, TypeB接收冗余校验
WriteIO(RegCRCPresetLSB, 0xff); //0xff, CRC预设值
WriteIO(RegCRCPresetMSB, 0xff); //0xff, CRC预设值
TYPE = TYPEB;
}
return MI_OK;
}
//////////////////////////////////////////////////////////////////////
// E X C H A N G E B Y T E S T R E A M
///////////////////////////////////////////////////////////////////////
char ExchangeByteStream(unsigned char Cmd,
unsigned char *send_data,
unsigned char send_bytelen,
unsigned char *rec_data,
unsigned char *rec_bytelen)
{
signed char status = MI_OK;
FlushFIFO(); // empty FIFO
ResetInfo(MInfo); // initialise ISR Info structure
if (send_bytelen > 0)
{
memcpy(MSndBuffer,send_data,send_bytelen); // write n bytes
MInfo.nBytesToSend = send_bytelen;
// write load command
status = M500PcdCmd(Cmd, //这里进入实际发送函数后 接收返回一直是0xff
MSndBuffer,
MRcvBuffer,
&MInfo);
if ( status == MI_OK )
{
*rec_bytelen = MInfo.nBytesReceived;
if (*rec_bytelen)
{
memcpy(rec_data,MRcvBuffer,MInfo.nBytesReceived);
}
}
}
else
{
status = MI_WRONG_PARAMETER_VALUE;
}
return status;
}
//////////////////////////////////////////////////////////////////////
// R E Q U E S T B
//////////////////////////////////////////////////////////////////////
char M531PiccRequestB(unsigned char req_code,
unsigned char AFI,
unsigned char N,
unsigned char *ATQB)
{
char status = MI_OK;
unsigned char rec_len;
WriteIO(RegChannelRedundancy,0x2C); // RxCRC and TxCRC enable, parity
// disable, ISO/IEC3390 enable
ClearBitMask(RegControl,0x08); // disable crypto 1 unit 加密单元关闭
SetBitMask(RegTxControl,0x03); // Tx2RF-En, Tx1RF-En enable
M500PcdSetTmo(5);
MSndBuffer[0] = 0x05; // APf code
MSndBuffer[1] = AFI; //
MSndBuffer[2] = (req_code&0x08)|(N&0x07); // PARAM
MSndBuffer[1] = 0; // ////////////////改成0
MSndBuffer[2] = 0; // PARAM /////////////// 改成0
status = ExchangeByteStream(PCD_TRANSCEIVE,
MSndBuffer,
3,
ATQB,
&rec_len);
if (status!=MI_OK && status!=MI_NOTAGERR) status = MI_COLLERR; // collision occurs
if (status == MI_OK) M500PcdSetTmo(ATQB[11]>>4); // set FWT
return status;
} |
|