Altinkaya: турецкие корпуса для РЭА
РадиоЛоцман - Все об электронике

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

STMicroelectronics STM32W108

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

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

Часть 1

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Рассматриваются функции приема пакетов, криптографические функции, функции для работы с MAC-таймером и дополнительные функции библиотеки SimpleMAC. Дается краткое описание протокола ZigBee RF4CE, поясняется принцип автоматической перестройки частоты, механизм обнаружения узлов и сопряжения с ними, а также механизм приема и отправки сообщений.

Функции приема пакетов

Для того чтобы принимать пакеты, необходимо правильно настроить фильтры радиоприемника. В первую очередь с помощью функции ST_RadioEnableAddressFiltering(boolean enable) следует разрешить (принимаемый параметр TRUE) или запретить (принимаемый параметр FALSE) фильтрацию по идентификаторам сети и узла. Следует учитывать, что по умолчанию фильтрация активирована. Далее функцией ST_RadioEnableAutoAck(boolean enable) нужно разрешить (принимаемый параметр TRUE) или запретить (принимаемый параметр FALSE) автоматическую передачу подтверждений принятых пакетов. Также заранее можно указать необходимость игнорирования пакетов, которые не прошли проверку по контрольной сумме (CRC). Это делается с помощью функции ST_RadioEnableReceiveCrc(boolean enable). Если принимаемый параметр будет равен TRUE, то пакеты с несоответствующей контрольной суммой не будут учитываться. Следует помнить, что в данном случае у тех пакетов, которые прошли проверку, байты CRC будут автоматически отбрасываться.

Если установлена фильтрация пакетов, то с помощью функции ST_RadioSetPanId(int16u panId) следует установить идентификатор персональной сети узла, который указывается параметром panId. После этого функцией ST_RadioSetNodeId(int16u nodeId) задается идентификатор самого узла. Для проверки идентификатора сети и идентификатора узла можно воспользоваться функциями ST_RadioGetPanId() и ST_RadioGetNodeId(), которые вернут требуемые параметры в формате int16u.

Как только пакет был принят устройством, библиотекой вызывается функция ST_RadioReceiveIsrCallback (int8u *packet, boolean ackFramePendingSet, int32u time, int16u errors, int8s rssi). Параметр *packet является указателем на этот пакет, при этом он начинается с байта длины, а байты контрольной суммы в данном случае не учитываются. Параметр ackFramePendingSet принимает значение TRUE, если предполагается подтверждение получения пакета, в противном случае он устанавливается в FALSE. В time будет храниться значение MAC-таймера, определяющее момент конца синхронизации приема пакета. Параметр errors выражает количество ошибок в данном пакете. В rssi указывается мощность сигнала, зафиксированная за время приема последних 8 символов пакета и выраженная в дБм. Правильная процедура приема пакетов показана в Листинге 1. Фрагмент кода состоит из вызываемой по прерыванию функции ST_RadioReceiveIsrCallback и главной функции main, в которой выполняется основной цикл программы. Для приема и обработки пакета нужно задать две глобальные переменные – массив для хранения байтов пакета rxPacket и булеву переменную packetReceived, с помощью которой будет определяться необходимость копирования данных из массива packet, доступного только при обработке прерывания, в массив rxPacket, с которым можно будет работать в основном цикле программы.

Листинг 1

/*Буфер для хранения пакета */
unsigned char rxPacket[128];
/* флаг, сигнализирующий о наличии пакета, который нужно обработать */
boolean packetReceived = FALSE;
/*Прерывание по приему пакета*/
void ST_RadioReceiveIsrCallback(unsigned char *packet,
        boolean ackFramePendingSet,
        unsigned long time,
        unsigned int errors,
        char rssi)
{
unsigned char i;
  if (packetReceived == FALSE) {
  for (i=0; i<=packet[0]; i++) {
rxPacket[i] = packet[i];
}
  packetReceived = TRUE;
 }
}
void main(void)
{
 while(1) {
  if (packetReceived == TRUE) {
  for (i=0; i<=rxPacket[0]; i++) {
  /* Обрабатываем пакет */
  }
/* Пакет был обработан, поэтому следует сбросить флаг packetReceived*/
  packetReceived = FALSE;
  }
 }
}

Криптографические функции

Для организации защищенной передачи пакетов в соответствии со стандартом AES-128 библиотекой предоставляются три функции: ST_AesSetKey(int8u *key), ST_AesGetKey(int8u *key) и ST_AesEncrypt(int8u *block). С помощью первой устанавливается 128-битный ключ шифрования, а параметр *key является указателем на него. Функция ST_AesGetKey позволяет получить ключ, используемый при шифровании. В данном случае *key представляет собой указатель на область памяти, куда будет записан 128-битный ключ. Используя ST_AesEncrypt, можно зашифровать 128 бит данных, расположенных в области памяти, на которую ссылается указатель block. При этом будет задействован ключ, ранее установленный функцией ST_AesSetKey.

