主题中讨论的其他器件:DLP-7970ABP、
您好!
我正在尝试使用 DLP-7970ABP 开发板以 STM32F7 (在192Mhz 下运行) 作为主机来模拟 Mifare 经典标签。
我已将 STM32正确连接到 DLP 板。 (3V、GND、SPI MOSI、MISO、SPI_CLK、 SPI_CS、EN、IRQ 和复位)。
我可以通过主机与 TRF7970A 芯片进行通信、而不会出现任何问题。 来自 TRF7970A 的 IRQ 信号也在工作。
首先、我可以对纯 ISO14443A UID 进行仿真、而不会出现任何问题。 (完全仿真 ISO14443A)。 我的读取器可以毫无问题地读取它。 此仿真不需要与读取器进行任何实时主机交互、对寄存器进行编程后、UUID 将自动传输。
现在、我尝试使用仿真 Mifare Classic。 我找到了这个 HydraBus/HydraNFC 用于 Mifare Classic 的仿真示例代码。 我查看了代码、它似乎与 NXP 的 Mifare Classic Standard 相匹配。 这看起来是一个正常的项目、因为它们还利用 TRF7970A 制作硬件板(您可以从此处 访问原始源代码 https://github.com/hydrabus/hydrafw/tree/master/src/hydranfc)
我将仿真代码和 SPI 代码移植到 STM32。 但是、当我使用 Mifare 经典仿真时、我无法让读取器读取此标签。
我从读取器接收到第一个请求(REQA 或 WUPA)、我通过 0x04、0x00进行响应、然后我应该得到 ANTICOLL。 但我没有得到 0x93、0x20的 ANTICOLL 响应。 我得到随机字节或3个0。
主机正在运行192mhz、因此速度快、并且可以提供快速响应。 我不确定这是否与时序相关的问题。 我尝试增加延迟、因为我的处理器是速度相当快的 MCU。
这是我的困境:
1.能否使用直接模式模拟 MIFARE Classic?
2.我是否需要为此使用特殊的直接模式?
3.目前我在 DLP-7870ABP 板上看不到专用仿真引脚。 您能验证这一点吗?
我的任务是验证我是否可以在 TI 芯片上完成此工作、如果可以、我们希望从 NXP 设计转向 TI 设计、因为 TI 同时支持 ISO14443A 和 B。如果有任何帮助、我们将不胜感激。 我的示例代码如下所示。
void 水合物 fc_tag_emul_init (void)
{
uint8_t data_buf[4];
Trf797xInitialSettings();
Trf797xResetFIFO();
/* ISO 控制*/
DATA_Buf[0]= ISO_CONTROL;
DATA_BUF[1]= 0x24;/* ISO14443A */
Trf797xWriteSingle (data_buf、2);
/*配置 RX */
DATA_Buf[0]= RX_SPECIAL_SETTINGS;
DATA_BUF[1]= 0x3C;
Trf797xWriteSingle (data_buf、2);
/*配置可调节 FIFO IRQ 电平寄存器(96B RX 和32B TX)*/
DATA_BUF[0]= 0x14;
DATA_BUF[1]= 0x0F;
Trf797xWriteSingle (data_buf、2);
/*配置 NFC 目标方侦测水平寄存器*/
系统唤醒至最大值所需的/* RF 场水平*/
DATA_BUF[0]= NFC_TARGET_LEVEL;
DATA_Buf[1]= NFC_TARGET_LEVEL;
DATA_BUF[2]= 0x16;// NFC_LOW_DETECTing
DATA_Buf[3]= BIT0;
//读取 NFCTargetLevel 寄存器
Trf797xReadSingle (&data_buf[1]、1);
DATA_Buf[1]|= BIT2 + BIT1 + BIT0;
switch (tag_uid_len){
案例4:
DATA_Buf[1]=~(BIT7 + BIT6);
中断;
案例7:
DATA_Buf[1]&=~BIT7;
DATA_Buf[1]|= BIT6;
中断;
案例10:
DATA_Buf[1]&&~BIT6;
DATA_Buf[1]|= BIT7;
中断;
默认值:
中断;
}
DATA_Buf[1]|= BIT5;//启用 SDD *
Trf797xWriteSingle (data_buf、2);
DATA_Buf[0]= ISO_14443B_OPTIONS;
DATA_Buf[1]= ISO_14443B_OPTIONS;
Trf797xReadSingle (&data_buf[1]、1);
DATA_Buf[1]|= BIT0;//设置14443A - 4兼容位
DATA_Buf[2]= CHIP_State_control;
DATA_BUF[3]= 0x21;
Trf797xWriteSingle (data_buf、4);
/*配置测试寄存器*/
/* MOD 引脚成为接收器数字化副载波输出*/
/*
DATA_Buf[0]= TEST_SETTINGS_1;
DATA_BUF[1]= 0x40;
Trf797xWriteSingle (data_buf、2);
DATA_Buf[0]=调制器控制;
DATA_Buf[1]=调制器控制;
Trf797xReadSingle (&data_buf[1]、1);
data_buf[1]|= BIT3;
Trf797xWriteSingle (data_buf、2);
*
write_emul_tag_uid (tag_uid);
Trf797xResetIrqStatus();
Trf797xResetFIFO();
Trf797xStopDecoders();
Trf797xRunDecoders();
}
void 水合物 fc_emul_MIFARE 状态(void)
{
uint8_t data_buf[32];
int fifo_size;
INT 错误;
误差= 0;
/*读取 FIFO 状态(0x1C=>0x5C)*/
DATA_Buf[0]= FIFO_CONTROL;
Trf797xReadSingle (data_buf、1);//确定 FIFO 中剩余的字节数
FIFO_SIZE = DATA_BUF[0]和0x7F;//清除标志 FIFO 溢出*
FIFO_SIZE = FIFO_SIZE 和0x1F;//将 FIFO 大小限制为31字节*/
if (fifo_size > 0)
{
DATA_Buf[0]= FIFO;
Trf797xReadCont (data_buf、fifo_size);
//trace_hex (" data"、data_buf、fifo_size);
}
//trace ("状态%d fifo_size %d"、水合物 fc_emul_14443A_state、fifo_size);
switch (cianfc_emul_14443A_state){
案例 EMUL_RX_MIFARE_REQA:
//跟踪("EMUL_RX_MIFARE REQA %d"、Fifo_size);
//跟踪("fifo_size %d"、fifo_size);
if (fifo_size = 1){
//data_buf[0]= FIFO;
//Trf797xReadCont (data_buf、fifo_size);
if (data_buf[0]= ISO14443A_REQA || data_buf[0]= ISO14443A_WUPA){
/*用 ATQA 0x04 0x00回复*/
DATA_BUF[0]= ISO14443A_ATQA_BYTE0;
DATA_BUF[1]= ISO14443A_ATQA_BYTE1;
WAIT_nbcycles (3791);
if (emul_MIFARE TX_rawdata (data_buf、2、0)== 2)
水合物 fc_emul_14443A_state = EMUL_RX_MIFARE _ANTICOL;
//trace (">>ISO14443A_REQA");
}否则{
/*无效/不支持的 RX 数据*/
/* TODO 支持 WUPA ... *
trace_hex (" REQA 数据"、data_buf、fifo_size);
错误= 1;
}
}
其他
{
跟踪(" REQA 大小不正确%d "、fifo_size);
错误= 1;
}
中断;
案例 EMUL_RX_MIFARE_ANTICOL:
跟踪("EMUL_RX_MIFARE ANTICOL %d"、Fifo_size);
if (fifo_size = 2){
//data_buf[0]= FIFO;
//Trf797xReadCont (data_buf、fifo_size);
//trace_hex ("resp"、data_buf、fifo_size);
if (
(DATA_BUF[0]= ISO14443A_ANTICOLL_BYTE0)&&
(DATA_BUF[1]= ISO14443A_ANTICOLL_BYTE1)){
/*使用 UID + BCC 回复=>无 CRC*/
DATA_Buf[0]=字节0;
DATA_Buf[1]=字节1;
DATA_Buf[2]=字节2;
data_buf[3]=字节3;
data_buf[4]=字节4;
WAIT_nbcycles (2378);
if (emul_MIFARE TX_rawdata (data_buf、5、0)== 5)
水合物 fc_emul_14443A_state = EMUL_RX_MIFARE SEL_UID;
}否则{
trace_hex (" ANTICOL 数据"、data_buf、fifo_size);
错误= 1;
}
}否则{
跟踪(" ANTICOL 大小不正确%d "、Fifo_size);
错误= 1;
}
中断;
案例 EMUL_RX_MIFARE SEL_UID:
跟踪("EMUL_RX_MIFARE SEL_UID");
if (fifo_size >= 9){
//data_buf[0]= FIFO;
//Trf797xReadCont (data_buf、fifo_size);
/*读取数据、它应该是 SEL UID (2B)+ UID/BCC (5B)+ 2B CRC */
/*请勿检查 CRC16... 待稍后完成*/
if (
(DATA_Buf[0]= ISO14443A_SEL_UID_BYTE0)&&
(DATA_Buf[1]= ISO14443A_SEL_UID_BYTE1)&&
(DATA_Buf[2]==字节0)&&
(DATA_Buf[3]=byte1)&&
(DATA_Buf[4]=byte2)&&
(DATA_Buf[5]=字节3)&&
(data_buf[6]=字节4)){
/*用 SAK + CRC 回复*/
DATA_Buf[0]= ISO14443A_SAK;
WAIT_nbcycles (322);
if (emul_MIFARE TX_rawdata (data_buf、1、1)= 1){
水合物 fc_emul_14443A_state = EMUL_RX_MIFARE MIFARE;
}否则{
错误= 1;
}
}否则{
trace_hex (" SEL_UID data"、data_buf、fifo_size);
错误= 1;
}
}
其他
{
跟踪(" SEL_UID 大小不正确%d "、Fifo_size);
错误= 1;
}
中断;
案例 EMUL_RX_MIFARE MIFARE _MIFARE:
跟踪("EMUL_RX_MIFARE MIFARE _MIFARE CMD");
//data_buf[0]= FIFO;
//Trf797xReadCont (data_buf、fifo_size);
if (fifo_size > 2){
if ((DATA_BUF[0]= 0x50)&&
(DATA_Buf[1]=0x00))
{
/*暂停*/
错误= 2;
}
其他
{
DATA_BUF[0]= 0;
DATA_BUF[1]= 0;
DATA_Buf[2]= 0;
DATA_BUF[3]= 0;
if (emul_MIFARE TX_rawdata (data_buf、4、1)== 4){
水合物 fc_emul_14443A_state = EMUL_RX_MIFARE _REQA;
}否则{
错误= 1;
}
}
}否则
错误= 2;
中断;
默认值:
跟踪("已知状态");
错误=3;
中断;
}
/*协议错误*/
if (error > 0){
//跟踪(“错误%d”,错误);
水合物 fc_emul_14443A_state = EMUL_RX_MIFARE _REQA;
/*在状态错误时重新初始化 TRF7970A */
DATA_Buf[0]= SOFT_INIT;
Trf797xDirectCommand (data_buf);
DATA_Buf[0]=空闲;
Trf797xDirectCommand (data_buf);
水合物 fc_emul_MIFARE 初始化();
}
}