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.

[参考译文] TCAN4550-Q1:SPI 通信:SPI 写入问题

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/740309/tcan4550-q1-spi-communication-spi-write-problems

器件型号:TCAN4550-Q1
主题中讨论的其他器件:TCAN4550

我将其中一个 TCAN4550评估模块与 Tiva TM4C1294XL Lauchpad 搭配使用。  我已经从 Launch Pad 的 SPI1连接到评估板上的 J16接头。   

我在执行 SPI 读数时成功、但写入操作无法正常工作。  我捕获了示波器上的写操作、并验证了信号时序和位顺序 与数据表中指定的相同。  对于我已设置的写入测试、 我使用此简单过程对 TM4C 进行了编程。

SPI_READ 地址0x0808 (测试寄存器和暂存)。  此操作返回0x0000 0x0002

SPI_WRITE 地址0x1018 (CCCR)、带0x0000 0003

SPI_WRITE 地址0x0808、带0xABCD EF12

SPI_READ 地址0x0808。  此操作返回0x0000 0x0002

我希望看到0xABCD EF12。  地址0x0800尚未写入、但未返回2018年1月数据表中指定的值。  数据表指定的工作模式和引脚配置寄存器的复位值为0xC7004048、我的两个评估板在这里返回0xC8000468。  是否有指定正确写入此器件上所有寄存器所需步骤的过程?

谢谢、

