【问题标题】:Mifare Classic 1K reading fail with PN532 chip使用 PN532 芯片的 Mifare Classic 1K 读取失败
【发布时间】:2015-05-21 22:36:34
【问题描述】:

我有用于 NFC 的 PN532 芯片,我的电路板通过 SPI 连接到它。我很确定,这种连接很好(Mifare UL 完全有效)。我有一些空白的1K经典卡,有些麻烦。 我的动作:

1) 设置 PN532(重试,SAM)

2) 通过 ListPassiveTarget 命令搜索 ISO14443A 卡

3) 找到卡后,对某个扇区进行身份验证(需要 block_number = Sector_number * 4)

4) 通过 4 个 InDataExchange 命令读取数据。必填块数 = 扇区数 * 4 + 0, 1, 2, 3。

5) 转到第 3 步

第一个扇区读取没问题,我有一些很好的数据。但是当我在成功授权后尝试读取其他扇区时,我遇到了一个错误,比如我没有通过身份验证。 我试图读取扇区 0(OK),然后扇区 1..15 读取失败。 我尝试使用所有 block_num 计算(20、21、22、23 块)读取扇区 5(OK),然后扇区 6..15 读取失败。 我试图从现场取出卡片一分钟,将卡片放回现场并重复阅读 - 我无法读取任何扇区。只有重新启动有帮助。 我想,身份验证之间可能会有一些变化。典型的 HALT 命令没有帮助。 验证功能已测试 - 错误的密钥不起作用,赖特密钥有效。

我的代码,处理阅读:

// here we know card type
                // ISO 14443 A MIFARE CLASSIC 1K
                    // repeat polling
                    if( !ListPassiveTarget_14443A_106() )
                    {
                        // no card!
                        NFC_download = false;
                        break;
                    }
                    else 
                    {
                        if( !GetGeneralStatus() )
                        {
                            // no card!
                            NFC_download = false;
                            break;
                        }
                        else
                        {                               
                            if( NFC::Num_Of_Tg != 0 )
                            {
                                // 14443 A Mifare Classic
                                // 16 sectors, 4 blocks in each                     
                                for(u8 sector = 0; sector < 16; sector++)   // for all 16 sectors
                                {
                                // autentificate sector with A key

                                    u8 x = 0;
                                    for(x = 0; (x < 3) && (Autenticated == 0); x++) // loop for keys
                                    {
                                        Autenticated = Try_Mifare_Classic_Key( x, 0, sector );  // try A key
                                                                                                // block = sector*4
                                    }

                                    if( Autenticated != 0 )
                                    {
                                        // send up success and key num
                                        // uart send
                                        if( ((Uart::CommandTX_WPos + 1) & 0x0F) != Uart::CommandTX_RPos  )
                                        {
                                            // ok
                                            Uart::CommandTXBuf[Uart::CommandTX_WPos].Size = 4;  
                                            Uart::CommandTXBuf[Uart::CommandTX_WPos].Buf[0] = AUTH_CLASSIC;
                                            Uart::CommandTXBuf[Uart::CommandTX_WPos].Buf[1] = Autenticated; // key type
                                            Uart::CommandTXBuf[Uart::CommandTX_WPos].Buf[2] = x;            // key number
                                            Uart::CommandTXBuf[Uart::CommandTX_WPos].Buf[3] = sector;       // sector
                                            Uart::CommandTX_WPos = (Uart::CommandTX_WPos + 1) & 0x0F;
                                            Uart::commandSend();                                
                                        }

                                        // read all the sector
                                        Read_Mifare( sector*4 ); 
                                        Read_Mifare( sector*4 + 1); 
                                        Read_Mifare( sector*4 + 2); 
                                        Read_Mifare( sector*4 + 3); 

                                        // reboot card?
                                        //SPI::Wait(5500000); // 1000 ms delay  
                                        //Halt_Mifare();    // halt wont help   
                                        //SPI::Wait(550000);    // 100 ms delay                                     
                                    }                                   
                                }// for sectors
                            }
                            else
                            {
                                // no target
                                NFC_download = false;
                                break;
                            }                           
                        }
                    }

有什么问题吗?我错过了扇区身份验证和读数之间的一些动作?

【问题讨论】:

    标签: nfc mifare


    【解决方案1】:

    逻辑失败。忘记清除身份验证标志。现在它正在工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多