Other Parts Discussed in Thread: SYSCONFIG, LP-EM-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



