UG435.07: Energy Saving with Silicon Labs Connect v3.x (Rev. 0.1)

Connect v3.x User’s Guide 的本章讨论了降低 Silicon Labs Connect Stack 网络应用功耗的技术。Connect stack 作为 Silicon Labs Proprietary Flex SDK v3.0 及更高版本的一部分来交付。 Connect v3.x User’s Guide 假定您已经安装了 Simplicity Studio 开发环境和 Flex SDK,并且熟悉配置、编译、刷写 Connect-based 应用程序的基础知识。有关 Connect v3.x User’s Guide 中各章的概述,请参阅 UG435.01: About the Connect v3.x User’s Guide

1. Introduction to Energy Modes

在电池供电的微控制器应用中,节能至关重要。通过减少电流消耗,可以显著延长应用的有效电池寿命。

Wireless Gecko(EFR32™)产品组合支持五种 Energy Mode:

  • Run Mode (Energy Mode 0)
  • Sleep Mode (Energy Mode 1)
  • Deep Sleep Mode (Energy Mode 2)
  • Stop Mode (Energy Mode 3)
  • Hibernate Mode / Shut Off Mode (Energy Mode 4)

在这五个 Energy Mode 中,Silicon Labs Connect 支持 EM0、EM1 和 EM2。

1.1 Energy Mode 0

这是默认模式。在这种模式下,CPU 从 flash 或 RAM 中获取并执行指令,所有外设均可用。

1.2 Energy Mode 1

在 Sleep Mode 下,CPU 的时钟被禁用。所有外设以及 RAM 和 flash 仍然可用。通过使用 PRS(Peripheral Reflex System)和 DMA,可以自主执行一些操作。这可以通过暂停应用程序的主循环来帮助节能,但不会干扰中断的及时处理。例如,无线电仍可以在 EM1 中接收数据包。

1.3 Energy Mode 2

在 Deep Sleep Mode 下,没有高频振荡器运行,这意味着仅异步和低频外设可用。此模式进一步提高了能效,同时仍允许进行一定范围的活动。在这种模式下,无线电将关闭,节点将不会接收数据包。

1.4 Power Manager Component

Power Manager 是一个 platform-level 软件模块,用于管理系统的 Energy Mode。对于示例应用,默认情况下启用 Power Manager 组件。Silicon Labs 建议使用 Power Manager 来控制应用程序的 Energy Mode。

Figure 1.1. Silicon Labs Connect Power Manager Component

应用程序和组件可以通过以下 Power Manager API 调用来控制最低允许的 Power Manager:

  1. void sl_power_manager_add_em_requirement(sl_power_manager_em_t em);
  2. void sl_power_manager_remove_em_requirement(sl_power_manager_em_t em);

1.5 Support for Sending Data to Sleepy End Devices

当一个 Sleepy End Device 处于 Sleep Mode 时,MCU 停止并且无线电关闭。结果,该设备无法从其他方接收数据。为解决此问题,请在 Sleepy Device 唤醒时检查消息是否正在等待接收。Silicon Labs Connect 支持两种向 Sleepy End Device 发送数据的方式:

  • Indirect Queue
  • Mailbox (uses Indirect Queue)

注意:如果设备配置为 Sleepy End Device,则无线电将始终处于 idle mode,除非它正在发送或在有限时间段内等待特定消息(如确认或待决帧)。相反,Non-sleepy Device 始终处于接收模式(除了发送期外)。

1.5.1 Indirect Queue

Indirect Queue 是 Parent Support 中的一个组件,由于 Parent Support 组件,它将在星型(或扩展星型)拓扑中的 Coordinator(或 Range Extender)中隐式启用。在设备端,必须启用 Poll 组件才能从 Coordinator 中检索信息 —— 例如,在请求需要很长的处理时间的情况下,End Device 可以选择睡眠(以允许处理完成)并在稍后醒来后检索信息。

Coordinator 将保留此类数据,直到相关的 End Device 请求该数据为止。在这种情况下,要从 Coordinator 获取数据,End Device 必须首先轮询 Coordinator 以确定是否有可用数据。为此,设备发送由 Coordinator 确认的数据请求。然后,Coordinator 确定它是否具有用于该请求设备的任何数据。如果有,则它将发送接收设备可以确认的数据包。

1.5.1.1 Coordinator/Extender Settings

Parent Support 组件中有两个参数可修改 Indirect Queue 行为:

  • Indirect Queue Size 确定每次队列中可以包含多少个数据包。如果队列已满,则在队列中的空间恢复之前,无法将其他项添加到队列中 —— 通过将项发送到接收方设备,或通过过期(达到超时)项。
  • Indirect Transmission Timeout 值以毫秒为单位。大于指定超时的消息将被 Coordinator 丢弃。

下图显示了在何处选择 Silicon Labs Connect Parent Support 组件。

Figure 1.2. Silicon Labs Connect Parent Support Component

在 Coordinator 上,不需要额外的努力。在 Connect 中,协议栈处理发送到 Sleepy Device 的消息。

1.5.1.2 Sleepy End Device Settings

在 Sleepy End Device 上,应启用 Poll 组件以从 Coordinator 接收存储的消息。下图显示了 Poll 组件的可用设置。

Figure 1.3. Silicon Labs Connect Poll Component

