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.

[参考译文] DLP-7970ABP:通过 SPI 实现 TRF7970A 初始化和写入/读取寄存器

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

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

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1037909/dlp-7970abp-trf7970a-initialization-and-write-read-registers-via-spi

器件型号:DLP-7970ABP
主题中讨论的其他器件:TRF7970A

大家好、

我在 TRF7970A 的初始化以及对寄存器的读取和写入方面遇到了一些问题。

我将 TRF7970 Booster Pack (器件型号:DLP-7970ABP)与北欧控制器(nRF5340DK)搭配使用。 配置完所有 SPI 引脚(时钟、从器件选择、MOSI 和 MISO)后、我尝试与 TRF7970A 器件进行通信、但不知怎么、我无法接收任何信息。

我将尝试描述我所遵循的所有步骤:

首先、我已经按照 数据表的第6.11节所述初始化了 TRF7970A

  1. 4ms 后升高 SS 和 EN。 我没有提交 EN2、因为这不是在 TI 提供的读/写器应用中完成的(我在 TI Launchpad 上成功测试了该应用)。
  2. 发出软件初始化直接命令(0x03 -> SPI MOSI:0x83)、后跟空闲直接命令(0x00 -> SPI MOSI:0x80)
  3. 1ms 延迟
  4. 发出复位 FIFO 直接命令(0x0F -> SPI MOSI:0x8F)
  5. 向调制器和 SYS_CLK 控制寄存器(0x09)写入针对晶振和系统时钟设置的专用应用设置。 我将0x01写入寄存器、但我不知道我应该在这里写入什么。
  6. 向稳压器和 I/O 控制寄存器(0x0B)写入适当的应用特定设置。 我向寄存器写入0x00、但我也不确定。
  7. 向 NFC 目标方侦测水平寄存器(0x18)写入值0x00。 MOSI SPI:0x18 0x00

我使用了逻辑分析仪来查看 SPI 信息、并在下表中总结了我的结果

如表中所示、TRF7970A 通过 SPI-MOSI 接收信息(初始化和一些读取/写入命令)、但通过 SPI-MISO 发回的数据看起来并不正确。 我可以确认通过 SPI-MISO 发送的"随机"值(如0x02和0x14)来自 TRF7970A、因为我从控制器的 SPI 引脚上移除 TRF7970A 时不会接收到这些值。
话虽如此、我对 SPI 通信有一些疑问:

  1. 空闲直接命令和 FIFO 复位后、值0x02是什么意思?
  2. 当我写入调制器和 SYS_CLK 控制寄存器时、值0x14意味着什么?
  3. 在步骤7中、我将0x21写入寄存器0x00。 在步骤8中、我读取该寄存器、但我接收到的信息为0x00。 为什么我无法读取我刚才写入的值?
  4. 在步骤9中、我执行虚拟读取。 为什么这里以及接收到的信息0x00?
  5. 这是否与初始化的步骤5和6相关、我不知道要写入寄存器的值?

期待您的反馈。

提前非常感谢!

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

    您好、JBF:

    您的 SPI 时钟极性和相位不正确。 TRF7970A 在 SPI 模式0下运行、即 SPI 时钟低电平+下降沿数据采集。

    请先解决该问题、然后查看系统的工作原理。 接收到的值不正确是由 SPI 设置导致的、该设置中的器件收到错误的命令。

    此致、

    Ralph Jacobi

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

    您好 Ralph、

    感谢您的回答。

    " TRF7970A 在 SPI 模式0下运行、即 SPI 时钟低电平+下降沿数据捕捉"

    ->我对这句话有点困惑。 据我所知、在模式0中、数据在上升沿被采样、在下降沿被移出。 当您说"下降沿数据采集"时、捕捉指的是移出? 否则、它应该说上升沿数据捕获、对吧?

    我将 SPI 模式更改为0 (CPOL=0、CPHA=0)。 遗憾的是、除了尝试读取和写入寄存器0x00之外、我仍然没有收到任何信息。 在这种情况下、数据看起来也不正确。

    软件初始化直接命令:


    尝试将0x21写入寄存器0x00:


    有关我的设置的一些其他信息:

    - EN2引脚接地

    -引脚 IO0接地。 连接到 Vdd 的引脚 IO1和 IO2

     

    此致。

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

    您好 JBF12、

    我必须道歉! 我已经不支持此器件一段时间了、但我们的常见支持工程师正在休假、因此我很想补充。 我错了 SPI 模式0、它应该是用于下降沿捕捉的 SPI 模式1。

    为了明确表示 SPI 总线本身、时钟极性应该是逻辑"0"上的时钟空闲时间、上升沿上的数据变化和 下降沿上的锁存-看看 SPI 模式、实际上是模式1。

    请参阅下面的示例 SPI 捕捉:

    此致、

    Ralph Jacobi

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

    您好 Ralph、

    我设置了 SPI 模式1、但看起来通信仍然不起作用。

    如果出现问题、我将尝试总结初始化步骤:

    1) 1)开始程序执行

    2) 2)提高 SS 之前的2ms 延迟(如数据表的图6.3所示)

    3) 3)将 SS 设置为高电平

    4) 4) 4ms 延迟

    5) 5)将 EN 设置为高电平(EN2已通过硬件接地)

    6) 6) 10ms 延迟、如 本讨论中所建议

    7) 7)发出软件初始化直接命令:MOSI 0x83、MISO 0x00

    8) 8)发出 Idle Direct 命令:MOSI 0x80、MISO 0x00

    9) 9) 1 ms 延迟、以完全处理软复位

    10) 10)我尝试读取一些寄存器以检查 SOFT_INIT 和 IDLE Direct 命令是否成功(我将值与本 文档的表2进行比较)

    10.1)读取芯片状态控制寄存器:MOSI 0x41和 MISO 0x00 (应为0x01)

    10.2)读取稳压器和 I/O 控制寄存器:MOSI 0x4B 和 MISO 0x00 (应为0x87)

    (我是否正确地假设如果步骤10不成功、则控制器和 TRF7970A 之间的 SPI 通信不能正常工作? 即使在这种情况下、我也会继续执行初始化步骤)

    11)复位 FIFO 直接命令:MOSI 0x8F、MISO 0x00

    12) 12)写入调制器和 SYS_CLK 控制寄存器:MOSI 0x09 0x01、MISO 0x00 0x00

    13) 13)写入稳压器和 I/O 控制寄存器:MOSI 0x0B 0x01、MISO 0x00 0x00

    14) 14)写入 NFC 目标方侦测电平寄存器:MOSI 0x18 0x00、MISO 0x00 0x00

    15) 15)将值0x21写入寄存器0x00:MOSI 0x00 0x21、MISO 0xFF 0xFF

    16) 16)读取写入 MOSI 0x40、MISO 0xFF 的值

    您是否在初始化步骤中看到了错误? 我对步骤14和15中的0xFF MISO 值特别好奇。 我不太确定在步骤12和13中写入的值。

    一些其他信息:

    - SPI 时钟频率:4MHz

    -输入电压:2.9V
     我认为这应该足够了、因为数据表将2.7V 定义为最小输入电压。 此外、我昨天尝试了3.3V 电压  
     (使用 SPI 模式0)、结果与使用2.7V 时相同

    -IRQ 未配置。

    此致。

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

    您好 JBF12、

    初始设置步骤是可以的、但我在这里看到下一个问题-让我们看看这是否是最后一个大问题。 SPI 为全双工时、与 TRF7970A 的通信过程本质上是半双工。 这是因为寄存器需要完全进行读操作、以便 TRF7970A 知道要发回什么。 因此、在发送读取寄存器的命令后、主机必须触发时钟周期、以便 TRF7970A 发回数据。

    请在此处比较这两个屏幕截图、以了解我的意思:

    SS 降低、发送读取命令、无额外时钟周期、SS 升高

    SS 已降低、已发送读取 IRQ 寄存器命令、启动第二组时钟周期、TRF7970A 在 MISO 上返回数据、然后 SS 已升高。

    我认为、这应该会使数据运行良好。

    我认为 SPI 电压电平不应成为问题。 如果您在3V 模式下运行 TRF7970A、您还可以将稳压器控制保持在较低的设置值、这也会使 VDD_I/O 接近2.9V。

    4MHz SPI 时钟正常、但如果您仍然有问题、请尝试2MHz 启动-这表明我非常怀疑这会影响此处的任何内容、这更像是我所看到的程序问题。

    您将需要在某个点配置 IRQ、但用于与之无关的初始寄存器通信。 但是、您将需要 IRQ 用于实际的射频通信。

    此致、

    Ralph Jacobi

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

    您好 Ralph、

    感谢您对 SPI 半双工的观察!! 这让我充分意识到如何正确实施读取过程。
    我在某种程度上希望从器件为 MISO 值生成时钟、这不是 SPI 协议的工作方式... ´s 这是主人的责任。

    我现在可以在初始化后读取寄存器的值、修改它们的值并执行连续的读取/写入过程。

    例如、我向某个寄存器(0x02)写入一个特定的值(0x35):

    为了读取该寄存器的值、主器件发送单地址寄存器读取字并在 SS 保持低电平时创建另一个时钟周期。 只有这样、从器件才能通过 MISO 应答数据并将其发送给主器件。
    我注意到、在我的示例中、MOSI 线路在从器件向主器件发送数据时保持高电平(这很好、因为要求没有转换)。 我想这是由使用的 SPI 驱动器定义的。

    现在、我可以深入了解射频通信

    此致。