Функции для работы с MAC-таймером

Микроконтроллеры STM32W108 имеют 20-битный MAC-таймер, каждый бит которого соответствует временному интервалу 1 мкс. Таким образом, его обнуление происходит примерно раз в секунду. Таймер запускается автоматически после вызова функции ST_RadioInit(). Для того, чтобы получить значение MAC-таймера, нужно воспользоваться функцией ST_RadioGetMacTimer(), которая вернет целочисленную 32-разрядную величину.

Библиотека дает возможность сравнить значение MAC-таймера с некоторым заданным программистом числом. Для этого сначала с помощью функции ST_RadioSetMacTimerCompare(int32u value) указывается в параметре value заданное для сравнения значение. Затем параметру enable функции ST_RadioEnableMacTimerCompare(boolean enable) присваивается значение TRUE для того, чтобы разрешить прерывание, вызываемое при совпадении значения MAC-таймера и заданной величины. Обработчик данного прерывания носит название ST_RadioMacTimerCompareIsrCallback(). В процессе работы программы можно также проверить, разрешено ли сравнение на данный момент с помощью функции ST_RadioMacTimerCompareEnabled(), которая вернет TRUE (разрешено) или FALSE (запрещено).

Прочие функции для диагностики и конфигурации

Библиотека SimpleMAC также предоставляет ряд полезных функций для диагностики и конфигурирования радиомодуля. С помощью ST_RadioEnergyDetection() можно определить средний уровень мощности, затраченной на передачу восьми последних символов. Функция вернет целочисленное восьмиразрядное значение, пропорциональное дБм в пределах от –97 до –25 дБм. Для проверки занятости канала служит функция ST_RadioChannelIsClear(), которая вернет TRUE в случае, если канал свободен, или FALSE, если канал занят.

Полезной особенностью микроконтроллеров STM32W108 является наличие модуля, называемого packet trace interface (PTI), который позволяет выводить все принимаемые пакеты на порт ввода/вывода, что облегчает отладку. Для этого используются линии PTI_EN и PTI_DATA (GPIO[4:5]). Причем эти линии должны быть заранее сконфигурированы на работу с PTI. Для активации PTI следует вызвать функцию ST_RadioEnablePacketTrace(boolean enable) с параметром enable равным TRUE. По умолчанию данный модуль находится в активном режиме. Если в процессе работы программы возникла необходимость проверить статус PTI, то сделать это можно с помощью функции ST_RadioPacketTraceEnabled(), которая вернет TRUE или FALSE.

Для выполнения тестовых операций, например, измерения уровня мощности передачи, имеется функция ST_RadioStartTransmitTone(), которая позволяет начать трансляцию несущей частоты текущего канала связи. Эта трансляция может быть прекращена вызовом функции ST_RadioStopTransmitTone(). Важно помнить, что радиомодуль до входа в данный режим должен быть в состоянии ожидания, то есть он не должен передавать никаких данных. Также, пока устройство находится в этом режиме, нельзя вызывать другие функции библиотеки SimpleMAC.

Библиотека позволяет передавать в эфир случайные данные с помощью функции ST_RadioStartTransmitStream(). В этом случае никаких пакетов сформировано не будет, а будут передаваться случайные символы до момента вызова ST_RadioStopTransmitStream(). Между этими двумя функциями также не должны вызываться прочие функции библиотеки, а приемопередатчик должен находиться в режиме ожидания.

Помимо прочего, библиотека может обеспечить доступ к аппаратной части радиомодуля для генерации случайных чисел. Это осуществляется функцией ST_RadioGetRandomNumbers(int16u *rn, int8u count). Здесь в параметре count указывается количество случайных шестнадцатиразрядных чисел, которые будут размещены в памяти, начиная с адреса, определяемого указателем *rn.

ZigBee RF4CE

Протокол ZigBee RF4CE был разработан концерном RF4CE (радиочастоты для бытовой электроники) с целью обеспечить стандартизированной спецификацией домашние электроприборы с дистанционным управлением. Пульты ДУ на основе ZigBee RF4CE имеют бóльшую дальность действия, они надежнее и предоставляют больше свободы при управлении устройством, чем инфракрасные пульты, функционирование которых зависит от наличия или отсутствия препятствий на прямой дистанции до объекта управления. Кроме того, радиочастотные пульты обладают еще одним существенным преимуществом – связь с бытовым прибором может быть двухсторонняя. Это повышает функциональность и удобство эксплуатации.

Стандарт RF4CE определяет сетевой уровень, а также два профиля приложения для потребительской электроники – ZRC и ZID.

Сетевой уровень

Сетевой стек RF4CE является надстройкой над уровнями PHY и MAC стандарта IEEE 802.15.4. Этот стек позволяет организовать надежную всенаправленную двустороннюю связь с возможностью шифрования, обеспечить быструю перестройку частоты для лучшей совместимости с другими беспроводными технологиями данного частотного диапазона и достичь низкого энергопотребления.

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

Топология сети может представлять собой схему «точка-точка» или «звезда». При этом в одной персональной сети может быть один или несколько узлов-контроллеров и один целевой узел. Также возможны структуры, в которых несколько персональных сетей могут иметь общие узлы. Пример такой топологии показан на Рисунке 5.

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

Структура Рисунка 5 содержит три целевых узла: телевизор, DVD-проигрыватель и CD-проигрыватель. Каждый из них образует свою собственную персональную сеть и имеет соответствующий узел-контроллер. Кроме того, в сети присутствует многофункциональный пульт ДУ, способный управлять всеми тремя целевыми узлами. Следует заметить, что DVD-проигрыватель также соединен с телевизором, благодаря чему при включенном DVD-проигрывателе в телевизоре может быть выбран дополнительный канал.

В итоге, данная комплексная сеть состоит из трех персональных сетей: одна обслуживает телевизор и состоит из самого телевизора, пульта для него, многофункционального пульта и DVD-проигрывателя, вторая обслуживает CD-проигрыватель и включает в себя сам CD-проигрыватель, пульт для него и многофункциональный пульт ДУ, и, наконец, третья обслуживает DVD-проигрыватель, и помимо него содержит пульт для него, многофункциональный пульт и телевизор.

Профили приложений ZRC и ZID

ZRC (ZigBee Remote Control) – это первый профиль приложений протокола ZigBee. Он был разработан с целью замены инфракрасных пультов дистанционного управления на радиопульты. Этот профиль определяет очень простой процесс сопряжения пульта и целевого устройства. Обнаружение, сопряжение и, при необходимости, обеспечение сетевой безопасности осуществляются сразу же по нажатию одной кнопки.

ZID (ZigBee Input Device) – это второй профиль приложений протокола ZigBee. В нем определены команды и процедуры, необходимые для работы таких беспроводных устройств как мыши, клавиатуры и тачпады. Иными словами, он предоставляет команды и механизмы, которые требуются устройствам взаимодействия с человеком (HID) для коммуникации с хост-узлом. Профиль ZID определяет два типа устройств: устройства класса HID и HID-адаптеры. К первому типу относятся клавиатуры, мыши и прочие подобные устройства, а HID-адаптеры могут быть использованы для коммуникации посредством драйвера класса HID с компьютерами или другими встраиваемыми хост-системами.

Автоматическая перестройка частоты

Как целевые узлы, так и узлы-контроллеры поддерживают работу на следующих каналах стандарта IEEE 802.15.4:

  • Канал 15: 2.425 ГГц
  • Канал 20: 2.450 ГГц
  • Канал 25: 2.475 ГГц

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

Обнаружение и сопряжение

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

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

Отправка и прием сообщений

Обмен сообщениями может происходить только между сопряженными устройствами. Он характеризуется тремя опциями. Во-первых, обмен может быть с подтверждением узлом-получателем приема данных от узла-инициатора, так и без подтверждения. Во-вторых, коммуникация может быть одноадресная, когда инициатор отправляет данные конкретному узлу, или широковещательная, когда данные отправляются всем сопряженным устройствам. И, в-третьих, передача может вестись по одному каналу, либо по нескольким каналам, тогда используется механизм автоматической перестройки частоты.

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

В следующей части будет рассмотрена библиотека STRF4CE, предназначенная для работы с протоколом ZigBee RF4CE на устройствах STM32W108.

Окончание

24 предложений от 18 поставщиков
32-бит ARM Cortex M3, 24МГц, 128кб Flash, Ember Zig Bee Stack, низкое потребление, ускоритель кодирования, генератор случайных чисел, PTI, проводные интерфейсы,...
EIS Components
Весь мир
STM32W108B-SK
STMicroelectronics
75 ₽
STM32W108CBU61
STMicroelectronics
136 ₽
AiPCBA
Весь мир
STM32W108HBU63
STMicroelectronics
192 ₽
ChipWorker
Весь мир
STM32W108HBU63
STMicroelectronics
196 ₽
Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя