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.

[参考译文] CC2340R5:当 SPI 芯片选择和另外两个 GPIO 引脚用作唤醒线路时、不会发生从 SHUTDOWN 状态唤醒的情况&&39

Guru**** 2649655 points

Other Parts Discussed in Thread: SYSCONFIG, LP-EM-CC2340R5

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1568789/cc2340r5-wakeup-from-shutdown-doesn-t-happen-when-spi-chip-select-and-two-other-gpio-pins-are-used-as-wakeup-lines

器件型号:CC2340R5
主题中讨论的其他器件:SysConfig

工具/软件:

您好:

我一直在使用 SPI 的芯片选择线路进行唤醒。 在我添加了额外的两个 GPIO 作为唤醒源之前、一直工作正常。 我重新设计了 basic_ble_project用于在与应用程序隔离的情况下重现此场景。

主任务和用户任务:

void *user_task(void *arg)
{
    bool init_status;

    PowerLPF3_ResetReason resetReason = PowerLPF3_getResetReason();

    if (resetReason == PowerLPF3_RESET_SHUTDOWN_IO)
    {
        PowerLPF3_releaseLatches();
    }

    init_status = user_init();

    if (init_status == false)
    {
        while(1)
        {
            GPIO_toggle(CONFIG_GPIO_LED);
            vTaskDelay(pdMS_TO_TICKS(100));
        }
    }
    else
    {
        while(1)
        {
            GPIO_toggle(CONFIG_GPIO_LED);
            vTaskDelay(pdMS_TO_TICKS(500));

            count++;
            if (count >= 10)
            {
                user_enter_shutdown();
            }
        }
    }
}

int main()
{
  /* Register Application callback to trap asserts raised in the Stack */
  halAssertCback = AssertHandler;
  RegisterAssertCback(AssertHandler);

  Board_init();

  /* Update User Configuration of the stack */
  user0Cfg.appServiceInfo->timerTickPeriod = ICall_getTickPeriod();
  user0Cfg.appServiceInfo->timerMaxMillisecond  = ICall_getMaxMSecs();

  /* Initialize all applications tasks */
//  appMain();

  pthread_create(&user_thread, &user_task_attr, &user_task, NULL);

  /* Start the FreeRTOS scheduler */
  vTaskStartScheduler();

  return 0;
}

辅助函数:

static int postNotifyFxn(unsigned int eventType, uintptr_t eventArg,
                           uintptr_t clientArg)
{
    if (eventType == PowerLPF3_ENTERING_SHUTDOWN)
    {
        notified = 1;
        return Power_NOTIFYDONE;
    }

    return Power_NOTIFYERROR;
}

void transferCompleteFxn(SPI_Handle handle, SPI_Transaction *transaction)
{
    (void)handle;
    (void)transaction;
}

static bool user_init()
{
    SPI_Params spiParams;
    Power_NotifyObj powerNotifyObj;

    uintptr_t clientArg = count;
    unsigned int eventTypes = PowerLPF3_ENTERING_SHUTDOWN;

    SPI_init();
    SPI_Params_init(&spiParams);

    spiParams.frameFormat         = SPI_POL0_PHA0;
    spiParams.mode                = SPI_PERIPHERAL;
    spiParams.transferCallbackFxn = transferCompleteFxn;
    spiParams.transferMode        = SPI_MODE_CALLBACK;
    spiParams.bitRate             = 4000000;

    spi_handle = SPI_open(CONFIG_SPI_PERIPHERAL, &spiParams);

    if (spi_handle == NULL)
    {
        return false;
    }

    GPIO_write(CONFIG_GPIO_LED, 1);

    Power_registerNotify(&powerNotifyObj, eventTypes, postNotifyFxn, clientArg);

    return true;
}

