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.

[参考译文] CC2745R10-Q1:从 SPI CKL 结束到下一条命令的延迟

Guru**** 2530360 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1558746/cc2745r10-q1-delay-from-spi-ckl-end-to-next-command

器件型号:CC2745R10-Q1


工具/软件:

您好、专家:

我们的客户尝试使用以下代码来检查 SPI 行为。

结果如下。

问题是、在 SPI CS 变为高电平后需要 30.214usec 的时间才能进行下一次 GPIO 切换 (DRDY)。

每次都会发生该问题、并且在 CS 到 GPIO 切换结束之间没有发生中断。

它们现在使用 SPI 阻塞模式。

您能否告知造成此延迟的原因是什么、以及如何解决?

一个想法是 使用回叫模式,但它需要许多资源,不想尽可能多地改变。

此致、

A. Fujinaka

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

    您好:

    很抱歉耽误您的时间。 我已将该主题分配给了一位专家。 请预计下周会有回复。

    请提供以下信息:

    1.您使用的是哪个 SDK 版本?

    此致、

    Nima Behmanesh

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

    你好、Nima、

    他们使用 SDK  8.40.02.01.

    请首先检查您身边的行为。  

    此致、

    A. Fujinaka

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

    今天我将检查这个问题。

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

    您好、Bostancioglu、

    您可以更新状态吗?

    我明天需要回复我的客户。

    此致、

    A. Fujinaka

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

    您好:

    在 SPI_MODE_BLOCKING 下运行后、在我的设置中需要 22 μ s 才能处理 GPIO_Toggle。 我尝试更改了软件中断优先级[SPI 使用 DMA 中断]、但此路径没有成功。

    通过启用回调模式、您几乎可以在 CS 激活开始时执行 GPIO_TOGGLE。

    第一个选项:

    spiParams.transferMode = SPI_MODE_CALLBACK;
    ....
    transferOK = SPI_transfer(controllerSpi, &transaction);
    GPIO_toggle(CONFIG_GPIO_LED_1);

    这将使 GPIO 几乎与 SPI_Transfer 并行切换。

    “一个想法是 使用回叫模式,但它需要许多资源,不想尽可能多地改变“

    我认为它不需要大量的资源。 再定义一个函数、将其作为函数指针传递到 SPI。 如果您需要知道 SPI_TRANSFER 是否已完成、可以使用类似 RTOS 的互斥量对象来同步进程。 在本例中、我使用了 volatile bool。

    volatile bool transferComplete = false;
    
    void spiCBFxn(SPI_Handle handle, SPI_Transaction *transaction)
    {
    transferComplete = false;
    if (transaction->status == SPI_TRANSFER_COMPLETED)
    {
    transferComplete = true;
    }
    }
    
    SPI_Params_init(&spiParams);
    spiParams.transferMode = SPI_MODE_CALLBACK;
    spiParams.transferCallbackFxn = spiCBFxn;
    spiParams.frameFormat = SPI_POL0_PHA1;
    /* See device-specific technical reference manual for supported speeds */
    spiParams.bitRate = 1000000;
    
    transferOK = SPI_transfer(controllerSpi, &transaction);
    GPIO_toggle(CONFIG_GPIO_LED_1);
    
    while(!transferComplete); // blocking.

    第三个选项:此选项可以在 CS 停用后将 GPIO_TOGGLE 功能最小化。 在我的示例中、将时间从 22us 缩短到 10us。

    volatile bool transferComplete = false;
    
    void spiCBFxn(SPI_Handle handle, SPI_Transaction *transaction)
    {
        transferComplete = false;
        if (transaction->status == SPI_TRANSFER_COMPLETED)
        {
            transferComplete = true;
            GPIO_toggle(CONFIG_GPIO_LED_1);
        }
    }
    ....
    SPI_Params_init(&spiParams);
            spiParams.transferMode = SPI_MODE_CALLBACK;
            spiParams.transferCallbackFxn = spiCBFxn;
            spiParams.frameFormat = SPI_POL0_PHA1;
            /* See device-specific technical reference manual for supported speeds */
            spiParams.bitRate     = 1000000;
    ....
    transferOK = SPI_transfer(controllerSpi, &transaction);
    while(!transferComplete); // blocking.

    致幻:

    -您可以决定并行运行 GPIO_TOGGLE 与 SPI_Transfer 或在 SPI_Callback 函数中,您可以决定根据 SPI_TRANSFER 状态切换 GPIO。 以下是您可以根据 SPI_Transfer 状态检查的状态代码。 根据 SPI 状态处理 GPIO 的最佳方法是使用回调函数。

    SPI_TRANSFER_COMPLETED = 0、/*!< SPI 传输已完成*/
    SPI_TRANSFER_STARTED、/*!< SPI 传输已开始并正在进行*/
    SPI_TRANSFER_CANCELLED、/*!< SPI 传输被取消*/
    SPI_TRANSFER_FAILED、/*!< SPI 传输失败*/
    SPI_TRANSFER_CSN_DEASSERT、/*!< SPI 芯片选择被置为无效(仅限
    适用于返回部分模式)*/
    SPI_TRANSFER_PEND_CSn_ASSERT、/*!< SPI 传输在芯片之前挂起
    选择生效*/
    SPI_TRANSFER_QUEUTERED /*!< SPI 传输已添加到事务队列*/

    -更改 SPI 中断优先级不会缩短执行时间。

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

    您好:

    感谢您的回答。 基本上、我的客户会按照您的建议使用回调功能。

    他们有一个问题是,如果这种延迟不仅发生在 SPI 功能,而且发生在所有的外设情况下,例如, UART。

    因为他们认为某个 RTOS 正在最终确定函数。

    此致、

    A. Fujinaka

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

    你好,很高兴听到.

    在等待中断通知系统期间、可能会发生延迟。 当我们使用回调时、这种情况会发生得更快。 因为回调是在 spitransfer 结束之前调用的。

    在我的设置中、只有 SPI 传输中断。 他们可以使用工具来研究自己的 RTOS 时间表、他们可以更改中断优先级等。

    回调中断速度更快。 这就是我们使用的协议。  

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

    有任何问题留在这个线程?  

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

    你好  

    所以,你的意思是,这种延迟可能会发生任何外围函数返回,对吧?

    此致、

    A. Fujinaka

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

    是、如果是通信接口。 最好的方法是使用回调来将其最小化。