Joe  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我仍然遇到 SPI 写入问题、但我发现了一些其他信息、这些信息将有所帮助。 使用上述过程时、我能够成功写入测试寄存器和暂存器。 当我第一次注意到这个写入问题时、我尝试写入操作模式和引脚配置寄存器。 我更新了上述过程、这些是我收到的结果。

    ===原始过程(正常工作)===
    SPI_READ 地址0x0808 (测试寄存器和暂存)。 此操作返回0x0000 0x0000

    SPI_WRITE 地址0x1018 (CCCR)、带0x0000 0003

    SPI_WRITE 地址0x0808、带0xABCD EF12

    SPI_READ 地址0x0808。 此操作返回0xABCD EF12



    ===更新的过程(不起作用)===
    SPI_READ 地址0x0808 (测试寄存器和暂存)。 此操作返回0x0000 0x0000

    SPI_WRITE 地址0x1018 (CCCR)、带0x0000 0003

    SPI_WRITE 地址0x0808、带0xABCD EF12
    SPI_WRITE 地址0x0800、带0x0844 0666

    SPI_READ 地址0x0808。 此操作返回0x000 0000
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Joe、您好!

    您可能会遇到硬件或软件问题、我需要一些更多信息来帮助了解正在发生的情况。  

    首先、让我们检查硬件。  

    EVM (VBAT 或 VSUP)的电源电压是多少?

    您使用的 VIO 电压是多少?它是否在 LDO 选择 DIP 开关上正确设置?  这应该与 Tiva Launchpad 的数字 IO 电压电平相匹配。  TCAN4550可以使用5V 或3.3V 电平。  您是通过 EVM VIO 为 Launchpad 供电、还是至少连接了 Launchpad 和 EVM 的 GND?

    至少需要 VSUP/VBAT (典型值12V)为 EVM 供电、然后在 EVM 和 Launchpad 之间连接 NCS、SCLK、SDI、SDO 和 GND。  VIO 和/或5V 也可由 EVM LDO 提供给 Tiva、以确保电压电平正确。

    现在介绍软件。

    您尝试使用什么 SPI 时钟频率?  (即100kHz、1MHz、10MHz?)

    您能否共享用于读取和写入函数的字节序列?  

    例如、要写入寄存器0x0808、您需要写入以下字节序列:

    写入0x61、0x08、0x08、0x01、0xAB、 0xCD、0xEF、0x12

    0x61是写 操作码。  

    0x08 0x08是要写入的寄存器地址(如果要写入多个字、则为起始地址)

    0x01是要写入的字数、在本例中为1个字。

    0xAB、0xCD、0xEF、0x12是写入寄存器的数据字。

    要读取寄存器、它就像具有两个差异的写入函数。  第一个区别是读取操作码为0x41、而不是0x61。 另一个区别是 TCAN4550将在写入的数据部分将寄存器内容写入 MCU。  因此、您需要保持 SCLK 循环、就像写入数据一样。  实际上、您将虚拟数据写入 TCAN4550、并从 TCAN4550采样读取数据。

    写入0x41、0x08、0x08、0x01、0x00、 0x00、0x00、0x00 (注意: 当正在接收读取数据时、我在虚拟数据写入部分写入全0)

    在写入期间读回的数据应如0x00、0x00、0x00、0x00、0xAB、 0xCD、0xEF、0x12

    请注意、读取行上的前4个字节将被丢弃、最后4个字节将保存为寄存器值的内容。

    请检查您的硬件配置和软件字节序列是否与我的示例相匹配、如果一切看起来都井然有序、请向我提供我请求的额外信息。

    Jonathan

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

    您好、Jonathan、

    我已复制并粘贴您的回复。  请参阅下面的注释。

    您可能会遇到硬件或软件问题、我需要一些更多信息来帮助了解正在发生的情况。  

    首先、让我们检查硬件。  

    EVM (VBAT 或 VSUP)的电源电压是多少?

    您使用的 VIO 电压是多少?它是否在 LDO 选择 DIP 开关上正确设置?  这应该与 Tiva Launchpad 的数字 IO 电压电平相匹配。  TCAN4550可以使用5V 或3.3V 电平。  您是通过 EVM VIO 为 Launchpad 供电、还是至少连接了 Launchpad 和 EVM 的 GND?

    我将使用设置为7.5V 的外部电源为 CAN EVM 供电、并直接连接到 J8连接器(VSUP)。  CAN EVM 上的 VIO DIP 开关设置为3p3。  遗憾的是、由于 Tiva 板上的输入电压限制、我无法使用同一电源为 CAN EVM 和 Tiva 板供电、因此 Tiva 通过使用 USB 电源的调试连接器供电。  但是、两个电路板之间的接地端已连接。  

     我还有主原型板、其中一个 TCAN4550和一个 TM4C1294由同一个稳压器供电、我也会看到该板有同样的问题。

    至少需要 VSUP/VBAT (典型值12V)为 EVM 供电、然后在 EVM 和 Launchpad 之间连接 NCS、SCLK、SDI、SDO 和 GND。  VIO 和/或5V 也可由 EVM LDO 提供给 Tiva、以确保电压电平正确。

    现在介绍软件。

    您尝试使用什么 SPI 时钟频率?  (即100kHz、1MHz、10MHz?)

    我最初以10Hz 的频率进行测试、该频率适用于 SPI 读取操作、但我将其降低至2MHz。  由于电路板连接的导线、信号会有一点振铃、但这并不可怕。  当我执行 SPI 读取操作时、我已经连续测试了10个寄存器的读数、但没有看到"位翻转"。

    您能否共享用于读取和写入函数的字节序列?  

    例如、要写入寄存器0x0808、您需要写入以下字节序列:

    写入0x61、0x08、0x08、0x01、0xAB、 0xCD、0xEF、0x12

    0x61是写 操作码。  

    0x08 0x08是要写入的寄存器地址(如果要写入多个字、则为起始地址)

    0x01是要写入的字数、在本例中为1个字。

    0xAB、0xCD、0xEF、0x12是写入寄存器的数据字。

    要读取寄存器、它就像具有两个差异的写入函数。  第一个区别是读取操作码为0x41、而不是0x61。 另一个区别是 TCAN4550将在写入的数据部分将寄存器内容写入 MCU。  因此、您需要保持 SCLK 循环、就像写入数据一样。  实际上、您将虚拟数据写入 TCAN4550、并从 TCAN4550采样读取数据。

    写入0x41、0x08、0x08、0x01、0x00、 0x00、0x00、0x00 (注意: 当正在接收读取数据时、我在虚拟数据写入部分写入全0)

    在写入期间读回的数据应如0x00、0x00、0x00、0x00、0xAB、 0xCD、0xEF、0x12

    请注意、读取行上的前4个字节将被丢弃、最后4个字节将保存为寄存器值的内容。

    请检查您的硬件配置和软件字节序列是否与我的示例相匹配、如果一切看起来都井然有序、请向我提供我请求的额外信息。

    我不知道您是否看到了我的第二次答复、但我能够使第一个过程正常工作、以便能够成功写入测试寄存器。    我 开始使用测试寄存器的原因是、我在使器件正确设置时遇到了问题。  我遇到的主要问题是 尝试写入设置寄存器。  (即器件配置寄存器)。  我更新了正确的过程、以包括对器件配置寄存器的写入。  此 过程不起作用。

    以下是我正在使用的命令:

    读取测试寄存器: 0x41080801 ->  0x0000 0000

    CCCR 寄存器写入: 0x61101801 0x00000003

    器件配置写入: 0x61080001 0x08440666

    测试寄存器写入:0x61080801 0xABCDEF12

    读取测试寄存器: 0x41080801 ->  0x0000 0000

     

    如果我删除器件配置写入、此过程将按预期工作。  当我尝试写入器件配置寄存器时、我无法正确写入其他寄存器。  当我尝试 仅 写入器件配置寄存器、然后回读结果时、写入值和读取值不匹配。

    除了 CCCR 寄存器、是否还有任何其他需要更新的设置、以便正确更新这些受保护寄存器?

    感谢您的帮助、


    Joe

     

     

     

     

     

     

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

    Joe、您好!

    我认为我发现了这个问题、至少就在您的测试中使用 EVM 而言是如此。  EVM 使用器件的 INH 引脚控制 VIO 通道的 LDO 使能引脚。  您要将配置寄存器0x0800的位9设置为1'B1、以禁用 INH 引脚。  当 TCAN4550未将其驱动为高电平时、EVM 上有一个下拉电阻器将线路保持在低电平。  

    写入寄存器0x0800后、INH 引脚禁用、下拉电阻器会禁用 LDO 的 VIO 通道、进而禁用 TCAN4550的数字接口。  在应用 VIO 之前、器件不会再次工作、因为如果没有 VIO、您无法向任何寄存器写入数据、这将需要重启电源。

    此致、

    Jonathan

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

    您好、Jonathan、

    我已将写入器件配置的数据从0x08440666更新为0x08440466、并重新运行我在25日概述的实验。 我仍然看到相同的结果... 与之前一样、如果我消除了对器件配置寄存器的写入操作、那么操作将正常进行。

    Joe

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

    如果我理解正确、这是您尝试使用的顺序:

    读取测试寄存器:0x41080801 -> 0x0000 0000
    CCCR 寄存器写入:0x61101801 0x00000003
    器件配置写入:0x61080001 0x08440466
    测试寄存器写入:0x61080801 0xABCDEF12
    读取测试寄存器:0x41080801 -> 0x0000 0000 如果工作正常、<-应该为0xABCDEF12

    最后读取的0x41080801仍然返回为0x0000 0000。 是这样吗?

    您的顺序最初似乎对我有效、但我认为我们仍有一些问题可以解决。 这是使用 SPI 接口工具的测试序列输出。

    写入:h41、h08、h08、h01、h00、 H00、00、00、00、
    阅读:H00、H00、H00、H00、H00、H00、 H00、00、00、00、

    写入:h61、h10、h18、h01、h00、 h00、h00、h03、
    阅读:H00、H00、H00、H00、H00、H00、 H00、00、00、00、

    写入:h61、h08、h00、h01、h84、 h44、h04、h66、
    阅读:H00、H00、H00、H00、H00、H00、 H00、00、00、00、

    写入:H61、H08、H08、H01、HAB、 HCD、HEF、H12、
    阅读:H00、H00、H00、H00、H00、H00、 H00、00、00、00、

    写入:h41、h08、h08、h01、h00、 H00、00、00、00、
    阅读:H00、H00、H00、H00、HAB、 HCD、HEF、H12、 <--我正在正确读取暂存区寄存器值

    我确实注意到、您还在向寄存器0x0800的位2写入1、即 Device_Reset 位。 当您写入此位时、器件将重置为默认状态。 通过将其组合到您唯一的配置寄存器写入中、您只需将器件配置重置回默认状态即可。 如果要在配置之前执行器件复位、则需要对寄存器0x0800执行单独的写操作、其中位2设置为1以默认器件。 然后使用所需的配置设置对寄存器0x0800进行第二次写入。

    但是、当器件处于默认加电状态时、您仍应能够读取和写入暂存器寄存器0x0808。 这就是我在上面看到和显示的内容。

    我注意到的另一件事是、您应该在器件上电后通过向寄存器0x0820的位20写入1来清除上电中断标志位。 这将防止 TCAN4550在您为器件通电4分钟后进入失效防护模式。 请参阅数据表的第8.4.5节。 您正在尝试禁用 SWE 计时器并禁用配置寄存器0x0800中的失效防护。 但在禁用这些功能之前、需要清除通电标志。 如果 PWRON 标志被置位、SWE 定时器不会被禁用、并且器件最终将在故障安全条件下进入睡眠状态。 我建议在您的序列开始和加电后始终读取和清除寄存器0x0820中的标志。

    您似乎没有这样做、但您不想向 CCCR 寄存器0x1018的 CSA 和 CSR 位写入1。 如果您这么做、您将导致时钟停止、这将导致您出现问题。 始终向这些位写入0。

    您能否通过删除器件复位并清除状态寄存器中的加电标志来尝试您的序列、以查看这是否有任何影响。 此外、仔细检查您的结果、查看我的结果、以了解可能会有所帮助的任何其他差异。

    此外、您能否读取寄存器0x0000、0x0004和0x0008并向我发送这些值? 我想检查您使用的 TCAN4550的哪个版本、以确保您尝试执行的操作没有与版本相关的问题。

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

    从以上回复中...

    如果我理解正确、这是您尝试使用的顺序:

    读取测试寄存器:0x41080801 -> 0x0000 0000
    CCCR 寄存器写入:0x61101801 0x00000003
    器件配置写入:0x61080001 0x08440466
    测试寄存器写入:0x61080801 0xABCDEF12
    读取测试寄存器:0x41080801 -> 0x0000 0000 <-如果工作正常、应该为0xABCDEF12

    最后读取的0x41080801仍然返回为0x0000 0000。 是这样吗? 是的、没错。

    这让人感觉完美。 我完全误解了 DEVICE_RESET 位的含义。 我将该位解释为设置。 当我读取此内容时、我认为该器件可以选择设置为返回默认状态、也可以选择在从 RST 引脚复位后返回其当前配置。 在你解释完之后、这个位的操作更加有意义。 我将在周一早上尝试此第一件事、让您知道我找到的内容、并将向您发送器件版本。

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

    重置似乎是问题所在。 我没有运行完整的初始化过程、但我们正在运行的简单测试在我清除位2后工作正常。

    这里是我从器件中读取的值。
    0x0000 0x4E 0x41 0x43 0x54
    0x0004 0x30 0x35 0x35 0x34
    0x0008 0x00 0x11 0x02 0x00

    感谢您的帮助、

    Joe