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.

[参考译文] TPS2HCS08-Q1:通过 SPI 与微控制器通信时遇到问题

Guru**** 2455560 points


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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1542202/tps2hcs08-q1-having-trouble-talking-with-microcontroller-via-spi

器件型号:TPS2HCS08-Q1


工具/软件:

我一直尝试使用另一个微控制器作为主器件、通过板载 SPI 引脚与电子保险丝进行通信、并从电子保险丝寄存器返回错误的数据。 我已经确定了 SPI 命令的范围、它们遵循电子保险丝数据表中的规范、但无论我从哪个寄存器读取、数据主要以 0x80FF 或 0x00F8 的形式返回。

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

    Jonathan、

    您的 SPI 外设使用哪些相位/极性设置? 时钟频率是多少? 如果您可以共享主机代码的一个片段(无论它是什么 MCU)、这可能有助于我们了解发生的情况。  

    一种很好的完整性测试是尝试将 0x0003 写入寄存器地址 0x07(这应该同时打开两个通道)。 作为参考、可以在以下位置找到标准头文件:

    https://www.ti.com/tool/download/HCS-HEADER-FILES

    此致、
    Tim

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

    我正在使用 ATSAME54 好奇心开发板上的 ATSAME54P20 微控制器。 相位在前 SCK 边沿进行数据采样、并在后 SCK 边沿改变。 空闲时极性为 SCK 低电平。 时钟频率为 1MHz
    这是我的代码片段

    #include <stdio.h>
    #include <stdint.h>
    #include <stddef.h>                     // Defines NULL
    #include <stdbool.h>                    // Defines true
    #include <stdlib.h>                     // Defines EXIT_FAILURE
    #include <string.h>
    #include "definitions.h"                // SYS function prototypes
    #include "tps2hcs08.h"                  //Header for EFuse
    
    uint8_t txBuffer[3]= {0x04, 0x00, 0x00 };;
    uint8_t rxBuffer[3];
    size_t txSize = 3;
    size_t rxSize = 3;
    
    
    
    //Dummy write
    
    GPIO_PD11_Clear();
    RTC_Timer32Start();
    while(RTC_Timer32CounterGet() < 0x2);  //for t_ready time
    RTC_Timer32Stop();
    bool flag = SERCOM0_SPI_WriteRead(&txBuffer, txSize, &rxBuffer, rxSize);
    GPIO_PD11_Set();
    
    
    
    while(true){
    
    GPIO_PD11_Clear();
    SERCOM0_SPI_WriteRead(&txBuffer, txSize, &rxBuffer, rxSize);
    GPIO_PD11_Set();
    
    RTC_Timer32Start();
    while(RTC_Timer32CounterGet() < 0x2);
    RTC_Timer32Stop();
    
    }


    GPIO 是 CS 引脚。

    这也是我的内窥镜的照片。 第一个波形是我的 CS 引脚、第二个是我的 SCK、第三个是我的 SDI、第四个是我的 SDO


    感谢您的帮助

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

    Jonathan、

    虽然这不是确切的 MCU、但有 STM32H7(以及 TI MCU Slight smile)的参考驱动程序/实现、位于以下位置:

    https://www.ti.com/lit/pdf/slvaft2

    SPI 模式 1(极性 0、相位 1)设置正确。

    我想可能会发生的情况是寄存器读取不会填充到同一个事务上... 这意味着您请求的寄存器的有效载荷会填充到寄存器中 、并在后续读取请求时可用。 我们这样做是为了管理 SPI 菊花链更改配置中的读取、在这些配置中、多个 HCS 器件串联设置。 您是否可以尝试读取寄存器地址 0x00 两次? 对于有效载荷、第二个事务应获得器件 ID:

    如果需要、我可以稍后捕获逻辑跟踪(如果您仍无法正常工作)。  

    此致、
    Tim

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

    我更改了相位、现在电子保险丝发送正确的数据用于读取、谢谢