This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TRF7970A:仿真模式、问题仿真 Mif稀有 经典标签

Guru**** 2539500 points
Other Parts Discussed in Thread: DLP-7970ABP, TRF7970A

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/875494/trf7970a-emulation-mode-problem-emulating-mifrare-classic-tag

器件型号:TRF7970A
主题中讨论的其他器件: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 初始化();

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    [引用用户="ATL_ENG_EE"]

    1.能否使用直接模式模拟 MIFARE Classic?

    2.我是否需要为此使用特殊的直接模式?  

    3.目前我在 DLP-7870ABP 板上看不到专用仿真引脚。 您能验证这一点吗?

    [/报价]

    最近的 E2E 讨论表明 DM0可能无法实现卡仿真模式。 正如这些讨论中所述,我们无法调查或支持这种申请。

    2.无法评论,我们不知道也不会调查。

    正确、我们不再支持 DM0应用。 我们专注于 NFC 兼容技术和 MIFARE Classic 读取器示例是一个例外。

    此外、MIFARE Classic 是 NXP 的专有技术、德州仪器无法通过卡仿真在 IC 上复制其专有协议。