HRP-N3 - серия источников питания с максимальной пиковой мощностью в 350% от MEAN WELL
РадиоЛоцман - Все об электронике

Стеки для организации беспроводной передачи данных на основе устройств STM32W108. Часть 3

Журнал РАДИОЛОЦМАН, ноябрь 2014

Михаил Русских

Часть 2

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Поясняется принцип работы с библиотекой ST RF4CE, описываются функции инициализации, обнаружения, сопряжения и обмена сообщениями, рассматриваются возможности защищенной передачи данных, перевода радиомодуля в режим экономии энергии, а также работа с энергонезависимой памятью.

Библиотека ST RF4CE

Библиотека ST RF4CE [1] обеспечивает микроконтроллеры серии STM32W необходимыми функциями для реализации протокола беспроводной связи для потребительских устройств RF4CE. Кроме того, она может работать с энергонезависимой памятью для хранения данных, а также позволяет управлять энергопотреблением радиопередатчика в соответствии со спецификацией ZigBee RF4CE.

Функции библиотеки могут быть использованы как в узлах-контроллерах, так и в целевых узлах. Они являются неблокирующими, то есть при ожидании какого-то события эти функции передадут управление обратно приложению. Концепция построения программной архитектуры приложения, работающего с библиотекой ST RF4CE, основана на принципе конечных автоматов. Эта концепция продемонстрирована в Листинге 2. В нем организован бесконечный цикл, в котором задействованы автомат приложения и автомат сетевого уровня.

Листинг 2.

while (1) {
/* Неблокирующий вызов для запуска конечного автомата приложения */
ApplicationTick();
/* Неблокирующий вызов для запуска конечного автомата сетевого уровня */
(void) NWK_Tick();
}

Далее рассмотрим основные функции библиотеки, позволяющие организовать беспроводную связь по протоколу ZigBee RF4CE.

Инициализация

Сетевой уровень инициализируется вызовом функции NWK_Init(uint8_t nodeCap, bool forceColdStart). В параметре nodeCap указываются параметры узла: его тип (целевой узел или узел-контроллер), способ питания (сетевое или аккумуляторное), обеспечение безопасности (поддерживается или нет узлом зашифрованная передача данных). Параметр forceColdStart может принимать два значения – TRUE или FALSE. В первом случае будет инициирована процедура «холодного старта»; при этом будут сброшены все сетевые настройки, и библиотека заново сконфигурирует параметры MAC-уровня. «Холодный старт» рекомендуется выполнять только при первом запуске устройства. В других случаях, например, после замены батарейки, параметру нужно присваивать значение FALSE для «горячего старта». Тогда узел сохранит основные сетевые параметры, включая таблицу сопряжений, в энергонезависимую память, чтобы после перезагрузки время запуска было минимальным. Если при «горячем старте» обнаружено несоответствие между содержимым энергонезависимой памяти и параметрами узла, функция вернет значение RF4CE_NVM_DATA_INVALID. В этом случае требуется выполнить инициализацию с помощью «холодного старта».

Инициализация узла-контроллера происходит сразу же после вызова функции NWK_Init, которая в случае успешного результата вернет SUCCESS. После этого сетевой уровень будет готов для коммуникации.

При «горячем старте» целевого узла инициализация также будет выполнена незамедлительно, и в случае успеха функция вернет значение SUCCESS. Но при «холодном старте» будет возвращено значение RF4CE_SAP_PENDING. Инициализация сетевого уровня завершится только после вызова функции подтверждения NLME_START_confirm (u32 *status). Здесь *status является указателем на область памяти, где хранится статус попытки инициализации. Процесс правильной инициализации сетевого уровня целевого узла продемонстрирован в Листинге 3.

Листинг 3.

void NLME_START_confirm (unsigned long *status)
{
  networkStarted = TRUE;
}
status = NWK_Init(1, FALSE);
if (status == RF4CE_NVM_DATA_INVALID) {
   /* если "горячий старт" не удался, осуществить "холодный старт" */
   status = NWK_Init(1, TRUE);
   while (networkStarted == FALSE) {
(void) NWK_Tick();
   }
}