当 Sleepy End Device 轮询消息时,它会向 Coordinator 发送数据请求并等待确认。如果有待决数据发送到 Sleepy End Device,则 Coordinator 会在 Frame Control Field 中设置 Frame Pending bit。否则,不会设置该 bit。Sleepy End Device 检查 Frame Pending bit,并等待来自 Coordinator 的下一条消息。如果未设置 Frame Pending bit,则该设备没有待决消息,因此它可以返回 Sleep Mode。

Poll 组件支持短轮询间隔和长轮询间隔。短轮询用于从 Coordinator 获取数据,而长轮询用于“keep alive”目的,以确保将 Sleepy End Device 保留在 Coordinator 的子表中。

可以通过以下 Silicon Labs Connect API 调用在短轮询和长轮询之间切换:

  1. void emberAfPluginPollEnableShortPolling(bool enable);

为了轮询数据,Poll 组件使用以下 API 调用:

  1. EmberStatus emberPollForData(void);

这将发送一个数据请求命令到父节点。

如果 Indirect Queue 中有消息正在等待,则设备将通过以下回调接收到该消息:

  1. void emberAfIncomingMessageCallback(EmberIncomingMessage *message)

通过单次轮询,设备只能检索单条消息。因此,要接收所有待决消息,必须重复轮询直到没有收到其他消息。

1.5.2 Mailbox

Mailbox 功能在应用级实现。Mailbox 用于从 Coordinator 或另一台设备向 Sleepy End Device 发送信息。对于 Sleepy Device,Mailbox 使用协议栈的 Indirect Queue 特性来检索消息。Mailbox 由两部分组成:

  • Mailbox Client
  • Mailbox Server

使用 Mailbox,可以灵活地分配客户端或服务端角色(例如,可以将服务端添加到 End Device,将客户端添加到 Coordinator)。Mailbox 使用端点(endpoint)在客户端和服务端之间传输消息。在 Server 和 Client 组件中都设置了为协议选择的端点,它们必须匹配。在服务端,可以设置其他两个参数:服务端可以存储的最大数据包数量及其超时。可以在 Universal Configurator 中设置这些值(请参考以下两个图)。

Figure 1.4. Silicon Labs Connect Mailbox Client Component

Figure 1.5. Silicon Labs Connect Mailbox Server Component

MAC mode 不支持 Mailbox,因为 Mailbox 使用了在 Silicon Labs Connect 网络层中实现的端点。然而,它可以在 Connect Direct mode(应用程序应实现睡眠)下工作。

使用 Mailbox 的主要优点是,服务端将在传递消息或由于错误而无法传递消息时通知客户端提交消息。

1.5.2.1 Mailbox Client

Mailbox 客户端可以提交消息并检查收件箱(inbox)。在这两种情况下,结果都是通过回调函数传递的。

Check-related API 调用:

  1. emberAfPluginMailboxClientCheckInbox()
  2. emberAfPluginMailboxClientCheckInboxCallback()

Submit-related API 调用:

  1. emberAfPluginMailboxClientMessageSubmit()
  2. emberAfPluginMailboxClientMessageSubmitCallback()
  3. emberAfPluginMailboxClientMessageDeliveredCallback()

注意:当 Mailbox Client 的握手超时设置为 250 ms 时,短轮询间隔的默认值为 4 个四分之一秒(1 s)。因此,可能会发生 Mailbox Client 在等待轮询待决消息期间超时的情况。Silicon Labs 建议设置这些值以适配应用程序。这通常意味着握手超时应高于短轮询间隔。

1.5.2.2 Mailbox Server

在服务端上,要设置 Mailbox 系统,只需启用 Connect Mailbox Server 组件。而无需额外的代码。但是,如果需要,可以启动可用的支持功能,使服务端可以使用以下 API 调用将消息直接添加到 Mailbox:

  1. emberAfPluginMailboxServerAddMessage()
  2. emberAfPluginMailboxServerMessageDeliveredCallback()

1.6 Additional Methods for Reducing Energy Consumption

为了完全降低功耗,请禁用不必要的特性和未使用的外设。

1.6.1 SPI Flash

所有 Silicon Labs EFR32 无线板均包含 SPI Flash。尽管这些闪存设备在待机状态下仅消耗 8-10 µA 电流,但这种不断消耗的电流会增加表面上的睡眠电流并缩短有效电池寿命。这些闪存设备具有一个 deep power down mode,可通过发出 SPI 命令来进行访问。对于 Silicon Labs 无线电板,默认配置是固件通过 MX25 Flash Shutdown 组件将外部 SPI flash 置于 deep power down mode。

1.6.2 Network Up LED

默认情况下,某些 Connect 示例使用一个 LED 来显示网络栈状态。协议栈起动(up)时,此指示灯点亮。

  1. void emberAfTickCallback(void)
  2. {
  3. if (emberStackIsUp()) {
  4. sl_led_turn_on(&sl_led_led0);
  5. } else {
  6. sl_led_turn_off(&sl_led_led0);
  7. }
  8. }

为了节能,请移除 sl_led_turn_on(&sl_led_led0); 行或将其更改为 sl_led_turn_off(&sl_led_led0);

根据经验,目标是将尽可能多的时间花在 Sleep Mode 上,并在必要时仅在短时间内唤醒。应用上述技术,基于 Silicon Labs Connect 的应用程序的 sleep-mode 电流消耗可降低至 2-4 µA。