【发布时间】: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;
}
}
}
有什么问题吗?我错过了扇区身份验证和读数之间的一些动作?
【问题讨论】: