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.

[参考译文] TRF7960A:TRF7960An´t μ s 检测标签

Guru**** 2536630 points
Other Parts Discussed in Thread: TRF7960A, TRF7970A

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

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/581523/trf7960a-trf7960a-doesn-t-detect-tag

器件型号:TRF7960A
主题中讨论的其他器件: TRF7970A

您好!

我在´m MCU STM32F101RB 的 TRF7960A 上工作、我的程序遵循以下步骤。

1-启用 TRF EN=0 -> EN=1

延迟10ms

3-发送格式为0x83的 TRF DE 命令0x03。 (我这么做是因为我希望所有寄存器都处于默认模式)

4延迟5ms

如数据表所述、5-发送至 TRF 单槽清单0x8F 0x91 0x3D 0x00 0x30 0x26 0x01 0x00

6-Write in register 0x00、0x20

7写入 ISO 控制

7.1-写入寄存器0x01、0x02

7.2-写入寄存器0x0D、0x3E

7.3-写入寄存器0x09、0x31

7.4-写入寄存器0x06、0x80

7.5-写入寄存器0x07、0x14

7.6-写入寄存器0x08、0x1F

7.7-

7.7.7.1-读取 寄存器0x0A、0xYY

7.7.7.2-0xYY &= 0x0F

7.7.3.3-0xYY |= 0x40

7.7.4.4-写入 寄存器0x0A、0xYY

7.8-

7.8.1-读取 寄存器0x10、0xYY

7.8.2-0xYY |= 0xEF

7.7.3.3-写入 寄存器0x10、0xYY

7.9-写入寄存器0x14、0x0C

8 -    如数据表所述、发送到 TRF 单槽清单0x8F 0x91 0x3D 0x00 0x30 0x26 0x01 0x00

9-等待 IRQ,

10 -接收 IRQ

11-使用0x6C 和虚拟时钟进行提问

12-RIVE A 0x80

13-接收 IRQ

11 -询问0x5C

12-Rive a 0x23、这就是问题所在

