Журнал РАДИОЛОЦМАН, ноябрь 2014
Михаил Русских
Поясняется принцип работы с библиотекой 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. | ||||||||||||||||||||||||||||||||||||||||
|
Сопряжение
Сопряжение устройств должно выполняться до начала обмена информацией между узлами сети 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. | ||||||||||||||||||||||||
|
|||||||||||||||||||||||||
Таблица 4. | Список параметров структуры NLME_PAIR_CONFIRM_Type. | ||||||||||||||||||||||||
|
Обмен сообщениями
Передача сообщений инициируется функцией 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. | |||||||||||||||||||||
|
Индикация приема сообщения осуществляется с помощью функции обратного вызова NLDE_DATA_indication(NLDE_DATA_INDICATION_Type *param). Ее параметры указаны в Таблице 6.
Таблица 6. | Список параметров структуры NLDE_DATA_INDICATION_Type. | ||||||||||||||||||||||||
|
Безопасная передача данных
Режим безопасной передачи данных автоматически активируется при инициализации радиомодуля, если в параметре 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.