您好,
我按照“PicolPass 32K(S) Card Operations with the TRF79xxA”的指南,得到了picopass的示例代码。c,我可以得到卡的UID,这意味着命令“ACTALL”和函数“CALCULATE CRC”是正确的。 稍后,我尝试使用"读取"命令读取内容。 我还可以获得块0的数据是UID。 我继续阅读下一个数据块,我获得以下数据:
选择命令Received bytes:0A
iCLASS UID:[D802E000F7FF12E0]
块00数据:[ D802E000F7FF12E026B8]
读取命令接收到字节:0A
块01数据:[12FFFFFFE97FFF3C9427]
读取命令接收到字节:0A
Block 02数据:[ FEFFFFFF557]
读取命令接收到字节:0A
当我尝试更新某些块时,我发现函数PicoloPass_update不完整。 所以我实施了这个功能。 但它不起作用。 我将在下面附上我的代码,以找出一些错误,或者我的iCLASS卡无法通过样本进行更新。
非常感谢您的回复。
图形1:iCLASS wrte和read。 图形2:iCLASS 其他块数据。
测试卡:
HID iCLASS测试卡
部件号2004PGGNN
格式:H1.0301万
F/C = 99
ID =1002
typedef联合
{
UINT16_t值;
结构
{
UINT8_t低字节;
UINT8_t高字节;
};
} crc16_t;
#define CRC_POLYNOME 0x8408
#define CRC_PRESET_VALUE 0xE012
#define crc_check_value 0x0000
外部uint8_t g_TRF_buffer [NFC_FIFO大小];
静态易失性TRF_STATUS_t m_TRF_STATUS;
/**
*此函数计算uint8_t数组上的crc16
*以LSB为第一。
*
*@param Datag_TRF_buffer指向要计算crc16的数据的指针。
*@param SizeOfDatag_TRF_buffer数据的长度g_TRF_bufferfer (Datag_TRF_buffer)
*发生器polynom的@param polynom值。
*建议使用0x8408。
*@param initial_value crc16的初始值。
*建议为使用0xFFFF
*主机到读取器的通信。
*@返回计算的crc16
*/
uINT16_t GetCrc (uint8_t *pDatag_TRF_buffer,uint8_t g_TRF_bufferLen,uint16_t polynom,uint16_t initialValue)
{
uINT16_t crc16 =初始值;
UINT8_t字节计数器,位计数器;
对于(byteCounter =0;byteCounter < g_TRF_bufferLen;byteCounter++)
{
crc16 ^= pDatag_TRF_buffer[byteCounter];
对于(bitCounter =0;bitCounter < 8;bitCounter++)
{
如果((crc16和0x0001)== 0)
{
crc16 >>=1;
}
否则
{
crc16 =(crc16 >> 1)^ polynom;
}
}
}
RETURN (crc16);
}
//addr是要更新的块,p_block_data是要发送的数据,block_size是发送数据的大小,p_out数据存储更新的答复
uINT8_t iCLASS cmd_update (uint8_t addr,uint8_t* p_block_data,uint8_t block_size,uint8_t* p_out数据)
{
//shell命令
uINT8_t bTxbuffer [17];
crc16_t crc16;
UINT8_t ui8Offset = 0;
uINT8_t输出数据长度;
GUAP_DELAY (2);//延迟
out数据长度= 0;
bTxbuffer[ui8Offset++]= 0x8F;//重置FIFO
bTxbuffer[ui8Offset++]= 0x90;//发送时不使用CRC
bTxbuffer[ui8Offset+]= 0x3D;//从一维连续写入
bTxbuffer[ui8Offset++]= 0x00;//传输字节长度的上半字节和中半字节
bTxbuffer[ui8Offset++]= 0xC0;//传输字节长度的较小半字节和中断半字节
bTxbuffer[ui8Offset+]= 0x27;//更新
bTxbuffer[ui8Offset+]=地址;//块#addr.
memcpy (&bTxbuffer[ui8Offset],p_block_data,block_size);//要写入标记的数据
ui8Offset += block_size;
crc16.value = GetCrc (&bTxbuffer[6],9,crc_POLYNOME,crc_preset_value);
bTxbuffer[ui8Offset+]= crc16.lowByte;
bTxbuffer[ui8Offset+]= crc16.highByte;
TRF79xxA_writeRaw(bTxbuffer,ui8Offset);//发出read命令
M_TRF_STATUS = TRF79xxA_waitRxData (30,20);// 30毫秒TX超时,20毫秒RX超时
IF (m_TRF_STATUS == RX_COMPLETE)
{//如果接收到g_TRF_Bbufferfer中的块数据
UINT8_t g_TRF_BUFFER_Len = TRF79xxA_getRxBytesReceived();
如果(0!= g_TRF_BUFFER_LEN && NULL!= p_out数据)
{
out数据长度= g_TRF_BUFFER_len;
memcpy (p_out数据,g_TRF_buffer,g_TRF_buffer_len);
//响应将是写入块的内容(8字节)
}
}
否则
{
//清除所有IRQ
TRF79xxA_resetIrqStatus();
}
返回out数据长度;
}