|
本帖最后由 zizag 于 2012-6-4 11:19 编辑
我现在在调试mfrc523的驱动,
char PcdComMF522(unsigned char Command,
unsigned char *pInData,
unsigned char InLenByte,
unsigned char *pOutData,
unsigned int *pOutLenBit)
{
char status = MI_ERR;
unsigned char irqEn = 0x00;
unsigned char waitFor = 0x00;
unsigned char lastBits;
unsigned char n;
unsigned int i;
unsigned char getvalue = 0;
switch (Command)
{
case PCD_AUTHENT:
irqEn = 0x12;
waitFor = 0x10;
break;
case PCD_TRANSCEIVE:
irqEn = 0x77;
waitFor = 0x30;
break;
default:
break;
}
WriteRawRC(ComIEnReg,irqEn|0x80);
ClearBitMask(ComIrqReg,0x80);
WriteRawRC(CommandReg,PCD_IDLE);
SetBitMask(FIFOLevelReg,0x80);
for (i=0; i<InLenByte; i++)
{ WriteRawRC(FIFODataReg, pInData); }
WriteRawRC(CommandReg, Command);
if (Command == PCD_TRANSCEIVE)
{ SetBitMask(BitFramingReg,0x80); }
//i = 600;//根据时钟频率调整,操作M1卡最大等待时间25ms
i = 6000;//根据时钟频率调整,操作M1卡最大等待时间25ms
do
{
n = ReadRawRC(ComIrqReg);
// if(sp_delay)
// RF4_Delay(1200);
i--;
}
while ((i!=0) && !(n&0x01) && !(n&waitFor));
if(sp_delay)
{
unsigned char st= ReadRawRC(Status2Reg);
Uart_Trace("PcdComMF522 Status2Reg=%x",st);
Uart_Trace("PcdComMF522 timeoutH=%x",(i&0xFF00)>>8);
Uart_Trace("PcdComMF522 timeoutL=%x",i&0xFF);
Uart_Trace("PcdComMF522 ComIrqReg=%x",n);
}
ClearBitMask(BitFramingReg,0x80);
if (i!=0)
{
getvalue = ReadRawRC(ErrorReg);
if(sp_delay)
Uart_Trace("PcdComMF522 ErrorReg=%x",getvalue);
//if(!(ReadRawRC(ErrorReg)&0x1B))
if(!(getvalue&0x1B))
{
status = MI_OK;
if (n & irqEn & 0x01)
{ status = MI_NOTAGERR; }
if (Command == PCD_TRANSCEIVE)
{
n = ReadRawRC(FIFOLevelReg);
lastBits = ReadRawRC(ControlReg) & 0x07;
if(sp_delay)
{
Uart_Trace("PcdComMF522 FIFOLevelReg=%x",n);
Uart_Trace("PcdComMF522 ControlReg=%x",lastBits);
}
if (lastBits)
{ *pOutLenBit = (n-1)*8 + lastBits; }
else
{ *pOutLenBit = n*8; }
if (n == 0)
{ n = 1; }
if (n > MAXRLEN)
{ n = MAXRLEN; }
for (i=0; i<n; i++)
{ pOutData = ReadRawRC(FIFODataReg); }
}
}
else
{ status = MI_ERR; }
}
SetBitMask(ControlReg,0x80); // stop timer now
WriteRawRC(CommandReg,PCD_IDLE);
return status;
}
/////////////////////////////////////////////////////////////////////
//功 能:写数据到M1卡一块
//参数说明: addr[IN]:块地址
// pData[IN]:写入的数据,16字节
//返 回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdWrite(unsigned char addr,unsigned char *pData)
{
char status;
unsigned int unLen;
unsigned char i,ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = PICC_WRITE;
ucComMF522Buf[1] = addr;
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
{ status = MI_ERR;
Uart_Trace("PcdWrite err1",0);
}
if (status == MI_OK)
{
//memcpy(ucComMF522Buf, pData, 16);
for (i=0; i<16; i++)
{ ucComMF522Buf = *(pData+i); }
CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);
sp_delay = 1;
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
{ status = MI_ERR;
Uart_Trace("PcdWrite 2 unLen=%d",unLen);
Uart_Trace("PcdWrite 2 ucComMF522Buf[0]=%x",ucComMF522Buf[0]);
}
sp_delay = 0;
}
return status;
}
请问这个ucComMF522Buf[0] & 0x0F) != 0x0A
中的返回值为什么是0xa.为什么我得到的老是0x05,写也没成功。
还有这个返回值什么文档里定义了?谢谢。
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|