|
楼主 |
发表于 2012-5-14 10:38:31
|
显示全部楼层
黑暗深处 发表于 2012-5-11 20:53
第一个问题,请自己看RC632或者RC500的datasheet 第9.2.1章
http://www.cn.nxp.com/documents/data_sheet/M ...
命令的帧,是14443A协议中规定的,包括帧格式,REQA/WUPA是短帧,只有7bit,没有CRC和ParityOdd校验;ANTICOLLISION是面向位的帧,没有CRC,但有ParityOdd;SELECT和HLTA是标准帧,有CRC和ParityOdd。
然后,这是我的配置协议函数,Pcdrequest函数,PcdComTransceive函数,请帮我看看,那个地方设置有问题。
char PcdConfigISOType(unsigned char type)
{
if (type == 'A') //ISO14443_A,'A'在ACSII中0x41.
{
ClearBitMask(RegControl,0x08); //disable crypto 1 unit 加密单元关闭
WriteRawRC(RegClockQControl,0x00);
WriteRawRC(RegClockQControl,0x40);
Delay_50us(2); // wait approximately 100 us - calibration in progress
ClearBitMask(RegClockQControl,0x40);
WriteRawRC(RegTxControl,0x5B);
WriteRawRC(RegCwConductance,0x0F); //配置输出驱动的电导系数 /////////////////
WriteRawRC(RegModConductance,0x3F); //配置输出信号的时间调制系数,100%ASK此位无效
WriteRawRC(RegCoderControl,0x19); //配置时钟速率和编码模式,初始值和14443A值均是0x19.
WriteRawRC(RegModWidth,0x13); //设定调制脉冲的宽度 脉冲调制宽度Tmod=2(ModWidth+1)/fc=3.0us
WriteRawRC(RegModWidthSOF,0x3F); //SOF调制宽度9.44us 00
WriteRawRC(RegTypeBFraming,0x00);
WriteRawRC(RegRxControl1,0x73); //控制接收行为 ,接收信号电压增益因子为35dB
WriteRawRC(RegDecoderControl,0x08); // 控制解调,28(2C),68,08 P45 ////
WriteRawRC(RegBitPhase,0xAD); //设定发送与接收时钟间的相位关系
WriteRawRC(RegRxThreshold,0xFF); //设定位解码阈值,88 FF 初值AA ///////// ////
WriteRawRC(RegBPSKDemControl,00); //控制BPSK解调
WriteRawRC(RegRxControl2,0x41); //控制解调,并定义接收机decoder的输入
WriteRawRC(RegRxWait,0x06); //
WriteRawRC(RegChannelRedundancy,0x0F); //
WriteRawRC(RegCRCPresetLSB,0x63); //14443A的CRC初始值为0x6363
WriteRawRC(RegCRCPresetMSB,0x63); //14443A的CRC初始值为0x6363
WriteRawRC(RegTimeSlotPeriod,0x00); //for I.CODE1 protocol
WriteRawRC(RegMfOutSelect,0x04); // select internal signal applied to pin MFOUT 04 or 05 00
WriteRawRC(RFU27,0x00);
WriteRawRC(RegFIFOLevel,0x3F); //0x3F=63D,FIFO共64字节
WriteRawRC(RegTimerClock,0x07);
WriteRawRC(RegTimerControl,0x06);
WriteRawRC(RegTimerReload,0x0A);
WriteRawRC(RegIRqPinConfig,0x02);
WriteRawRC(RFU2E,0x00);
WriteRawRC(RFU2F,0x00);
PcdSetTmo(106);
DelayMs(1);
PcdAntennaOn();
}
else{ return -1; }
return MI_OK;
}
/////////////////////////////////////////////////////////////////////
//功 能:寻卡
//参数说明: req_code[IN]:寻卡方式
// 0x52 = 寻感应区内所有符合14443A标准的卡
// 0x26 = 寻未进入休眠状态的卡
// pTagType[OUT]:卡片类型代码
// 0x4400 = Mifare_UltraLight
// 0x0400 = Mifare_One(S50)
// 0x0200 = Mifare_One(S70)
// 0x0800 = Mifare_Pro
// 0x0403 = Mifare_ProX
// 0x4403 = Mifare_DESFire
//返 回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdRequest(unsigned char req_code,unsigned char *pTagType)
{
char idata status;
struct TranSciveBuffer MfComData;
struct TranSciveBuffer *pi;
pi = &MfComData;
WriteRawRC(RegChannelRedundancy,0x02); //无CRC_16,无奇校验。 03
ClearBitMask(RegControl,0x08); //disable crypto 1 unit 加密单元关闭
WriteRawRC(RegBitFraming,0x07); //(接收的数据在FIFO中从bit0开始存放,发送的最后一个字节有7bits。07)
SetBitMask(RegTxControl,0x03); //pin TX1,TX2发送调制的13.56MHz的载波。
PcdSetTmo(4);
MfComData.MfCommand = PCD_TRANSCEIVE;
MfComData.MfLength = 1;
MfComData.MfData[0] = req_code;
status = PcdComTransceive(pi);
if((status == MI_OK) && (MfComData.MfLength == 0x10))
{
*pTagType = MfComData.MfData[0];
*(pTagType+1) = MfComData.MfData[1];
}
else
{ status = MI_BITCOUNTERR; }
return status;
}
/////////////////////////////////////////////////////////////////////
//通过RC632和ISO14443卡通讯
//input: pi->MfCommand = RC632命令字
// pi->MfLength = 发送的数据长度
// pi->MfData[] = 发送数据
//output:status = 错误字
// pi->MfLength = 接收的数据BIT长度
// pi->MfData[] = 接收数据
/////////////////////////////////////////////////////////////////////
char PcdComTransceive(struct TranSciveBuffer *pi)
{
bit recebyte = 0;
char status;
unsigned char irqEn = 0x00;
unsigned char waitFor = 0x00;
unsigned char lastBits;
unsigned char n;
unsigned int i;
switch (pi->MfCommand)
{
case PCD_IDLE:
irqEn = 0x00;
waitFor = 0x00;
break;
case PCD_WRITEE2:
irqEn = 0x11;
waitFor = 0x10;
break;
case PCD_READE2:
irqEn = 0x07;
waitFor = 0x04;
recebyte=1;
break;
case PCD_LOADCONFIG:
case PCD_LOADKEYE2:
case PCD_AUTHENT1:
irqEn = 0x05;
waitFor = 0x04;
break;
case PCD_CALCCRC:
irqEn = 0x11;
waitFor = 0x10;
break;
case PCD_AUTHENT2:
irqEn = 0x04;
waitFor = 0x04;
break;
case PCD_RECEIVE:
irqEn = 0x06;
waitFor = 0x04;
recebyte=1;
break;
case PCD_LOADKEY:
irqEn = 0x05;
waitFor = 0x04;
break;
case PCD_TRANSMIT:
irqEn = 0x05;
waitFor = 0x04;
break;
case PCD_TRANSCEIVE:
irqEn = 0x3D;
waitFor = 0x04;
recebyte=1;
break;
default:
pi->MfCommand = MI_UNKNOWN_COMMAND;
break;
}
if (pi->MfCommand != MI_UNKNOWN_COMMAND)
{
WriteRawRC(RegPage,0x00);
WriteRawRC(RegInterruptEn,0x7F); //3F 使能所有中断
WriteRawRC(RegInterruptRq,0x7F); //3F
WriteRawRC(RegCommand,PCD_IDLE); //取消当前命令
SetBitMask(RegControl,0x01); // clear the internal FIFO-buffer's read- and write-pointer abd the flag FIFOOvfl (FIFO length become 0)
WriteRawRC(RegInterruptEn,irqEn|0x80);//使能发送与接收中断请求
for (i=0; i<pi->MfLength; i++)
{
WriteRawRC(RegFIFOData, pi->MfData); //写数据到FIFO
}
WriteRawRC(RegCommand, pi->MfCommand); //执行命令
i = 0X3500;
do
{
n = ReadRawRC(RegInterruptRq);
i--;
}
while ((i!=0) && !(n&irqEn&0x20) && !(n&waitFor)); ////等待数据发送完 n&waitFor表示命令自动结束
status = MI_COM_ERR;
if ((i!=0) && !(n&irqEn&0x20)) //FIFO数据超限或i=0
{
if (!(ReadRawRC(RegErrorFlag)&0x17)) //don't write to FIFO buffer if FIFO is full ,SOF is ok,the parity check is ok,a bit-collision is not detected.
{
status = MI_OK;
if (recebyte)
{
n = ReadRawRC(RegFIFOLength); //读返回数据的长度
lastBits = ReadRawRC(RegSecondaryStatus) & 0x07; //得出接受字节中的有效位,如果为0,全部位都有效
if (lastBits)
{
pi->MfLength = (n-1)*8 + lastBits;
}
else
{
pi->MfLength = n*8;
}
if (n == 0)
{
n = 1;
}
for (i=0; i<n; i++)
{
pi->MfData = ReadRawRC(RegFIFOData);
}
}
}
else if (ReadRawRC(RegErrorFlag)&0x01) //a bit-collision is detected.
{
status = MI_COLLERR;
if (recebyte)
{
n = ReadRawRC(RegFIFOLength);
lastBits = ReadRawRC(RegSecondaryStatus) & 0x07;
if (lastBits)
{
pi->MfLength = (n-1)*8 + lastBits;
}
else
{
pi->MfLength = n*8;
}
if (n == 0)
{
n = 1;
}
for (i=0; i<n; i++)
{
pi->MfData[i+1] = ReadRawRC(RegFIFOData);
}
}
pi->MfData[0]=ReadRawRC(0x0B); //0B is CollPos Register
}
}
else if (n & irqEn & 0x20) //FIFO数据未超限
{ status = MI_NOTAGERR; }
else if (!(ReadRawRC(RegErrorFlag)&0x17))
{ status = MI_ACCESSTIMEOUT; }
else
{ status = MI_COM_ERR; }
WriteRawRC(RegInterruptEn,0x7F);
// DelayMs(10);
WriteRawRC(RegInterruptRq,0x7F);
SetBitMask(RegControl,0x04); // stop timer now
WriteRawRC(RegCommand,PCD_IDLE);
}
return status;
}
|
|