Mifare Classic 1K读取失败,PN532芯片

时间:2015-05-21 13:37:45

标签: nfc mifare

我有用于NFC的PN532芯片,我的主板通过SPI连接到它。我很害羞,这种联系很好(Mifare UL完全有效)。我有一些空白的1K经典卡,但有一些麻烦。 我的举动:

1)设置PN532(重试,SAM)

2)通过ListPassiveTarget命令为ISO14443A卡搜索卡

3)找到卡时,对某个扇区进行身份验证(必需block_number = sector_number * 4)

4)通过4个InDataExchange命令读取数据。必需的block_number = sector_number * 4 + 0,1,2,3。

5)转到第3步

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

我的代码,处理阅读:

// 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;
                            }                           
                        }
                    }

有什么不对?我错过了部门认证和读数之间的一些动作?

1 个答案:

答案 0 :(得分:0)

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