Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

problem with function

Status
Not open for further replies.

dizgah

Member level 5
Joined
Nov 8, 2009
Messages
91
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,286
Location
iran-8par
Activity points
2,049
hi every body i have a problem with this function & dont know reason of it:
Code:
lib.h
char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue);

Code:
main:
unsigned char mount[4];
status= PcdValue(0xC1,4,mount);


Code:
lib.c

/////////////////////////////////////////////////////////////////////
// @ Function: debit and prepaid
// @ Parameter Description: dd_mode [IN]: command word
// 0xC0 = debit
// 0xC1 = recharge
// Addr [IN]: wallet address
// PValue [IN]: 4 bytes Increase (decrease) in value, low in the former
// @ Return: the successful return MI_OK
/////////////////////////////////////////////////////////////////////                
char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
{
    char status;
    unsigned int  unLen;
    unsigned char i,ucComMF522Buf[MAXRLEN]; 
    
    ucComMF522Buf[0] = dd_mode;
    ucComMF522Buf[1] = addr;
    CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
 
   [COLOR="#FF0000"] status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
[/COLOR]	
	if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
    {   status = MI_ERR;   }
		
    if (status == MI_OK)
    {
        for (i=0; i<16; i++)
        {    ucComMF522Buf[i] = *(pValue+i);   }
        CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);
        unLen = 0;
        status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
        if (status != MI_ERR)
        {    status = MI_OK;    }
    }
    
    if (status == MI_OK)
    {
        ucComMF522Buf[0] = PICC_TRANSFER;
        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;   }
    }
    return status;
}

Code:
/////////////////////////////////////////////////////////////////////
//@ Function: RC522 and ISO14443 card through communication
//@ Parameter Description: Command [IN]: RC522 command word
//PIn [IN]: data is sent to the card by RC522
//InLenByte [IN]: send data byte length
//POut [OUT]: return data received cards
//* POutLenBit [OUT]: Returns the data bit length
/////////////////////////////////////////////////////////////////////
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;
    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);
    WriteRawRC(CommandReg, PCD_IDLE);
    for (i=0; i<InLenByte; i++)
        { 
           WriteRawRC(FIFODataReg, pInData[i]); 
        }
    WriteRawRC(CommandReg, Command);
    if (Command == PCD_TRANSCEIVE)  {    SetBitMask(BitFramingReg,0x80);  }
    i = 2000 ; //600;//????????,??M1???????25ms
    do 
      {
         n = ReadRawRC(ComIrqReg);
         i--;
       }
    while ((i!=0) && !(n&0x01) && !(n&waitFor));
    ClearBitMask(BitFramingReg,0x80);
	      
    if (i!=0)
    {    
         if(!(ReadRawRC(ErrorReg)&0x1B))
         {
             status = MI_OK;
             if (n & irqEn & 0x01) {status = MI_NOTAGERR;}
             if (Command == PCD_TRANSCEIVE)
                 {
               	 n = ReadRawRC(FIFOLevelReg);
              	 lastBits = ReadRawRC(ControlReg) & 0x07;
                 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[i] = ReadRawRC(FIFODataReg);
                    }
                 }
         }
         else
         {   status = MI_ERR;   }
        
   }
   SetBitMask(ControlReg,0x80);           // stop timer now
   WriteRawRC(CommandReg,PCD_IDLE); 
   return status;
}
i know problem is related with PcdComMF522 function(red sectio) becouse after running this function
outcome wi be status = MI-ERR(indicate error)
but i use PcdComMF522 function in other place and it work very well

thanks any body
 
Last edited by a moderator:

Are you able to step through the code? Do you know if it exits with the error code because i==0 or because (ReadRawRC(ErrorReg)&0x1B)? When you call this in other places and it works, are you also using PCD_TRANSCEIVE? For example, could ReadRawRC never give a result of 0x01, 0x10, 0x20, or 0x30?
 
Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top