我应该n´t 一个0x60、我不知道如何管理该数据及其含义。 可以帮帮我吗?

     

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

    当您接收到 IRQ 时、您需要读取 IRQ 状态、而不是 FIFO 状态。 因此、您需要按照每次收到 IRQ 时的说明"使用0x6C 和虚拟时钟进行询问"。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    当我接收到一个 IRQ、并询问0x6C、总是用0x80来回答。 这可能是由于虚拟时钟未正确发送而发生的? 因此、TRF´s IRQ 不会复位、并且会持续生成相同的中断? 你怎么看?

    我向您发送了三个示波器捕获、用于解释问题可能是什么。 图0显示了 IRQ 之后的完整通信。 图1、在接收到 IRQ 后、我向 TRF 发送0x6C。 然后、在图2中、您可以看到 TRF 的答案、答案是0x80。 我想问题出现在这里。 当我接收到来自 MISO 的应答(预期的应答0x80)时。 同时 (由于 SPI 配置错误)我再次发送0x6C。 n´t 数据可能会在虚拟时钟周期中生成该数据、尽管发送0x00作为虚拟时钟、TRF 仍然使用0x80应答、但这种情况会以某种方式影响到正确的操作、因此我无法读取标签。 你怎么看?

    谢谢

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

    Jiseba 您好!

    当接收到0x80命令时、MOSI 线路看起来不会保持低电平。 这可能会导致一些问题。 我从未真正看到过 MOSI 线路在接收0x80时尝试重新发送0x6C 的行为。 请尝试修复该行为、以便您的读取和虚拟时钟看起来与此类似(还显示了使用虚拟时钟进行的 FIFO 复位)

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

    你好!

    我已经解决了 MISO 正在发送时 MOSI 数据发送的问题、我发送了0x8F 和虚拟读取、但仍在继续进行 IRQ、为什么会发生这种情况?

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

    您好!

    我已经解决了最后一个问题、但现在当我向 DE TRF 发送发明请求时、TRF 会生成一个 IRQ。 当我读取 IRQ 状态寄存器时、TRF 用0x81 (1000 0001)应答。 这意味着什么?

    我发送的库存请求为:

    G_ui8TrfBuffer[ui8Offset++]= 0x8F;                //复位 FIFO
       G_ui8TrfBuffer[ui8Offset++]= 0x91;                //使用 CRC 发送
       G_ui8TrfBuffer[ui8Offset++]= 0x3D;                //连续写入

       ui16TransmitByteLength = ui8MaskByteCount + 3;   //设置数据包大小=掩码值+掩码长度+ ISO15693命令代码+ ISO15693请求标志  
                                     其中 ui8MaskByteCount=0
       G_ui8TrfBuffer[ui8Offset++]=(uint8_t)(ui16TransmitByteLength >> 8);      //数据包长度(以字节为单位)-传输字节长度的上半字节和中半字节
       G_ui8TrfBuffer[ui8Offset++]=(uint8_t)(ui16TransmitByteLength << 4);      //数据包长度(以字节为单位)-发送字节长度的较低半字节和不完整半字节
       G_ui8TrfBuffer[ui8Offset++]= 0x06、        // ISO15693请求标志
       G_ui8TrfBuffer[ui8Offset++]= 0x01;                //库存请求命令代码

    Acordig 在文档 SLOA 138、第12页、表2 IRQ 状态寄存器中、这意味着 IRQ 是由于 TX 结束而生成的、但未检测到响应(B7 1和 B0 1)。 如果正确、这意味着我应该读取 Nex 插槽、它是否正确?

    n´t 我不知道  IRQ 状态寄存器是否可以接收到一个字节、其中包含多个位集。 我的问题是、  如果我读取 TRF IRQ 状态寄存器并 读取0x81、位7和位0被设定为1、而其余位被设定为0。  如果多个位被设定为1、一个 IRQ 应答是否被接受为正确?

    谢谢

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

    您是否通过在寄存器0x0D 中获取位0来启用无响应中断?

    是的、IRQ 状态寄存器可以有一个多位被置位的字节。 但这并不总是一件好事。 有时(可能在这种情况下)、这意味着您处理 IRQ 的速度不够快、而在其他情况下、它将报告状态、例如0x44或0x50、这意味着在 RX 期间发生了帧或奇偶校验错误、数据不好。 多状态报告的另一种情况是 ISO15693标签冲突、这通常返回0x42、这意味着 RX 发生了冲突。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经解决了 IRQ 寄存器中多个置位的问题,但我被隐藏了。 这是我遵循的流程:
       1配送库存请求
    2 I 接收 IRQ
    3我读取 IRQ 状态寄存器
    4在虚拟时钟0x3F 响应0x80
    5用0x8F 复位 FIFO
    6启用时隙计数器
    7检查天线是否已打开。 我读取寄存器0x00、它响应0x01、因此它关闭
    8遵循 TRF7970A 的建议代码 sloc297。 我希望 RX 中断出现在16个时隙的循环中
    8.1我接收 IRQ
    8.2我读取 IRQ 状态寄存器
    8.3以0x01进行响应。 表示未响应的 IRQ
    8.4使用0x8F 复位 FIFO
    8.5停止解码器(0x16)
          运行解码器(0x17)
         发送下一个时隙(0x14)
    9我n´t 另一个 IRQ、但当我传递一个标签时、TRF 不会检测到任何标签


    我认为问题是天线关闭了。 我读取0x00寄存器、TRF 用0x01进行应答。 这意味着天线已关闭。 因此、我使用天线上的示波器测量任何信号、并捕获13MHZ 信号。 有趣的是、当我用示波器的探针接触天线时、TRF 会生成 IRQ、但无法检测标签。

    正如代码所示、我首先要做的是激活天线、在寄存器0x00中设置值0x21。 但是、当我进行 ISO 控制设置时、会发生某种情况、这会关闭天线并使天线无法打开。

    这是我执行的 ISO 控制的配置。 您可能会看到一些注册表配置错误。

    写入[0]= TRF796x_ISO_CONTROL;
    写入[1]= 0x02;
    将[1]&= 0xDF;// BIT5写入0以设置 RFID 模式
    Trf796xWriteSingle (写入、2);

    ISO_CONTROL &= 0x1F;

    写入[0]= TRF796x_IRQ_MASK;
    写入[1]= 0x3E;
    Trf796xWriteSingle (写入、2);

    写入[0]= TRF796x_MODEG_CONTROL;
    写入[1]= 0x31;//// OOK 100% 6.78MHz
    Trf796xWriteSingle (写入、2);

    写入[0]= TRF796x_TX_PULSE_LENGTH_CONTROL;
    写入[1]= 0x80;// 9.44us
    Trf796xWriteSingle (写入、2);

    写入[0]= TRF796x_RX_NO_RESPONSE_WAIT_TIME;
    写入[1]= 0x14;// 755us
    Trf796xWriteSingle (写入、2);

    写入[0]= TRF796x_RX_WAIT_TIME;
    写入[1]= 0x1F;// 293us
    Trf796xWriteSingle (写入、2);

    写入[0]= TRF796x_RX_SPECIAL_SETTINGS;
    写入[1]= TRF796x_RX_SPECIAL_SETTINGS;
    Trf796xReadSingle (& write [1]);
    写入[1]并且= 0x0F;
    写入[1]|= 0x40;//带通200kHz 至900kHz
    Trf796xWriteSingle (写入、2);

    写入[0]= TRF796x_SPECIAL_FUNCTION;
    写入[1]= TRF796x_SPECIAL_FUNCTION;
    Trf796xReadSingle (& write [1]);
    写入[1]|= 0xEF;//位4至0->设置时间网格
    Trf796xWriteSingle (写入、2);

    写入[0]= TRF796x_FIFO_IRQ_LEVENTIOTE;
    写入[1]= 0x0C;
    Trf796xWriteSingle (写入、2);
    ->此时,TRF 表示天线已关闭

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

    所有这些都不应导致发送器关闭。 当您观察到这种行为时、您是否看到天线的13.56MHz 输出消失?

    关于缺少标签响应的问题、您应该只在您所展示的标签的相应插槽中获得响应(基于最后一个 UID 位)、因此您需要让它在所有16个插槽中循环。 然后、标签响应应位于这些插槽中的一个。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    寄存器0x00n´t 天线已关闭、但13.56MHz 输出不会消失、因此需要说 TRF 工作正常、对吧?

    读取标签的问题´是、尽管天线工作、但 TRF 不检测任何物体。 当我n´t 一个标签时、TRF 不会生成一个 IRQ。 只有当标签直接触摸天线时才会检测到某种情况、并且由于接触、TRF 会生成 IRQ。 同样、当我使用示波器进行测量并且我用测音线触摸天线时、TRF 会生成一个 IRQ。  

    我´m 用我的智能手机读´m 标签、我无法检测所有标签、因此我真的很困惑。

    您能向我推荐任何有助于我找到解决方案的测试吗?

    我已经分析了潜在问题、我认为我可能会滥用库存请求。

    根据 sloa138的防碰撞算法、在第3页上、第一点表示我必须检查发明人请求标志的位5。 如果值为1、插槽数为1、否则为16。 我的问题是 、我在库存请求中发送的哪些字节 必须检查或更改位5才能选择16个插槽?

    如文档 sloa138中的伪代码在第4页中所述、 您必须发送:

    buf[0]= 0x8F;                   /*重置 FIFO 命令*/
    buf[1]= 0x91;                         /*使用 CRC 发送*/
    buf[2]= 0x3D;                                //从寄存器1D 连续写入*
    buf[3]=(char)(大小>> 8);       /*寄存器1D 的数据*/ 此字节的含义是什么?
    buf[4]=(char)(大小<< 4);       /*寄存器1E 的数据*/ 此字节的含义是什么?
    buf[5]= 0x05;                  具有16个时隙位集的/* ISO15693标志*/       此字节的含义是什么?
    buf[6]= 0x01;                                  /* ISO15693防碰撞命令代码*/此字节的含义是什么?
    buf[7]=长度;                 /*掩码长度*/
    如果(长度> 0)

           对于(i = 0;i < masksize;i++)
                     buf[i + 8]=*(mask + i);//掩码值*/

    我的问题是:

             1 -我如何向 TRF 订购、按照库存请求、插槽数为16

    2-我发送的字节(从 buf[0]到 fuf[7])是否为库存请求? 或者、此帧的一个字节仅是库存请求?在本例中、这是什么?

    3- buf[5]是哪个位5应该被设置为0的字节、要选择为16个插槽、对吧? 0x05二进制为0000 0101、位5设置为0 、配置为16个插槽、前四位的含义是什么?

    4 -在文档 Sloa134防 碰撞算法中解释:
                     1.读取器发送一个掩码值和插槽数以及库存请求。 的数量
                      插槽可以是1或16。
                     2. VICC 将其 UID 的最低有效位与时隙编号+掩码值进行比较。 如果匹配、
                     它发送响应。 如果插槽数为1、则仅对掩码值进行比较。
                     3.如果只有一个 VICC 响应,则没有冲突,VCD 接收 UID。
                     4.如果读卡器检测到冲突,它会使插槽指针递增,并记下中的插槽编号
                     发生了哪种碰撞。
                     5.阅读器发送 EOF 以切换到下一个插槽。 VICC 在接收时递增其时隙计数器
                    EOF 的说明。
                     对所有16个插槽重复步骤1-4。

    在16个插槽的末尾、读取器检查插槽指针的内容。 如果它不为零、则表示碰撞
    发生在一个或多个插槽中。
    要确定新的掩码值:
    1、使掩码长度递增4。
    2.计算新掩码=时隙数(发生冲突的时隙数)+旧掩码。
    3.将时隙指针递减1。

    5-问题是:对于我要读取的每个插槽,我是否必须发送库存请求?

    6 -与 sloa 140 1.3直接 命令处理相关的是、SPI 发送的所有直接命令都必须使用 TX 虚拟命令进行发送。 因此、在库存请求的假定帧中发送的每个字节都必须伴随一个虚拟时钟、如示例所示:

    buf[0]= 0x8F;                   /*重置 FIFO 命令*/

    buf[1]=0x00;
    buf[1]= 0x91;                         /*使用 CRC 发送*/buf[

    buf[1]=0x00;
    buf[2]= 0x3D;                                //从寄存器1D 连续写入*

    buf[1]=0x00;
    buf[3]=(char)(大小>> 8);       /*寄存器1D 的数据*/ 此字节的含义是什么?

    buf[1]=0x00;
    buf[4]=(char)(大小<< 4);       /*寄存器1E 的数据*/ 此字节的含义是什么?

    buf[1]=0x00;
    buf[5]= 0x05;                  具有16个时隙位集的/* ISO15693标志*/       此字节的含义是什么?

    buf[1]=0x00;
    buf[6]= 0x01;                                  /* ISO15693防碰撞命令代码*/此字节的含义是什么?

    buf[1]=0x00;
    buf[7]=长度;                 /*掩码长度*/

    buf[1]=0x00;

    谢谢

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

    Jiseba 您好!

    1 -我如何向 TRF 订购、按照库存请求、插槽数为16

    • 1个插槽与16个插槽的资源清册由您通知 TRF7960A 发出的命令确定。 对于此应用程序的开始、我建议使用单槽清单、直到您收到回复。 然后、您可以使用防冲突过程进行16槽库存、因为这更复杂、更高级。 让我们保持简单、直到您收到标签回复。

    2-我发送的字节(从 buf[0]到 fuf[7])是否为库存请求? 或者、此帧的一个字节仅是库存请求?在本例中、这是什么?

    • 这些字节是 TRF7960A 和资源清册请求本身的命令的组合。

    3- buf[5]是哪个位5应该被设置为0的字节、要选择为16个插槽、对吧? 0x05二进制为0000 0101、位5设置为0 、配置为16个插槽、前四位的含义是什么?

    • 如上所述、现在我们避免使用16个插槽
    • 即使对于16个插槽、发送0x05也是错误的。 您需要为16个插槽发送0x06。 但现在、发送0x26表示单个插槽、看看您是否以这种方式收到了标签回复。
    • 还要记住、对于 ISO15693规范、最低位是位0而不是位1、因此为什么设置位5 = 1会导致0x26而不是0x16。

    当您从单个插槽收到标签回复后、我们将解决问题4和5。


    6 -与 sloa 140 1.3直接 命令处理相关的是、SPI 发送的所有直接命令都必须使用 TX 虚拟命令进行发送。 因此、在库存请求的假定帧中发送的每个字节都必须伴随一个虚拟时钟、如示例所示:

    • 这是不对的。

    需要虚拟时钟的直接命令处理专门用于单独发送直接命令的情况。

    在这种情况下、0x8F 后面应紧跟着剩余的数据字节、在单个传输周期中、SS 在发送全部7个字节之前从不会变为高电平。

    您发布的内容将永远不起作用。

    请按照我为此提供的 TI 示例代码中所示的流程进行操作、该代码已正确设置以供传输。

    此外、确保将 ISO15693标志更正为0x26、以便单槽资源清册开始。

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

    您好、Ralph、


    根据您的回答、我选择使用一个插槽。 现在、我能够检测卡、但不能连续检测、每当我检测到卡、读取寄存器0x0C 时、TRF 都会以0x02进行响应。 这意味着尽管只在读取器旁边有一个卡 、但仍会发生冲突错误、我确保其余的卡不会接近其操作区域。 根据建议的代码、当从 IRQ 寄存器读取0x02时、我应该停止解码器、复位 FIFO 并复位 IRQ 状态。 后一种情况是否只能在中断发生后执行?

    谢谢  

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

    您遇到冲突错误是很奇怪的、但至少看起来您已经达到了发送命令和接收标签应答的地步。 如果只有一个标签存在、则不应发生冲突。 您使用的是 TI 硬件还是定制硬件?

    该命令序列应仅在检测到中断后发生。