Обнаружение

Процесс обнаружения, как в целевом узле, так и в узле-контроллере начинается с вызова функции NLME_DISCOVERY_request(NLME_DISCOVERY_REQUEST_Type *param). Здесь *param является указателем на список параметров, определяемых структурой NLME_DISCOVERY_REQUEST_Type. Эти параметры с описанием приведены в Таблице 2. В случае успеха функция вернет значение RF4CE_SAP_PENDING, что подтвердит готовность к процессу обнаружения. Завершается этот процесс функцией обратного вызова NLME_DISCOVERY_confirm (NLME_DISCOVERY_CONFIRM_Type *param) с тремя параметрами: Status, NumNodes и NodeDescList. Параметр Status определяет статус попытки обнаружения и может принимать значения SUCCESS (успешная попытка), DISCOVERY_ERROR (возникла ошибка в процессе обнаружения), DISCOVERY_TIMEOUT (время, выделенное для процесса обнаружения, вышло). NumNodes выражает количество обнаруженных узлов. NodeDescList представляет собой массив, являющийся списком дескрипторов обнаруженных узлов.

Таблица 2. Список параметров структуры NLME_DISCOVERY_REQUEST_Type.
Параметр Размерность Описание
DstPANId 16 бит Идентификатор персональной сети назначения
DstNwkAddr 16 бит Сетевой адрес точки назначения
OrgAppCapabilities 8 бит Параметры узла
OrgDevTypeList[] Массив из
8-битных
значений
Список типов устройств, поддерживаемых узлом
OrgProfileIdList[] Массив из
8-битных
значений
Список идентификаторов профилей, поддерживаемых узлом
SearchDevType 8 бит Тип устройства, которое необходимо обнаружить
DiscProfileIdListSize 8 бит Количество идентификаторов профилей, содержащихся в
массиве DiscProfileIdList
DiscProfileIdList[] Массив из
8-битных
значений
Список идентификаторов профилей, при соответствии которым
идентификаторы профилей, содержащиеся в полученных кадрах
ответов на запрос об обнаружении, будут приняты
DiscDuration 32 бита Максимальное количество MAC-символов, которое необходимо
для ожидания ответа целевых узлов на запрос об обнаружении

Сопряжение

Сопряжение устройств должно выполняться до начала обмена информацией между узлами сети RF4CE. Оно может быть инициировано как целевым узлом, так и узлом-контроллером с помощью функции NLME_PAIR_request (NLME_PAIR_REQUEST_Type *param), параметры которой приведены в Таблице 3. При успешном завершении она возвращает значение RF4CE_SAP_PENDING, и операция сопряжения подтверждается функцией обратного вызова NLME_PAIR_confirm(NLME_PAIR_CONFIRM_Type *param). Параметры этой функции указаны в Таблице 4.

Таблица 3. Список параметров структуры NLME_PAIR_REQUEST_Type.
Параметр Размерность Описание
LogicalChannel 8 бит Логический канал устройства, с которым
требуется сопряжение
DstPANId 16 бит PAN-идентификатор устройства, с которым
требуется сопряжение
DstIEEEAddr Массив из
восьми
8-битных значений
IEEE-адрес устройства, с которым
требуется сопряжение
OrgAppCapabilities 8 бит Параметры узла
OrgDevTypeList[] Массив из
8-битных
значений
Список типов устройств, поддерживаемых
узлом
OrgProfileIdList[] Массив из
8-битных
значений
Список идентификаторов профилей,
поддерживаемых узлом
KeyExTransferCount 8 бит Количество передач, которые целевой узел
должен использоватьтдля того, чтобы
обменяться ключом связи с инициатором
процесса сопряжения
 
Таблица 4. Список параметров структуры NLME_PAIR_CONFIRM_Type.
Параметр Размерность Описание
Status 32 бита Статус попытки сопряжения. Может принимать следующие значения:
SUCCESS – операция была успешно выполнена NO_REC_CAPACITY
– сопряжение не может быть выполнено, поскольку в таблице
сопряжения узла-получателя достигнуто максимальное число записей
NO_RESPONSE – кадр ответа не был получен в течение времени,
установленного в nwkResponseWaitTime NOT_PERMITTED – запрос
на сопряжение был отклонен узлом-получателем SECURITY_FAILURE
– ключ безопасности не был успешно установлен между сопрягающимися
узлами SECURITY_TIMEOUT – процедура обмена ключом безопасности
не завершилась в течение необходимого времени
PairingRef 8 бит Ссылка на часть таблицы сопряжения для данной процедуры установки
связи. Если параметр Status не будет равен SUCCESS, то значение
PairingRef будет равно 0xff
RecVendorId 16 бит Идентификатор производителя узла, с которым выполняется сопряжение
RecAppCapabilities 8 бит Параметры узла, с которым выполняется сопряжение
RecUserString[] Массив из
8-битных
значений
Массив определенных пользователем идентификаторов
RecDevTypeList[] Массив из
8-битных
значений
Список типов устройств, поддерживаемых узлом, с которым
выполняется сопряжение
RecProfileIdList[] Массив из
8-битных
значений
Список идентификаторов профилей, поддерживаемых узлом,
с которым выполняется сопряжение

Обмен сообщениями

Передача сообщений инициируется функцией NLDE_DATA_request(NLDE_DATA_REQUEST_Type *param), параметры которой приведены в Таблице 5, и может быть выполнена как узлом-контроллером, так и целевым узлом. При этом возможны следующие виды коммуникации: от узла-контроллера к целевому узлу, от целевого узла к узлу контроллеру, от целевого узла к целевому узлу.

Обмен сообщениями может быть осуществлен только между теми узлами, которые до этого прошли процедуру сопряжения. В случае успешного выполнения функции запроса на передачу сообщения NLDE_DATA_request будет возвращено значение RF4CE_SAP_PENDING, после чего передача должна быть подтверждена функцией NLDE_DATA_confirm(NLDE_DATA_CONFIRM_Type *param) с параметрами Status и PairingRef. В случае успешно выполненной операции параметр Status примет значение SUCCESS, в противном случае значение INVALID_PARAMETER. PairingRef представляет собой ссылку на таблицу сопряжения.

Таблица 5. Список параметров структуры NLDE_DATA_REQUEST_Type.
Параметр Размерность Описание
PairingRef 8 бит Ссылка на часть таблицы сопряжения, которая содержит
информацию, требуемую для передачи блока данных.
Этот параметр игнорируется, если в параметре TxOptions
активирована широковещательная передача.
ProfileId 8 бит Идентификатор профиля, определяющий формат
передаваемых данных
VendorId 16 бит Идентификатор производителя узла. Если в параметре
TxOptions установлено, что данные не зависят от
производителя, то этот параметр игнорируется.
nsduLength 8 бит Количество октетов, содержащихся в передаваемом
блоке данных
*nsdu 8 бит Набор октетов, формирующих передаваемый блок данных
TxOptions 8 бит Определяет настройки операции передачи текущего
блока данных. Представляет собой поле из семи значимых
бит: Бит 0: 1 – широковещательная передача;
  • – одноадресная передача Бит 1: 1 – использовать
    IEEE-адрес назначения;
  • – использовать сетевой адрес назначения
    Бит 2: 1 – передача с подтверждением;
  • – передача без подтверждения Бит 3: 1 –
    передача в защищенном режиме;
  • – передача в незащищенном режиме Бит 4: 1 –
    одноканальная передача;
  • – многоканальная передача Бит 5: 1 – указывать
    идентификационный номер канала;
  • – не указывать идентификационный номер канала
    Бит 6: 1 – содержимое данных зависит от
    производителя узла;
  • – содержимое данных не зависит от производителя узла

Индикация приема сообщения осуществляется с помощью функции обратного вызова NLDE_DATA_indication(NLDE_DATA_INDICATION_Type *param). Ее параметры указаны в Таблице 6.