static void user_enter_shutdown()
{
    int_fast16_t shutdown_status;

    // debug led-off
    GPIO_write(CONFIG_GPIO_LED, 0);

    // close spi
    SPI_transferCancel(spi_handle);
    SPI_close(spi_handle);
    UDMALPF3_channelDisable(0xFF);
    uDMADisable();

    // set wakeup pins
    GPIO_setConfig(CONFIG_GPIO_SPI_PERIPHERAL_CSN, GPIO_CFG_IN_PU | GPIO_CFG_SHUTDOWN_WAKE_LOW);
    GPIO_setConfig(CONFIG_GPIO_BTN1, GPIO_CFG_IN_PU | GPIO_CFG_SHUTDOWN_WAKE_LOW);
    GPIO_setConfig(CONFIG_GPIO_BTN2, GPIO_CFG_IN_PU | GPIO_CFG_SHUTDOWN_WAKE_LOW);

    // enter shutdown
    shutdown_status = Power_shutdown(0, 0);

    // debug led-on when shutdown fails
    if (shutdown_status != Power_SOK)
    {
        GPIO_write(CONFIG_GPIO_LED, 1);
        while(1);
    }
}


这是从 SHUTDOWN 模式唤醒时遇到问题的地方。 之前我没有第 65 行和第 66 行、但最近添加了。

  • 启用行#64、#65 和#66 后、器件 仅从 CONFIG_GPIO_SPI_PERIPHERAL_CSN引脚唤醒。



  • 在注释#64、启用#65 和#66 的情况下、设备会通过其他两个引脚(和)唤醒CONFIG_GPIO_BTN1CONFIG_GPIO_BTN2



  • 在 注释#65 和#66 且启用#64 后、器件仍然唤醒。

请在此处找到所附的 saleae 捕获数据以供您参考。

e2e.ti.com/.../saleae_5F00_captures.zip


问题:

SPI 似乎存在某种依赖关系、我无法自己理解或弄清楚。 如何确保器件 从所有 3 个源唤醒?

