搜索
bottom↓
回复: 27

RC522寻卡失败求助

[复制链接]

出0入0汤圆

发表于 2012-4-27 23:38:47 | 显示全部楼层 |阅读模式
本帖最后由 sunshinetree 于 2012-4-27 23:42 编辑

我用的STM8L152C6单片机 我用的硬件SPI编写的程序 也基本上是例程修改的 总是寻不到卡 SPI能读到值 但是总是在运行到if(!(ReadRawRC(ErrorReg)&0x1B))这句时 读回来的值是0x45 然后就MI_ERROR了 有没有哪位大侠遇到过这个问题呢? 先谢过了

初始化是这样的
char PcdReset(void)
{
    RC522_RST_H();
    Delay(100);
    RC522_RST_L();
    Delay(100);
    RC522_RST_H();
    Delay(100);
    WriteRawRC(CommandReg,PCD_RESETPHASE);        //软复位RC522
    Delay(100);  
    WriteRawRC(ModeReg,0x3D);            //和Mifare卡通讯,CRC初始值0x6363
    WriteRawRC(TReloadRegL,30);           
    WriteRawRC(TReloadRegH,0);
    WriteRawRC(TModeReg,0x8D);
    WriteRawRC(TPrescalerReg,0x3E);       
    WriteRawRC(TxAutoReg,0x40);//必须要   
    return MI_OK;
}

void InitRc522(void)
{
   PcdReset();
   PcdAntennaOff();  
   PcdAntennaOn();
}


/////////////////////////////////////////////////////////////////////
//功    能:寻卡
//参数说明: req_code[IN]:寻卡方式
//                0x52 = 寻感应区内所有符合14443A标准的卡
//                0x26 = 寻未进入休眠状态的卡
//          pTagType[OUT]:卡片类型代码
//                0x4400 = Mifare_UltraLight
//                0x0400 = Mifare_One(S50)
//                0x0200 = Mifare_One(S70)
//                0x0800 = Mifare_Pro(X)
//                0x4403 = Mifare_DESFire
//返    回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdRequest(unsigned char req_code,unsigned char *pTagType)
{
        char  status;  
        unsigned int unLen;
        unsigned char  ucComMF522Buf[MAXRLEN];
        ClearBitMask(Status2Reg,0x08);
        WriteRawRC(BitFramingReg,0x07);
        SetBitMask(TxControlReg,0x03);

        ucComMF522Buf[0] = req_code;  //寻天线为进入休眠状态的卡

        status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);

        if ((status == MI_OK) && (unLen == 0x10))
        {   
                *pTagType     = ucComMF522Buf[0];
                *(pTagType+1) = ucComMF522Buf[1];
        }
        else
        {   status = MI_ERR;   }
   
        return status;
}
/////////////////////////////////////////////////////////////////////
//功    能:通过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)
{
    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);     //置ComIrqReg为0xff,               
    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 = 7000;//根据时钟频率调整,操作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;   //得出接受字节中的有效位,如果为0,全部位都有效
                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;
}

红色那行运行完后 我得到ErrorReg寄存器中的值是0X45 然后不满足条件就跳出了  我是初始化的问题?还是什么问题呢?




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-5-3 21:46:38 | 显示全部楼层
我是帮不上忙

出0入0汤圆

 楼主| 发表于 2012-5-4 13:32:54 | 显示全部楼层
valetang 发表于 2012-5-3 21:46
我是帮不上忙

那也谢谢您了 我找到问题了 我用的硬件SPI 在读寄存器的时候有点问题 我发地址的同时读取数据了 应该是发地址后 再发送个空数据后读取数据 谢谢您

出0入0汤圆

发表于 2012-5-8 12:46:31 | 显示全部楼层
楼主你好!我最近也在做RFID测试工作,我利用的是RC632+SST89E58做的读写器,测试ISO14443A协议,现在正在调试程序。我发送REQA或WUPA指令时,返回命令总是寻不到卡片,应该还是程序没有调试正确,寄存器没有设置正确,希望能向你学习请教...

出0入0汤圆

 楼主| 发表于 2012-5-9 21:23:40 | 显示全部楼层
smilelb 发表于 2012-5-8 12:46
楼主你好!我最近也在做RFID测试工作,我利用的是RC632+SST89E58做的读写器,测试ISO14443A协议,现在正在 ...

