RC522不能寻卡,时序检查了几次

2019-07-15 15:11发布

//******************************************************************/
//功    能:读RC522寄存器
//参数说明:Address[IN]:寄存器地址
//返    回:读出的值
//******************************************************************/
unsigned char ReadRawRC(unsigned char Address)
{
  unsigned char i, ucAddr             ;
  unsigned char ucResult=0            ;
  NSS522_0                            ;
  SCK522_0                            ;
  ucAddr = ((Address<<1)&0x7E)|0x80   ;
  for(i=8;i>0;i--)
  {
    if((ucAddr&0x80)==0x80)
      SI522_1                         ;
    else
      SI522_0                         ;
    SCK522_1                          ;
    ucAddr <<= 1                      ;
    SCK522_0                          ;
  }
  for(i=8;i>0;i--)
  {
    SCK522_0                          ;
    SCK522_1                          ;
    ucResult <<=1                     ;
    ucResult |= SO522                 ;
    SCK522_0                          ;
  }
  SCK522_0                            ;
  NSS522_1                            ;
  return ucResult                     ;
}
//******************************************************************/
//功    能:写RC522寄存器
//参数说明:Address[IN]:寄存器地址
//          value[IN]:写入的值
//******************************************************************/
/*
void WriteRawRC(unsigned char Address, unsigned char value)
{  
    unsigned char i, ucAddr      ;
    NSS522_0                     ;
    SCK522_0                     ;
    ucAddr = ((Address<<1)&0x7E) ;
    for(i=8;i>0;i--)
    {
        if ((ucAddr&0x80)==0x80)
        {   SI522_1;   }
        else
        {   SI522_0;   }
        SCK522_1;
        ucAddr <<= 1;
        SCK522_0;
    }
    for(i=8;i>0;i--)
    {
        if ((value&0x80)==0x80)
        {   SI522_1;   }
        else
        {   SI522_0;   }
        SCK522_1;
        value <<= 1;
        SCK522_0;
    }
    SCK522_0;
    NSS522_1;
}
*/
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
www030
1楼-- · 2019-07-15 19:27
这个是我一直用读卡程序,时钟是8M,你可以参考一下:
/////////////////////////////////////////////////////////////////////
//功    能:读RC522寄存器
//参数说明:Address[IN]:寄存器地址
//返    回:读出的值
/////////////////////////////////////////////////////////////////////
unsigned char ReadRawRC(unsigned char Address)
{
     unsigned char i, ucAddr;
     unsigned char ucResult=0;
 
    &nbsp3OUT&=~(MF522_SCK | MF522_NSS);           //MF522_SCK = 0;F  //MF522_NSS = 0;
     ucAddr = ((Address<<1)&0x7E)|0x80;
  
     for(i=8;i>0;i--)
     {   
         if(ucAddr&0x80)  &nbsp3OUT|=MF522_MOSI;
         else             &nbsp3OUT&=~MF522_MOSI;
         __delay_cycles(8);
        &nbsp3OUT|=MF522_SCK;           // MF522_SCK = 1;
         ucAddr <<= 1;
         __delay_cycles(8);
        &nbsp3OUT&=~MF522_SCK;          //MF522_SCK = 0;
     }
    &nbsp3DIR&=~MF522_MISO;   
     for(i=8;i>0;i--)
     {
        &nbsp3OUT|=MF522_SCK;         //MF522_SCK = 1;
         ucResult <<= 1;
         __delay_cycles(8);
 ucResult|=((P3IN&MF522_MISO)==MF522_MISO);         //ucResult|=(bit)MF522_MISO;
        &nbsp3OUT&=~MF522_SCK;       //MF522_SCK = 0;
         __delay_cycles(8);
     }
    &nbsp3OUT|=MF522_NSS;          //MF522_NSS = 1;
    &nbsp3OUT|=MF522_SCK;          //MF522_SCK = 1;
     return ucResult;
     
}
/////////////////////////////////////////////////////////////////////
//功    能:写RC522寄存器
//参数说明:Address[IN]:寄存器地址
//          value[IN]:写入的值
/////////////////////////////////////////////////////////////////////
void WriteRawRC(unsigned char Address, unsigned char value)
{  
    unsigned char i, ucAddr;
   
    P3OUT&=~MF522_SCK;          //MF522_SCK = 0;
    P3OUT&=~MF522_NSS;          //MF522_NSS = 0;
    ucAddr = ((Address<<1)&0x7E);
    for(i=8;i>0;i--)
    {
if(ucAddr&0x80)   P3OUT|=MF522_MOSI;
else              P3OUT&=~MF522_MOSI;
       
        __delay_cycles(10);
        P3OUT|=MF522_SCK;         //MF522_SCK = 1;
        ucAddr <<= 1;
        P3OUT&=~MF522_SCK;        //MF522_SCK = 0;
        __delay_cycles(8);
    }
    for(i=8;i>0;i--)
    {
    if(value&0x80)   P3OUT|=MF522_MOSI;
    else             P3OUT&=~MF522_MOSI;
  
        P3OUT|=MF522_SCK;        //MF522_SCK = 1;
        __delay_cycles(10);
        value <<= 1;
        P3OUT&=~MF522_SCK;       //MF522_SCK = 0;
        __delay_cycles(8);
    }
    P3OUT|=MF522_NSS;           //MF522_NSS = 1;
    P3OUT|=MF522_SCK;            //MF522_SCK = 1;
}
还有一个地方就是这个函数,里面有一个等待时间,时间太短一样不能正确读取到卡
/////////////////////////////////////////////////////////////////////
//功    能:通过RC522和ISO14443卡通讯
//参数说明:Command[IN]:RC522命令字
//          pInData[IN]:通过RC522发送到卡片的数据
//          InLenByte[IN]:发送数据的字节长度
//          pOutData[OUT]:接收到的卡片返回数据
//          *pOutLenBit[OUT]:返回数据的位长度
/////////////////////////////////////////////////////////////////////
char PcdComMF522(unsigned char Command, 
                 unsigned char *pInData, 
                 unsigned char InLenByte,
                 unsigned char *pOutData, 
                 unsigned int  *pOutLenBit)
testd00222
2楼-- · 2019-07-15 23:50
帮顶。。。。。
送终鸡酒
3楼-- · 2019-07-16 04:21
求指导啊。。。
lhhgff
4楼-- · 2019-07-16 05:05
会不会是时钟设置有问题?明天把时钟调到8M晶振试试。。。
wei296
5楼-- · 2019-07-16 09:40
 精彩回答 2  元偷偷看……
那一年坏坏
6楼-- · 2019-07-16 14:03
楼主是如何解决的啊

一周热门 更多>