此致、
Jaimin

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

    后续资料:

    MCU:CC2340R5-RGE 使用我们的定制 PCB
    DIO11:SPI 芯片选择
    DIO8:Button1 /w 内部上拉电阻
    DIO20:按钮 2 /w 内部上拉

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

    您好、Jaimin、

    我希望您做得好。 我想问它基于哪个 SDK 版本、以及您启用了哪种芯片选择类型。  

    • 硬件芯片选择 不需要应用程序执行其他操作。
    • 软件芯片选择 应用需要为适当的 SPI 外设处理芯片选择置为有效和置为无效  

    谢谢、
    Alex F

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

    我发布此查询时使用的是 SDK v7.40。 为了排除 SDK 版本 、我 使用 v9.11.00.18 重复了此活动。 我在波形中看到了相同的行为。

    我使用了基于硬件的芯片选择。 请找到我附加的 SysConfig 供您参考。
    /cfs-file/__key/communityserver-discussions-components-files/538/basic_5F00_ble.syscfg.zip

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

    您好 Ajmeri Jaimin,

    我今天使用以下代码执行了一些测试、尝试复制您在将 SPI 芯片选择设置为唤醒(或将其注释掉)时发现的问题;在我的测试中、我没有注意到与器件在两种情况下(无论有或没有 SPI CS)可能从按钮按下操作中唤醒的行为相同。 您能否在定制器件上尝试下面的代码、看看是否获得了类似的结果?  

    #define CONFIG_SPI_CONTROLLER           0
    /*
     *  ======== mainThread ========
     */
    void *mainThread(void *arg0)
    {
        PowerLPF3_ResetReason resetReason = PowerLPF3_getResetReason();
    
        /* If we are waking up from shutdown, we do something extra. */
        if (resetReason == PowerLPF3_RESET_SHUTDOWN_IO)
        {
            /* Application code must always disable the IO latches when coming out of shutdown */
            PowerLPF3_releaseLatches();
    
        }
        SPI_Handle spi_handle;
        SPI_Params spiParams;
        SPI_Transaction transaction;
        uint32_t i;
        bool transferOK;
        int32_t status;
        /* 1 second delay */
        uint32_t time = 1;
        SPI_init();
        SPI_Params_init(&spiParams);
    
        spiParams.frameFormat         = SPI_POL0_PHA0;
        spiParams.mode                = SPI_PERIPHERAL;
        //spiParams.transferCallbackFxn = transferCompleteFxn;
        spiParams.transferMode        = SPI_MODE_CALLBACK;
        spiParams.bitRate             = 4000000;
    
        spi_handle = SPI_open(CONFIG_SPI_CONTROLLER, &spiParams);
        /* Call driver init functions */
        GPIO_init();
        // I2C_init();
        // SPI_init();
        // Watchdog_init();
        SPI_transferCancel(spi_handle);
        SPI_close(spi_handle);
        /* Configure the LED pin */
        GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    
        GPIO_setConfig(CONFIG_GPIO_SPI_0_CSN, GPIO_CFG_IN_PU | GPIO_CFG_SHUTDOWN_WAKE_LOW);
        GPIO_setConfig(CONFIG_GPIO_0, GPIO_CFG_IN_PU | GPIO_CFG_SHUTDOWN_WAKE_LOW);
        GPIO_setConfig(CONFIG_GPIO_1, GPIO_CFG_IN_PU | GPIO_CFG_SHUTDOWN_WAKE_LOW);
        /* Turn on user LED */
        GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);
    
            sleep(time);
            GPIO_toggle(CONFIG_GPIO_LED_0);
            /* Go to shutdown */
            Power_shutdown(0, 0);
    }

    谢谢、
    Alex F

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

    您好 Alex、

    我在定制 PCB 上尝试使用您的代码、但它不起作用。 我搬到了 开发板 (LP-EM-CC2340R5)、感觉不错。

    我用我的代码重复了这个练习。 它适用于开发板、但不适用于我的 PCB。

    我发现我的电路板还有另一个问题。 上电复位后、器件 无法从按钮唤醒、但仅在器件进入关断状态后从芯片选择唤醒。 随后、它能够通过按钮和片选线路唤醒。 TLDR;器件缺少第一次从按钮唤醒、否则它工作正常、正如我所预期的那样。 我不明白发生了什么。

    您能否建议采取进一步行动?

    此致、
    Jaimin

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

    您好、Jaimin、

    如果您尚未通过向 SIMPLELINK-2-4GH-DESIGN-REVERS 设计工具|德州仪器 TI.com 提交申请、建议由我们的团队审核您的 PCB。 当您尝试 PCB 和 LaunchPad 上的代码并看到不同的结果时、这似乎源于 PCB 本身。  

    谢谢、
    Alex F

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

    您好 Alex、

    感谢您的及时答复。

    与 我之前所做的测试有一个区别。 SPI-CS 线路保持未连接状态。 但是、在定制 PCB 上、该线路连接到 SPI 控制器(主器件 RF432)。 在 SPI 控制器侧、片选线路切换到具有高电平状态的 GPIO 输出模式、而在 CC2340 上、切换到具有内部上拉电阻的 GPIO 输入模式  、以实现最低功耗。

    此致、
    Jaimin

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

    您好、Jaimin、

    我想让大家知道我最近使用之前提供的相同代码进行的测试、在此测试中、我将 SPI 片选引脚接地、这会导致即使我按下按钮 1 或 2、器件也始终保持关断状态;请注意、一旦从 CS 中移除接地端、我就可以使用按钮 1/2 来唤醒器件。

    根据我可以看出、一旦 SPI CS 引脚保持低电平有效接地、它就不会通过按钮唤醒。  

    谢谢、
    Alex F

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

    您好 Alex、

    我今天试过、我看到了与你一样的看法。 如果器件已进入睡眠状态、我期望器件仍然响应唤醒。

    我使用逻辑分析仪观察到的结果表明、在器件进入睡眠模式后将 CS 引脚接地会唤醒 MCU、并且可能无法进入关断模式。 因此、我修改了代码以关闭 LED 亮起 PowerLPF3_ENTERING_SHUTDOWN事件、否则它会保持亮起状态。 我观察到 LED 正在关闭、这意味着它正在进入 SHUTDOWN 模式。 那么、它如何无法唤醒呢?

    要点是、这可能是问题的根本原因。 因此、我必须调查 CS 线路的状态才能进行调试。
    如果 没有、请进一步澄清。

    谢谢、
    Jaimin

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

    您好、Jaimin、

    ]我使用逻辑分析仪观察到的情况表明、器件进入睡眠状态后 CS 引脚接地会唤醒 MCU

    我还观察到、在将引脚接地后、它会复位一次、但一旦恢复关断状态、它永远不会唤醒、直到您将引脚断开接地。一旦 CS 引脚未接地、器件就会唤醒、并可通过按钮再次控制。  

    我需要进一步研究 CS 引脚导致这种影响的原因;作为一项测试、我们可以尝试禁用(或关闭)SPI、以查看是否可以在 CS 引脚接地(disableSPI 功能)时唤醒我们。

    谢谢、
    Alex F

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

    您好 Alex、

     SPI_transferCancel(spi_handle) SPI_close(spi_handle) 在您的代码和我的代码中、我们已经在进入关闭模式之前进行了函数调用。 您是指其他 API 吗? 因为我在驱动程序中看不到 disableSPI 功能。

    此致、
    Jaimin

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

    您好、Jaimin、

    “disableSPI"函“函数可以在 SPILPF3DMA.c 文件中找到;但我想的是 SPI 取消和 SPI 关闭、所以奇怪的是我们不能在此处强制关闭以返回按钮的功能。  

    /*
     *  ======== disableSPI ========
     *  Disables the SPI peripheral
     */
    static inline void disableSPI(uint32_t baseAddr)
    {
        HWREG(baseAddr + SPI_O_CTL1) &= ~SPI_CTL1_EN_EN;
    }

    谢谢、
    Alex F

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

    您好 Alex、

    我今天探测了片选线路、并使用逻辑分析仪快速采集了数据。

    我看到片选在上电复位后保持低电平。  

    请在下面找到捕获文件的链接。
    /cfs-file/__key/communityserver-discussions-components-files/538/cs_5F00_probed.zip

    此致、
    Jaimin

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

    您好、Jaimin、

    在这种情况下、片选元件未正确接地? 如果没有,我会看到我是否可以复制在我的最后  

    谢谢、
    Alex F

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

    您好 Alex、

    片选未接地。

    此致、
    Jaimin

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

    您好、Jaimin、

    您的芯片选择低电平有效还是高电平有效? 在我的简单测试中、我确实会在断开电源后看到 CS 线路变为低电平、然后在连接电源后它恢复到高电平、但正常复位没有任何明显的效果。

    您是否特别关注图片中的裁剪区域? 如果可能、您可以共享您的产品型代码或在此处设置、以便我进一步测试吗?  

    谢谢、
    Alex F

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

    您好 Alex、

    片选引脚采用低电平有效配置。

    图像的裁剪区域是我担心的问题。 您可以看到、如果芯片选择为低电平、按钮按压检测功能没有唤醒器件、我希望唤醒器件。 TI 必须根据您之前的回复调查这个问题。

    为什么复位后芯片选择为低电平?
     裁剪区域显示了两个 MCU 都处于空闲状态并  由于不活动而进入低功耗模式的情况。 另一个 MCU 是 SPI 控制器(主器件)、片选线路不是由 SPI 硬件控制、而是由 GPIO 控制。 因此、复位后、此 MCU 会初始化 SPI 驱动器、但芯片选择保持低电平。 只有在 SPI 传输期间、才会以低电平有效方式控制片选线路。  此 MCU 会在一段时间内保持空闲状态、并在没有活动时进入低功耗模式、这说明了您裁剪区域中的芯片选择处于低电平。 如果有酸性、它会进行 SPI 传输、从而使芯片选择瞬间变为高电平、然后在传输期间变为低电平并继续保持高电平。 然后再次进入低功耗模式。

    我希望这能回答您的问题?

    作为权变措施、在初始化阶段、我在 SPI 控制器上将芯片选择设为高电平、以查看 cc2340 是否通过按钮唤醒。 它确实唤醒了,我们已经知道原因。  在接受这一解决方案之前、我必须对其进行彻底的测试。

    请注意、另一个 MCU 包含 NDA、我愿意直接与您共享代码、如果可能、也可以通过业务 e2e 支持共享。

    此致、
    Jaimin

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

    您好、Jaimin、

    您可以通过 E2E 上的私人消息功能与我共享您的代码(或 SPI 功能原型设计)、也可以联系分配给您的 FAE、他将与我和您发送电子邮件主题。  

    MCU has NDAC

    这是 TI 器件? 或者这只是参考受保密协议约束的代码吗?  

    作为变通办法、在初始化阶段、我在 SPI 控制器上将芯片选择设为高电平、以查看 cc2340 是否通过按钮唤醒。 它确实唤醒了,我们已经知道原因。  在接受此解决方案之前、我必须对其进行全面测试。

    根据我们先前的观察、这似乎是我们可以在这里采取的一条道路。 手动强制 CS 为高电平以便我们进行控制。  

    谢谢、
    Alex F