您好 我没有用过SST89E58 不过应该是一样的吧 我用的是STM8L152C6  用的是硬件SPI的通信方式 我之前一直也寻不到卡 最后发现是SPI的时序有点儿问题 你可以先查查是否通信正确 上电后初始化完直接读RFID芯片的寄存器的值 看看是不是和手册里初始化的值一样 如果不一样就证明是通信还不正确 如果是芯片手册里初始化的值那么可能是寻卡的程序有问题 我不知道RC522和RC632一样 我把调试好的程序贴出来 希望对你有帮助   

出0入0汤圆

 楼主| 发表于 2012-5-9 21:25:54 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-5-9 22:48:43 | 显示全部楼层
sunshinetree 发表于 2012-5-9 21:23
您好 我没有用过SST89E58 不过应该是一样的吧 我用的是STM8L152C6  用的是硬件SPI的通信方式 我之前一直 ...

谢谢~这个...觉得跟哪种单片机关系不是很大吧,主要还是寄存器值的设置吧。我读写器单片机与RC632之间是通过并口连接的。你说通过上电复位后查看RFID寄存器值检查通信,看是否和手册里的值一样,你说的手册是指什么手册呢?我手里只有RFID ISO14443协议和RC632 DATA SHEET。

出0入0汤圆

发表于 2012-5-9 22:50:22 | 显示全部楼层
sunshinetree 发表于 2012-5-9 21:23
您好 我没有用过SST89E58 不过应该是一样的吧 我用的是STM8L152C6  用的是硬件SPI的通信方式 我之前一直 ...

还有,我在论坛也发了帖子,请过去看看http://www.ourdev.cn/forum.php?m ... page%3D1#pid5809612

出0入0汤圆

 楼主| 发表于 2012-5-10 17:16:32 | 显示全部楼层
smilelb 发表于 2012-5-9 22:48
谢谢~这个...觉得跟哪种单片机关系不是很大吧,主要还是寄存器值的设置吧。我读写器单片机与RC632之间是 ...

RC632 DATA SHEET 和这个手册里的寄存器的默认值比较一下

出0入0汤圆

发表于 2012-5-10 18:51:25 | 显示全部楼层
sunshinetree 发表于 2012-5-10 17:16
RC632 DATA SHEET 和这个手册里的寄存器的默认值比较一下

和你那个文档RC522_SPI_RFID.rar比较吗?你那个是测试成功的代码么?

出0入0汤圆

 楼主| 发表于 2012-5-14 22:56:02 | 显示全部楼层
smilelb 发表于 2012-5-10 18:51
和你那个文档RC522_SPI_RFID.rar比较吗?你那个是测试成功的代码么?

不是和我那个代码比较 是和RC632应用手册里寄存器的默认值比较。  我的那个代码是我测试成功的

出0入0汤圆

发表于 2012-5-15 09:23:16 | 显示全部楼层
sunshinetree 发表于 2012-5-14 22:56
不是和我那个代码比较 是和RC632应用手册里寄存器的默认值比较。  我的那个代码是我测试成功的 ...

我需要配置寄存器值应该是与14443A对应的啊,可是,632手册里的默认值不是对应632的。我给你看我修改后的情况,我根据手册一个一个的寄存器修改的,但是可能有错误。

//////////////////////////////////////////////////////////////////////
//设置RC632的工作方式
//////////////////////////////////////////////////////////////////////
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,0x3F);   //配置输出驱动的电导系数     /////////////////                     
       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,0x28);  // 控制解调,28(2C),68,08    P45    ////                              
       WriteRawRC(RegBitPhase,0xAD);        //设定发送与接收时钟间的相位关系                        
       WriteRawRC(RegRxThreshold,0xAA);   //设定位解码阈值,88   FF    初值AA     /////////  ////                                       
       WriteRawRC(RegBPSKDemControl,00);   //控制BPSK解调   
       WriteRawRC(RegRxControl2,0x41);     //控制解调,并定义接收机decoder的输入   

       WriteRawRC(RegRxWait,0x06);      //
       WriteRawRC(RegChannelRedundancy,0x03);  //  
       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           
       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;
}

出0入0汤圆

 楼主| 发表于 2012-5-17 21:12:17 | 显示全部楼层
smilelb 发表于 2012-5-15 09:23
我需要配置寄存器值应该是与14443A对应的啊,可是,632手册里的默认值不是对应632的。我给你看我修改后的 ...

我还真帮不了您了 我也是做毕设才搞的这个 没弄两天 帮您定一下看看有没有哪位大侠看到

出0入0汤圆

发表于 2012-5-17 21:58:34 | 显示全部楼层
sunshinetree 发表于 2012-5-17 21:12
我还真帮不了您了 我也是做毕设才搞的这个 没弄两天 帮您定一下看看有没有哪位大侠看到 ...

