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.

[参考译文] LAUNCHXL-CC1310:CC1310与 LPS22HB 传感器之间的 SPI 通信-不存在时钟

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1313005/launchxl-cc1310-spi-communication-between-cc1310-and-lps22hb-sensor---no-clock-present

器件型号:LAUNCHXL-CC1310
主题中讨论的其他器件:CC1310

您好

我正在尝试编写函数来精简 CC1310和 LPS22HB 压力传感器之间的 SPI 通信。 除了不断初始化参数等、我想使用 SPI 为 r/w 函数提供一个函数。

对于 SPI_Write 函数:

bool SPI_Write(SPI_Handle spi_handle, SPI_Params spi_params,
                                    SPI_Transaction spi_transaction, uint8_t size,
                                    uint8_t *txBuffer)
{

    SPI_Params_init(&spi_params);
    spi_params.transferMode = SPI_MODE_BLOCKING;
    spi_params.bitRate = 10000000;
    spi_params.dataSize = 8;


    spi_handle = SPI_open(0, &spi_params);

    if (!spi_handle) {
        // Error opening SPI
        return false;
    }

    spi_transaction.count = size;
    spi_transaction.txBuf = txBuffer;
    spi_transaction.rxBuf = NULL;

    if(!SPI_transfer(spi_handle, &spi_transaction))
    {
        return false;
    }

    SPI_close(spi_handle);

    return true;
}

对于我的 SPI_READ 函数:

bool SPI_Read(SPI_Handle spi_handle, SPI_Params spi_params,
                                   SPI_Transaction spi_transaction, uint8_t size,
                                   uint8_t *rxBuffer)
{

    SPI_Params_init(&spi_params);
    spi_params.transferMode = SPI_MODE_BLOCKING;
    spi_params.bitRate = 10000000;
    spi_params.dataSize = 8;


    spi_handle = SPI_open(0, &spi_params);

    if (!spi_handle) {
        // Error opening SPI
        return false;
    }

    spi_transaction.count = size;
    spi_transaction.txBuf = NULL;
    spi_transaction.rxBuf = rxBuffer;

    if(!SPI_transfer(spi_handle, &spi_transaction))
    {
        false;
    }

    SPI_close(spi_handle);

    return true;
}

反过来、我的 LPS22HB 驱动器包含:

SPI_Transaction LPS22HB_SpiTransactionHandle;
SPI_Handle LPS22HB2_SpiHandle;
SPI_Params  LPS22HB_SpiParams;


#define TOGGLE_CS                               GPIO_write(Board_GPIO_TEST_DIO25, 0)
#define RELEASE_CS                              GPIO_write(Board_GPIO_TEST_DIO25, 1)

static void LPS22HB_Mem_Write(uint8_t reg, uint8_t *dataW, uint8_t size)
{

    uint8_t spiReg = reg;
    TOGGLE_CS; //sets the CS low

    SPI_Write(LPS22HB_SpiHandle, LPS22HB_SpiParams, LPS22HB_SpiTransactionHandle, 1, &spiReg);

    SPI_Write(LPS22HB_SpiHandle, LPS22HB_SpiParams, LPS22HB_SpiTransactionHandle, size, dataW);

    RELEASE_CS; //sets the CS high

}

static void LPS22HB_Mem_Read(uint8_t reg, uint8_t *dataR, uint8_t size)
{
    uint8_t spiBuf[1] = {0};
    spiBuf[0] = reg | 0x80;
    uint8_t i;

    TOGGLE_CS; //sets the CS low

    SPI_Write(LPS22HB_SpiHandle, LPS22HB_SpiParams, LPS22HB_SpiTransactionHandle, 1, spiBuf);

    SPI_Read(LPS22HB_SpiHandle, LPS22HB_SpiParams, LPS22HB_SpiTransactionHandle, size, dataR);

    RELEASE_CS; //sets the CS high
}

然后、我将尝试使用以下代码段读取 chip_id (传感器的"我是谁")、应为0xB1:

LPS22HB_Mem_Read(0x0f, ui8dummy, 1);

uint8_t ui8dummy[2]

if(strcmp(ui8dummy, "D") != 0)
{
return false;
}

当我读取 CHI-ID 时、如果我希望0xb1的值、由数据表给出、则我得到零。 我已经全面调试了 SPI R/W 代码。 我已经向 SPI_W/R 函数添加了断点、可以保证不会产生错误(这些函数不返回 false)。 我正在使用一个由"toggle"和"release"宏给出的软件芯片选择。 我已经在示波器上进行了检查、可以确认我的 CS 和时钟是否有效。 我将使用 CC1310 SDK 20.02.07版中的 uartEcho 示例。

我的驱动器中是否有任何明显错误使其无法正常工作?

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

    尊敬的 Suvashan:

    包装器函数看起来不错。  

    1.请检查是否有任何其他外设正在使用时钟引脚。

    2.如果这是定制的板卡,请检查引脚是否被拉高或拉低。

    3.另外,是否调用了 SPI_Init ()? 包装程序只包含 SPI_params_init ()。  

    此致、

    SID

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

    嗨、Sid

    道歉,但我可以确认,在我的一位同事的帮助下,现在有一个时钟。

    至于 spi_init(),它在 mainThread 中被调用。 我已经重写了 SPI_READ 函数(包括一个用于传输寄存器地址的缓冲器)、如下所示:

    bool SPI_Read(SPI_Handle spi_handle, SPI_Params spi_params,
                                       SPI_Transaction spi_transaction, uint8_t size,
                                       uint8_t *rxBuffer, uint8_t *txBuffer)
    {
    
        SPI_Params_init(&spi_params);
        spi_params.transferMode = SPI_MODE_BLOCKING;
        spi_params.bitRate = 10000000;
        spi_params.dataSize = 8;
    
    
        spi_handle = SPI_open(0, &spi_params);
    
        if (!spi_handle) {
            // Error opening SPI
            return false;
        }
    
        spi_transaction.count = size;
        spi_transaction.txBuf = txBuffer;
        spi_transaction.rxBuf = rxBuffer;
    
        if(!SPI_transfer(spi_handle, &spi_transaction))
        {
            false;
        }
    
        SPI_close(spi_handle);
    
        return true;
    }

    因此、生成的 LPS22HB 读取函数将

    :  

    static void LPS22HB_Mem_Read(uint8_t reg, uint8_t *dataR, uint8_t size)
    {
    reg |= 0x80;
    
    
    TOGGLE_CS; //sets the CS low
    
    SPI_Read(LPS22HB_SpiHandle, LPS22HB_SpiParams, LPS22HB_SpiTransactionHandle, size, dataR, &reg);
    
    RELEASE_CS; //sets the CS high
    }

    我已经对它进行了测试、但它无法正常工作。 我可以问问、如果使用了 SPI_Transfer、并且 Rx 和 TX 缓冲器都不为空(或者我不确定这是否重要)、向从器件传输了多少个时钟脉冲? 假设我使用的数据为8位、大小为1、是否会有16个时钟脉冲(TX 为8个、RX 为8个)?  

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

    尊敬的 Suvashan:

    默认情况下、传输为全双工、控制器通过 POCI (MOSI)发送数据、外设通过 PICO (MISO)发送数据、因此我假设只需要8个时钟脉冲(可能更取决于帧格式)。  

    这是 SPI 驱动程序设置的默认帧格式。

      

    您可以使用 SPI 硬件本身提供的 CSn 引脚、该引脚应根据需要控制 CS 引脚。

    此致、

    SID

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

    嗨、Sid

    感谢您提供这些信息。 根据这一知识、如果我们观察下面压力传感器本身的时序图、它指定 CPOL = 1和 CPHA = 0。 此外、要从寄存器中读取数据、主器件必须向从器件写入寄存器地址。 然后、主器件必须继续生成时钟脉冲、以便从器件(传感器)发送存储在所需寄存器中的值。 因此、主机总共必须发送一个字节但产生16个时钟脉冲。

    对于这种情况、我尝试仅将数据(寄存器的地址)传输到从器件(显然使用的是 spi_transfer ()))、其中我将 rxBuffer 留为 NULL。 然后,我尝试使用 spi_transfer(),只使用一个 rxBuffer ,将 txBuffer 设置为 NULL ,以接收给定的数据。 这不起作用、rxBuffer 继续读取零。 有更智能的方法可以做到这一点吗?

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

    尊敬的 Suvashan:

    我看到 MICROWIRE 格式最接近这一点。 请您可以将该 SPI_MW 作为 spiParams.frameFormat 尝试。

    请查看技术参考手册中的22.4.4节、其中提供了器件支持的所有帧格式。  

    www.ti.com/.../swcu192.pdf

    此致、

    SID