/***************************************************************************
º¯ÊýÃû³Æ£ºSendCMD
º¯Êý¹¦ÄÜ£ºÐ´PCDÃüÁî·¢ËÍ¿¨Æ¬²Ù×÷ÃüÁî²¢½ÓÊÕÊý¾Ý
ÊäÈë²ÎÊý£º
set:structÀàÐÍ£¬°üº¬ÁËPCDÃüÁ
¿¨Æ¬²Ù×÷ÃüÁ¿¨Æ¬²Ù×÷ÃüÁî²ÎÊý³¤¶È£¨º¬ÃüÁÒÔ¼°½ÓÊÕÊý¾ÝÓ¦Ó㤶È
Êä³ö²ÎÊý£º
error_flag:´íÎó±êʶ£¬±êʶµÄºê¶¨ÒåÔÚFM1722.hÖÐ
set:º¬½ÓÊÕÊý¾Ý
/******************************************************
*·¢ËÍÖ¸Áî
***************************************************/
unsigned char SendCMD2(Transceive *set)
{
unsigned char recebyte = 0;
char err_flag,sta;
unsigned char irqEn = 0x00;
unsigned char waitFor = 0x00;
unsigned char lastBits;
unsigned int i;
switch (set->command)
{
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 = 0x08;
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:
set->command = MI_UNKNOWN_COMMAND;
break;
}
if (set->command != MI_UNKNOWN_COMMAND)
{
WriteIO(RegPage,0x00); //Çл»ÏßÐÔÑ°Ö·
WriteIO(RegInterruptEn,0x7F);
WriteIO(RegInterruptRq,0x7F);
WriteIO(RegCommand,PCD_IDLE);
SetBitMask(RegControl,0x01);
WriteIO(RegInterruptEn,irqEn|0x80);//ÔÊÐí¶ÔÓ¦µÄÖжÏ
ClearFIFO(); //Çå¿ÕFIFO
for (i=0; i<set->length; i++)
{
WriteIO(RegFIFOData, set->sr_data[i]); //дÊý¾Ý
}
WriteIO(RegCommand, set->command); //дÃüÁî
i = 0x2000;
do
{
n = ReadIO(RegInterruptRq); // ¶ÁÕâ¸öÖжÏ0
i--;
}while ((i!=0) && !(n&irqEn&0x20) && !(n&waitFor));
{
sta=ReadIO(RegPrimaryStatus); //¶Á¸÷ÖÖ״̬¼Ä´æÆ÷
err_flag = 101; //Êý¾Ý´ÓÕâÀïÌø³öʱ·µ»ØµÄ´íÎóÊÇFIFO ½ÓÊÕµÄÊý¾Ý³¬¹ý
}
if ((i!=0) && !(n&irqEn&0x20)) // Èç¹ûÕýÈ·µÄ»°£¬¶Á³öµÄÖжϱêʶΪ1
{
if (!(ReadIO(RegErrorFlag)&0x17))
{
err_flag = MI_OK;
if (recebyte)
{
n = ReadIO(RegFIFOLength);
for (i=0; i<n; i++)
{
set->sr_data[i] = ReadIO(RegFIFOData);
}
}
}
else if (ReadIO(RegErrorFlag)&0x01)
{
err_flag = MI_COLLERR; //³åͻλ
if (recebyte)
{
n = ReadIO(RegFIFOLength);
lastBits = ReadIO(RegSecondaryStatus) & 0x07;
if (lastBits)
{
set->length = (n-1)*8 + lastBits;
}
else
{
set->length = n*8;
}
if (n == 0)
{
n = 1;
}
for (i=0; i<n; i++)
{
set->sr_data[i+1] = ReadIO(RegFIFOData);
}
}
set->sr_data[0]=ReadIO(RegCollpos );
}
}
else if (n & irqEn & 0x20) // ΪÕæ £¬irqen Ó²¼þδ×Ô¶¯ÖÃ0
{
printf(" irqen=%.2X",irqEn);
printf(" n=%.2X",n);
err_flag = MI_NOTAGERR; //FIFOÊý¾Ý³¬ÏÞ
}
else if (!(ReadIO(RegErrorFlag)&0x17))
{
err_flag = MI_ACCESSTIMEOUT; //³¬Ê±Í˳ö 27
}
else
{ err_flag = 102; } //ÆäËûÇé¿ö
WriteIO(RegInterruptEn,0x7F);
WriteIO(RegInterruptRq,0x7F);
SetBitMask(RegControl,0x04); // stop timer now
WriteIO(RegCommand,PCD_IDLE);
}
return err_flag;
} |