我已经懂了,弄出来了,不过也谢谢你啊。。。

出0入0汤圆

发表于 2012-7-13 10:26:35 | 显示全部楼层
你好 请问你的522调试成功没  我也是毕业设计做这个 用430单片机硬件SPI通讯,之后读复位后的值是对的,复位跟寻卡是根据DEMO直接调用的。但是每次寻卡都失败,返回值len一直为0,读fifolevel也为0。我的天线是在网上买的模块。

出0入0汤圆

发表于 2012-7-13 10:29:13 | 显示全部楼层
主要代码如下
void main(void)
{
  char temp,result,i=3;
  SYS_init();
  
  P3DIR |=BIT5+BIT0;
  P4OUT &=0X00;
  P4DIR |=0X01;
  PcdReset();
  while(i--)
  {result = ReadRawRC(0x02);
    if (result != 0x80)
         {   
             P4OUT &=~0X01;
             continue;
         }
         //LED_GREEN_ON;     //检测到有卡存在
         P4OUT |=0X01;
  }                         //复位读值正确说明此部分代码没有问题。*/
  //P3OUT &=~BIT5;
  PcdAntennaOff();
  PcdAntennaOn();
  M500PcdConfigISOType('A');
  while(1)
  {
   
    volatile unsigned int i;
    volatile unsigned char temp,count;
    char status;
   
    status = PcdRequest(PICC_REQALL,g_ucTempbuf);
       if (status != MI_OK)
         {   
             P4OUT &=~0X01;
             continue;
         }
         //LED_GREEN_ON;     //检测到有卡存在
         P4OUT |=0X01;      // 检测到有卡存在则蜂鸣器响
         
  }

char M500PcdConfigISOType(unsigned char type)
{
   if (type == 'A')                     //ISO14443_A
   {
       ClearBitMask(Status2Reg,0x08);
       WriteRawRC(ModeReg,0x3D);//3F
       WriteRawRC(RxSelReg,0x86);//84
       WriteRawRC(RFCfgReg,0x7F);   //4F
              WriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec)
           WriteRawRC(TReloadRegH,0);
       WriteRawRC(TModeReg,0x8D);
           WriteRawRC(TPrescalerReg,0x3E);
           _NOP();
           _NOP();;
             _NOP();
       PcdAntennaOn();
   }
   else{ return -1; }
   
   return MI_OK;
}

/////////////////////////////////////////////////////////////////////
//功    能:复位RC522
//返    回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdReset()
{
    RST522_1;
    _NOP();
    RST522_0;
    _NOP();
    RST522_1;
    _NOP();
    WriteRawRC(CommandReg,PCD_RESETPHASE);      //发送复位命令
    _NOP();
  
    WriteRawRC(ModeReg,0x3D);               //定义常规模式00111101
    WriteRawRC(TReloadRegL,30);             //内部时钟装载值
    WriteRawRC(TReloadRegH,0);
    WriteRawRC(TModeReg,0x8D);              //定义106kbit/s允许CRC
    WriteRawRC(TPrescalerReg,0x3E);         //分频值定时62*30/6.78us
    WriteRawRC(TxAutoReg,0x40);     //必须要
    return MI_OK;
}


/////////////////////////////////////////////////////////////////////
//功    能:读RC522寄存器
//参数说明:Address[IN]:寄存器地址
//返    回:读出的值
/////////////////////////////////////////////////////////////////////
unsigned char ReadRawRC(unsigned char Address)
{
     unsigned char  ucAddr;
     unsigned char ucResult=0;
     
     NSS522_1;
     _NOP();
     _NOP();
     NSS522_0;
     _NOP();
     //_NOP();
     //_NOP();
     ucAddr = ((Address<<1)&0x7E)|0x80;     //最高位置1表示读
     SPI_WRITE(ucAddr);                     //发送读地址
     _NOP();
     _NOP();
     _NOP();
     _NOP();
     SPI_WRITE(0);
     ucResult = SPI_READ();                      //读地址。
     NSS522_1;
     return ucResult;
     
}

出0入0汤圆

 楼主| 发表于 2012-7-15 22:49:50 | 显示全部楼层