Таблица 6. Список параметров структуры NLDE_DATA_INDICATION_Type.
Параметр Размерность Описание
PairingRef 8 бит Ссылка на часть таблицы сопряжения, которая соответствует
информации, содержащейся в принятом блоке данных
ProfileId 8 бит Идентификатор профиля, определяющий формат принятых данных
VendorId 16 бит Идентификатор производителя узла. Если в параметре RxFlags
установлено, что данные не зависят от производителя,
то этот параметр игнорируется.
nsduLength 8 бит Количество октетов, содержащихся в принятом блоке данных
*nsdu 8 бит Набор октетов, формирующих полученный блок данных
RxLinkQuality 8 бит Значение, определяющее качество канала, измеренное
во время приема блока данных
RxFlags 8 бит Определяет флаги операции приема текущего блока данных.
Представляет собой поле из трех значимых бит:
Бит 0: 1 – данные приняты при широковещательной передаче;
  • – данные приняты при одноадресной передаче Бит 1: 1
    – приняты зашифрованные данные;
  • – приняты незашифрованные данные Бит 2: 1 –
    содержимое данных зависит от производителя узла;
  • – содержимое данных не зависит от производителя узла

Безопасная передача данных

Режим безопасной передачи данных автоматически активируется при инициализации радиомодуля, если в параметре nodeCap функции NWK_Init была разрешена такая возможность (второй бит установлен в 1). Но даже если между двумя узлами уже налажена защищенная связь, в процессе работы приложение одного узла может перевести устройство в режим незащищенной передачи данных. Это можно осуществить, установив третий бит параметра TxOptions функции NLDE_DATA_request в 0. В таком случае узел сможет обрабатывать только незашифрованные данные.

Экономия энергии

Библиотека ST RF4CE позволяет также снизить энергопотребление устройства благодаря переходу приемопередатчика в пассивный режим. Это достигается с помощью функции NLME_RX_ENABLE_request (uint32_t RxOnDuration). Параметр RxOnDuration определяет период активной работы радиомодуля. Его установка в 0 дезактивирует модуль. Значение 0xffffff  позволит приемопередатчику постоянно оставаться в активной фазе функционирования. Библиотека подтвердит отключение радиомодуля, когда NWK_Tick() вернет значение RF4CE_STATE_POWER_DOWN.

Кроме того, отключить приемопередатчик можно также другим способом, воспользовавшись функцией NWK_PowerDown(), что будет эквивалентно NLME_RX_ENABLE_request(0) с последующей проверкой возвращаемого значения NWK_Tick().

Работа с энергонезависимой памятью

Библиотека хранит данные, необходимые для работы стека RF4CE, в энергонезависимой памяти. Для этих нужд выделено 1 КБ флэш-памяти. Для предотвращения ее изнашивания вследствие большого количества циклов чтения/записи используется кэш ОЗУ, данные из которого должны периодически переноситься во флеш-память, чтобы не потерять их в случае непреднамеренного отключения питания. Для такого переноса данных служит функция NWK_Flush(). Ее целесообразно вызывать, когда NWK_Tick() оповестит о необходимости перезаписи данных в энергонезависимую память, вернув значение RF4CE_STATE_NEED_CACHE_FLUSH. Листинг 4 демонстрирует процедуру перезаписи данных.

Листинг 4.

retVal = NWK_Tick();
      /* проверка необходимости перезаписи данных из кэша во флэш-память */
      if (retVal & RF4CE_STATE_NEED_CACHE_FLUSH) {
  NWK_Flush();
      }

Заключение

Микроконтроллеры серии STM32W108 являются надежным и недорогим средством организации беспроводной связи стандарта IEEE 802.15.4. Благодаря библиотекам SimpleMAC и ZigBee RF4CE, предоставляемым компанией STMicroelectronics, на основе этих микроконтроллеров можно достаточно быстро сформировать сеть. При этом, исходя из назначения сети, может быть выбрана подходящая библиотека. SimpleMAC позволит организовать структуру, состоящую из большого количества узлов, имеющих несложный функционал. К таким структурам можно отнести сети из датчиков. Если же нужно создать сеть из нескольких устройств с комплексными функциональными возможностями, например, из бытовых электроприборов, то целесообразно воспользоваться функциями библиотеки ZigBee RF4CE.

Ссылки

Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя