我有用于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;
}
}
}
有什么不对?我错过了部门认证和读数之间的一些动作?
答案 0 :(得分:0)
逻辑失败。忘了清除身份验证标志。现在它正在运作。