lincut 发表于 2012-7-13 10:29
主要代码如下
void main(void)
{

你的那个能够正确读取寄存器的默认值么?

出0入0汤圆

发表于 2013-3-29 18:06:08 | 显示全部楼层
sunshinetree 发表于 2012-7-15 22:49
你的那个能够正确读取寄存器的默认值么?

我也遇到问题了。现在读寄存器出来的数据和复位值是一样的。但是写寄存器却总是写不进去。写进去。再读出来,还是复位值

出0入0汤圆

 楼主| 发表于 2013-4-2 20:11:31 | 显示全部楼层
sunchao151 发表于 2013-3-29 18:06
我也遇到问题了。现在读寄存器出来的数据和复位值是一样的。但是写寄存器却总是写不进去。写进去。再读出 ...

我觉得你可能写寄存器的程序有问题

出0入0汤圆

发表于 2013-4-2 21:33:50 | 显示全部楼层
sunshinetree 发表于 2013-4-2 20:11
我觉得你可能写寄存器的程序有问题

#define RC522_RST_1()                   P2OUT |= BIT5;
#define RC522_RST_0()                   P2OUT &= ~BIT5;

#define RC522_NSS_1()                        P1OUT |= BIT4
#define RC522_NSS_0()                        P1OUT &= ~BIT4

  #define RC522_SCK_1()                        P1OUT |= BIT5
  #define RC522_SCK_0()                        P1OUT &= ~BIT5
  
  #define RC522_MOSI_1()                P1OUT |= BIT7
  #define RC522_MOSI_0()                P1OUT &= ~BIT7
  
  #define RC522_MISO()                  ((P1IN & BIT6)>>BIT6)

void Init_Spi(void)
{
   P2DIR  |= BIT5;     //Reset RC522 PIN
     
   P1DIR |= BIT4+BIT5+BIT7;
   P1DIR &=~BIT6;
}  
   
void Spi_SendByte(unsigned char ucData)
{
  unsigned char i;
  RC522_SCK_0();
  for (i = 0; i < 8; i++)
  {
    if ((ucData & 0x80) == 0x01)
      RC522_MOSI_1();
    else
      RC522_MOSI_0();
    RC522_SCK_1();
    ucData <<= 1;
    RC522_SCK_0();
  }  
  RC522_SCK_0();
}

unsigned char Spi_RecvByte(void)
{
  unsigned char i;
  unsigned char ucData = 0x00;
  RC522_SCK_0();
  for (i = 0; i < 8; i++)
  {
    RC522_SCK_1();
    ucData <<= 1;
    ucData |= RC522_MISO();
    RC522_SCK_0();   
  }
  RC522_SCK_0();
  return (ucData);
}

/*****************************************************************************
** Function name:                ReadRawRC
**
** Descriptions:                读RC寄存器
** parameters:                        ucAddress - 寄存器地址(1 xxxxxx 0)
** Returned value:                返回读取数据
**
*****************************************************************************/
unsigned char ReadRawRC(unsigned char ucAddress)
{
  unsigned char ucData;
  RC522_NSS_0();
  Spi_SendByte((ucAddress<<1)&0x7E|0x80);// 发送读取寄存器地址(最低位为0,中间6位为实际地址,最高位为1)
  ucData = Spi_RecvByte();
  Spi_SendByte(0x00);
  ucData = Spi_RecvByte();
  RC522_NSS_1();  
  return (ucData);  
}
//******************************************************************/
//功    能:写RC522寄存器
//参数说明:ucAddress[IN]:寄存器地址
//          ucvalue[IN]:写入的值
//******************************************************************/
void WriteRawRC(unsigned char ucAddress, unsigned char ucValue)
{
  RC522_NSS_0();  
  Spi_SendByte((ucAddress<<1)&0x7E);  
  Spi_SendByte(ucValue);
  RC522_NSS_1();
}

请帮我看看,用的MSP430G2553

出0入0汤圆

发表于 2013-4-22 15:02:51 | 显示全部楼层
sunchao151 发表于 2013-4-2 21:33
#define RC522_RST_1()                   P2OUT |= BIT5;
#define RC522_RST_0()                   P2O ...

发现写出去,再读回来值不一样,RC522是怎么区别是读还是写的操作?

出0入0汤圆

发表于 2013-4-22 15:06:57 | 显示全部楼层
sunchao151 发表于 2013-4-2 21:33
#define RC522_RST_1()                   P2OUT |= BIT5;
#define RC522_RST_0()                   P2O ...

比如:我往0x01地址写入0x0f再读回来,操作是这样的

unsigned char ReadRawRC(unsigned char Address)
{
        unsigned char data;
        GPIO_WriteBit(MFRC522_NSS_GPIO, MFRC522_NSS_PIN, Bit_RESET);                    //片选=0
        while (GPIO_ReadInputDataBit(MFRC522_NSS_GPIO, MFRC522_NSS_PIN)== Bit_SET);
        SPIWriteByte(Address);                                                                                    //发送地址
        data = SPIWriteByte(0);
        delay(1);
        GPIO_WriteBit(MFRC522_NSS_GPIO, MFRC522_NSS_PIN, Bit_SET);                           //片选=1
        return(data);
}

void WriteRawRC(unsigned char Address, unsigned char value)
{
        u8 tmp;
        GPIO_WriteBit(MFRC522_NSS_GPIO, MFRC522_NSS_PIN, Bit_RESET);                   //片选=0
        while (GPIO_ReadInputDataBit(MFRC522_NSS_GPIO, MFRC522_NSS_PIN)== Bit_SET);
        SPIWriteByte(Address);                                                                                   //发送地址
        SPIWriteByte(value);                                                                                           //发送值
        delay(1);
        GPIO_WriteBit(MFRC522_NSS_GPIO, MFRC522_NSS_PIN, Bit_SET);                           //片选=1

        tmp=ReadRawRC(Address);
        printf("W = %x, R = %x\n", value, tmp);
}

写入0x0f, 读回是0x01

出0入0汤圆

发表于 2013-4-22 15:16:16 | 显示全部楼层
sunshinetree 发表于 2013-4-2 20:11
我觉得你可能写寄存器的程序有问题

我的配置有问题么?

出0入0汤圆

发表于 2013-4-23 12:43:43 | 显示全部楼层
worldsing 发表于 2013-4-22 15:06
比如:我往0x01地址写入0x0f再读回来,操作是这样的

unsigned char ReadRawRC(unsigned char Address)

先确保SPI通讯正常。再试着读写寄存器,看看是否正常。

你的 SPIWriteByte(Address);  这个ADDRESS请看一下DATASHEETS。第7位和第0位

下面是我的读写寄存器程序,你参考一下。

unsigned char ReadRawRC(unsigned char ucAddress)
{
  unsigned char ucData;
  RC522_NSS_0();
  Spi_SendByte((ucAddress<<1)&0x7E|0x80);// RC522发送读取寄存器地址(最低位为0,中间6位为实际地址,最高位为1)
  ucData = Spi_RecvByte();
  Spi_SendByte(0x00);                    // 重要(查看RC522数据手册——时钟时序)
  ucData = Spi_RecvByte();
  RC522_NSS_1();  
  return (ucData);  
}
//******************************************************************/
//功    能:写RC522寄存器
//参数说明:ucAddress[IN]:寄存器地址
//          ucvalue[IN]:写入的值
//******************************************************************/
void WriteRawRC(unsigned char ucAddress, unsigned char ucValue)
{
  RC522_NSS_0();  
  Spi_SendByte((ucAddress<<1)&0x7E);  
  Spi_SendByte(ucValue);
  RC522_NSS_1();
}

出0入0汤圆

发表于 2013-4-23 21:27:30 | 显示全部楼层
sunchao151 发表于 2013-4-23 12:43
先确保SPI通讯正常。再试着读写寄存器,看看是否正常。

你的 SPIWriteByte(Address);  这个ADDRESS请看 ...

嗯,搞定了,是读写时序的问题

出0入0汤圆

发表于 2013-5-15 15:17:48 | 显示全部楼层
worldsing 发表于 2013-4-23 21:27
嗯,搞定了,是读写时序的问题

您好,我遇到了同您一样的问题。能请教一下您怎么解决的么?
我用的LPC1758的SPI
下面的是程序
uint8_t SPI_TranByte(uint8_t t_data){
        uint8_t r_data;
        P_SS_L();                                                        //选择从机
        LPC_SPI->SPDR=t_data;                                //把需要发送的数据写入SPI数据寄存器
       
        while((LPC_SPI->SPSR&0x80)==0);        //当SPIF等于1的时候表示,一次数据传输完成,等待SPIF等于1退出循环
        r_data=LPC_SPI->SPDR;                                 //返回接收到的数据
        delay_us(2);
        P_SS_H();                                                        //释放从机
       
        return(r_data);                                                //返回接收到的数据
}

出0入0汤圆

发表于 2013-5-16 21:17:09 | 显示全部楼层
lixiuzhu0 发表于 2013-5-15 15:17
您好,我遇到了同您一样的问题。能请教一下您怎么解决的么?
我用的LPC1758的SPI
下面的是程序

你用显示波器量一下时序,保证时序对了再调模拟部分

出0入8汤圆

发表于 2014-10-23 13:48:48 | 显示全部楼层
今天刚搞这个,先学习~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 11:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表