№4 / 2015 / статья 6

Готовые библиотеки SPIRIT1 Library для быстрой разработки радиоканала энергосчетчика

Александр Калачев (г. Барнаул)

SPIRIT1

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

Современные автоматизированные системы используют различные методы удаленного съема показаний, включая проверенные проводные системы с протоколами типа ModBus и набирающие популярность сети реального времени CAN. Многообразие предлагаемых производителями средств учета электрической энергии, интерфейсов связи и технологий передачи данных требует выработки единой технической политики по отбору и применению средств учета электроэнергии.

Программа ОАО «Россети» на 2015-2016 года предусматривает внедрение интеллектуальных счетчиков, где радиоканалу отводится ряд определенных задач. Так, согласно технической политике ОАО «Россети», функционал интеллектуального прибора учета электрической энергии должен включать в себя:

  • измерение величин активной и реактивной электрической энергии, мощности, основных показателей качества электрической энергии, фазного напряжения, фазного тока, коэффициента мощности, тока в нулевом проводе;
  • поддержку не менее четырех тарифов, дифференцированных по зонам суток;
  • формирование профиля нагрузки с программируемым временем интегрирования 1…60 минут;
  • обеспечение возможности ограничения/отключения нагрузки при получении команды с уровня информационно-вычислительного комплекса сбора и обработки данных системы с использованием как встроенных, так и внешних коммутационных аппаратов;
  • наличие встроенных часов реального времени с возможностью внешней синхронизации;
  • ведение и хранение результатов измерений и данных журналов событий в базе данных интеллектуального прибора учета, в том числе – хранение профиля нагрузки;
  • предоставление доступа к результатам измерения и журналам событий с уровня информационно-вычислительного комплекса сбора и обработки данных системы;
  • взаимодействие с информационно-вычислительным комплексом сбора и обработки данных системы для приема и передачи данных по открытым протоколам;
  • обеспечение безопасности хранения информации и защиту программного обеспечения интеллектуального прибора учета.

Для локального обмена данными и настройки прибор учета энергии должен иметь беспроводной интерфейс (оптический или радиочастотный), а также, как минимум, еще один интерфейс для передачи всех учетных и сервисных данных: GPRS, CAN, PLC, RF, RS-232 или Ethernet.

Применение радиоканала приобретает все большую популярность благодаря защищенности от случайных обрывов, работе с большим числом точек, слабой зависимости от расположения приборов учета, а также в силу дороговизны прокладки проводов. С точки зрения организации беспроводного канала для систем учета, в нелицензируемых диапазонах частот предпочтительными выглядят субгигагерцевые. Для нашей страны это полосы частот 433,075…434,750 и 868,7…869,2 МГц. Основными преимуществами перед диапазоном 2,4 ГГц являются меньшая «заселенность», большая дальность связи, слабое влияние препятствий, стен, перегородок на прохождение сигнала.

Приемопередатчик SPIRIT1

SPIRIT1 представляет собой высокоинтегрированный приемопередатчик субгигагерцевого диапазона (рисунок 1) [1, 2]. Приемопередатчик работает в частотных диапазонах 150…174, 300…348, 387…470 и 779…956 МГц, поддерживает типы модуляций сигнала 2-FSK, GFSK, MSK, GMSK, OOK и ASK, имеет буферы по 96 байт на прием и передачу. Максимальная скорость передачи данных – до 500 кбит/с, для ASK/OOK-модуляций – до 250 кбит/с. Диапазон выходных мощностей: -30 dBm…+14 Bm, при питании встроенного усилителя мощности непосредственно от батареи выходная мощность достигает 16 дБм. При этом SPIRIT1 обладает высокой чувствительностью до -120 dBm (бюджет канала, таким образом, составляет порядка 130 dBm). Вывод управления внешним переключателем антенн позволяет осуществлять автоматический выбор антенны с наилучшими показателями приема для каждого пакета еще на этапе приема преамбулы без вмешательства управляющего контроллера.

Рис. 1. Типовое включение SPIRIT1

Рис. 1. Типовое включение SPIRIT1

Трансивер SPIRIT1 имеет встроенное устройство формирования и обработки пакетов (Packet Handler) – поддерживаются форматы Basic, STack, Wireless M-Bus. В режиме STack поддерживается автоматическое формирование и отправка ACK-пакетов подтверждений, их повторная передача и отслеживание таймаутов. Безопасность данных обеспечивается встроенным блоком AES-шифрования с ключами длиной 128 бит.

В схему включения SPIRIT1 входит лишь несколько развязывающих конденсаторов по питанию, фильтры на приемную и передающую части, а в случае использования встроенного импульсного преобразователя питания дополнительно потребуется внешняя индуктивность и пара фильтрующих конденсаторов (рисунок 3).

Рис. 3. Структура библиотеки SPIRIT1 SW Library

Рис. 3. Структура библиотеки SPIRIT1 SW Library

Взаимодействие с хост-контроллером обеспечивается SPI-интерфейсом и набором линий ввода-вывода, с помощью которых можно реализовать следующий функционал:

  • формирование сигналов прерываний;
  • отображение состояния;
  • подачу команд управления;
  • ввод/вывод данных в режиме прямого приема или передачи;
  • выход датчика температуры;
  • входы/выходы опорных тактовых сигналов.
  • включение/выключение трансивера.

Для диапазонов частот 433 и 868 МГц компания STMicroelectronics предлагает согласующие трансформаторы и фильтры в одном корпусе (Balun): BALF-SPI-02D3 и BALF-SPI-01D3 [3, 4]. Они предназначены для фильтрации гармоник и согласования комплексного импеданса выходного каскада трансивера SPIRIT1 c антенной с волновым сопротивлением 50 Ом. Выполненные в виде миниатюрных SMD-компонентов с четырьмя точками подключения, они заменяют сложную цепочку из 15 дискретных LC-элементов. SMD-фильтры, с одной стороны, решают проблемы со сложностями трассировки СВЧ-части, с другой стороны – позволяют существенно сэкономить место на плате (размер микросхемы всего 2,0х1,4 мм).

SPIRIT1 ориентирован на применение в устройствах с батарейным питанием. Подсистема питания SPIRIT1 включает в себя высокоэффективный встроенный импульсный преобразователь питания и линейный стабилизатор. Диапазон рабочих напряжений – 1,8…3,6 В, ток потребления в режиме приема – порядка 9 мА (при работе в диапазоне 433 МГц и скорости передачи данных 38,4 кбит/с).

Энергопотребление в режимах, в которых не задействована радиочастотная часть прибора – менее 1 мкА, в режимах приема или передачи – 9…23 мА (рисунок 2).

Рис. 2. Диаграмма состояний SPIRIT1 и типовые токи потребления в различных режимах работы

Рис. 2. Диаграмма состояний SPIRIT1 и типовые токи потребления в различных режимах работы

Среда разработки для Spirit1

Платформенно-независимая библиотека SPIRIT1 SW Library упрощает работу программиста с приемопередатчиком – библиотека разбита на модули, отвечающие за взаимодействие с определенным функциональным блоком устройства, каждая API-команда соответствует набору низкоуровневых операций по настройке SPIRIT1 [5] (рисунок 3).

Для разработки приложений, использующих беспроводной интерфейс на базе SPIRIT1, компания STMicroelectronics предлагает пакеты разработок SPIRIT1 SDK Suite и SPIRIT1 WM-BUS Suite.

Рис. 4. Структура программного пакета SPIRIT1 SDK Suite

Рис. 4. Структура программного пакета SPIRIT1 SDK Suite

SPIRIT1 SDK Suite включает в себя документацию, низкоуровневые драйверы для отладочных плат, библиотеки низкоуровневого управления SPIRIT1, примеры приложений, предварительно скомпилированные образы демонстрационных программ. Структура SPIRIT1 SDK Suite представлена на рисунке 4.

Рис. 5. Структура директорий установленной SPIRIT1 SDK

Рис. 5. Структура директорий установленной SPIRIT1 SDK

В поставку SPIRIT1 Development kit входят документация, программные компоненты и библиотеки (рисунок 5):

  • библиотека функций для работы со SPIRIT1;
  • описание библиотек в виде chm-файлов;
  • SPIRIT1 Wireless M-BUS Library;
  • примеры приложений;
  • примеры Wireless M-BUS приложений для SPIRIT1;
  • библиотека SdkEval для контроллеров семейства STM32L;
  • графическая оболочка SPIRIT1 DK GUI для настройки параметров радиочасти SPIRIT1;
  • графическая оболочка SPIRIT1 Wireless-MBUS GUI для демонстрационного приложения концентратор Wireless-MBUS;
  • руководство пользователя SPIRIT1 Development Kit User Manual;
  • документация на отладочные и демонстрационные платы SPIRIT1 Development Kit, включая гербер-файлы печатных плат;
  • документация на драйверы SPIRIT1;
  • документация на библиотеку SPIRIT1 Wireless M-BUS library;
  • описание SPIRIT1;
  • электрические принципиальные схемы, топологии печатных плат радиомодулей, содержащих SPIRIT1, и основных плат с микроконтроллерами.

Двоичные образы (прошивки) предназначены для семейства контроллеров STM32L, некоторые примеры и библиотеки скомпилированы для STM8L. Поддерживаются следующие оценочные платы: STEVAL-IKR002Vx, STEVAL-IDS001Vx, STEVAL-IKR001V7D, STEVAL-IKR002V7D, STEVAL-IKR001V8D, STEVAL-IKR001Vx.

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

  • SpiritTypes – определения типов и структур данных библиотеки и глобальных переменных, например, структура SpiritStatus, отображающая текущее состояние модуля SPIRIT1;
  • SpiritAes – набор функций для работы с криптографическим модулем SPIRIT1, например, SpiritAesMode(SpiritFunctionalState xNewState), задающая режим работы AES-модуля, или SpiritAesExecuteEncryption(void) – функция, запускающая шифрование блока данных;
  • SpiritCalibration осуществляет управление подстройкой и калибровкой встроенного генератора SPIRIT1, доступ к результатам автоматической калибровки;
  • SpiritCommands – функции и макросы для управления логикой устройства, например, SpiritCmdStrobeTx(), SpiritCmdStrobeRx() – запуск процедур передачи и приема пакетов, SpiritCmdStrobeStandby() – перевод SPIRIT1 в режим ожидания;
  • SpiritCsma позволяет управлять встроенным механизмом CSMA — настройки временных интервалов и ограничения количества ретрансляций пакетов;
  • SpiritDirectRf – прямое управление приемом-передачей битового потока вне зависимости от типа управления потоком;
  • SpiritGeneral – общее управление SPIRIT1, включая чтение идентификатора и номера версии;
  • SpiritGpio – конфигурирование линий ввода-вывода SPIRIT1;
  • SpiritIrq – конфигурирование прерываний устройства, например, SpiritIrqInit(SpiritIrqs* pxIrqInit), SpiritIrqDeInit(SpiritIrqs* pxIrqInit) – разрешение/запрет выбранных источников прерывания, генерируемых SPIRIT1;
  • SpiritLinearFifo – управление FIFO-буферами на прием и передачу, например, SpiritLinearFifoSetAlmostFullThresholdRx(uint8_t cThrRxFifo) – задание порога срабатывания сигнала по переполнению буфера чтения;
  • SpiritManagement – управление вспомогательными функциями SPIRIT1;
  • SpiritPktCommon – функции формирования, приема и передачи пакетов;
  • SpiritPktBasic – работа с пакетами типа Basic;
  • SpiritPktStack – работа с пакетами типа STack;
  • SpiritPktMbus – работа с WMBUS-пакетами;
  • SpiritQi – получение данных об уровне сигнала и управление индикаторами качества связи;
  • SpiritRadio – набор функций для управления аналоговой и цифровой частью приемопередатчика;
  • SpiritTimer – конфигурирование встроенных таймеров SPIRIT1, например, SpiritTimerSetRxTimeoutMs(float fDesiredMsec) – установка времени ожидания прихода пакета, SpiritTimerSetWakeUpTimerMs(float fDesiredMsec) – задание времени, через которое SPIRIT1 выйдет из режима пониженного энергопотреления.

Примеры приложений

Путь «…\STMicroelectronics\SPIRIT1 DK_1.0.7\Firmware\SPIRIT1_Library_Project\Application\examples\» содержит несколько примеров приложений:

  • BasicGeneric. Данный пример показывает, как настроить один из узлов в качестве приемника, а второй – в качестве передатчика пакета данных. Проверяется также корректность его доставки.
  • BasicPktMonitoring. В данный пример входят файлы с кодами приемника, передатчика и модуль, состоящий из функций, вызываемых обеими программами. Пользователь может выбрать один из четырех режимов работы узлов, а также количество байт полезной нагрузки пакета непосредственно в ходе выполнения программы.
  • BasicPktTest. Приложение, построенное по принципу «ведущий-ведомый». Ведущий узел получает от пользователя команды на начало/завершение теста. При старте ведомому передается стартовый пакет, после чего начинается их непрерывная передача. Количество переданных и полученных пакетов подсчитывается, отображается текущее значение RSSI, и после получения стоп-пакета подсчитывается значение PER.
  • CsmaGeneric. Данное приложение показывает, каким образом сконфигурировать CSMA-протокол для корректного предовращения коллизий. В пример входят три программы, две из которых — SDK_Csma_A и SDK_Csma_B, – работают согласно логике CSMA – передают пакеты и ожидают некоторое время перед началом следующей передачи. SDK_Csma_TxCW передает поток битов без всякого контроля за состоянием канала.
  • EncryptionGeneric. Важной составляющей любого реального беспроводного приложения является обеспечение безопасности передаваемых данных. Пример EncryptionGeneric демонстрирует использование AES-модуля – поочередную передачу блока данных в 16 байт между двумя узлами с шифрованием/дешифрованием и модификацией. AES-ключ заранее известен обоим узлам.
  • FifoHandler. Один из узлов сконфигурирован как приемник, второй – как передатчик. При каждой транзакции длина пакета увеличивается. Таким образом, со временем длина пакета станет больше 96 байт (максимальный размер FIFO), и для корректной работы приемному и передающему узлам необходимо активно работать с чтением и передачей данных на SPIRIT1 во избежание их потери, а также с настройкой порогов срабатывания AE FIFO IRQ.
  • LdcrGeneric. Демонстрируются возможности встроенного модуля LDCR – приемопередатчик в данном случае автоматически управляет стробом на передачу по мере заполнения FIFO-передатчика.
  • PingPong. Практически классический пример для беспроводных узлов – поочередная передача пакета данных между ними. Каждый из узлов поочередно выполняет роли приемника и передатчика.
  • RadioGeneric. Пример, показывающий, как сконфигурировать узел в режиме приемника или передатчика. В состав примера входят набор функций, специфичный для приемника, для передатчика, и модуль с общими для них функциями.
  • StackGeneric. Демонстрация работы приемника и передатчика с пакетами типа STack.
  • StackLlp. Модернизация предыдущего примера с функциями автоматического подтверждения и повторной передачи.
  • WirelessTerminal. Беспроводной терминал представляет собой два приложения – приемник и передатчик. Передатчик получает байты от виртуального COM-порта и формирует из них пакеты формата Spirit Basic. Формирование пакета завершается при встрече символа ‘\r’ или по приему 90 байт. В ходе работы приложения при подключенных отладочных комплектах и запущенной SDK пользователь может наблюдать на приемной стороне приходящие строки.
  • WMbusGeneric. Простой пример с приемником и передатчиком, работающими с пакетами MBus.
  • WMbusStd. Пример работы с протоколом WMBus, при котором задействованы физический и канальный уровни, определенные в стандарте. Согласно стандарту, конфигурация радиочасти полностью управляется пользователем.

BasicGeneric – «разбор полетов»

Рассмотрим простой пример BasicGeneric, являющийся во многом показательным – в нем задействованы базовые функции настройки радиоканала, а также приема и передачи данных. Код достаточно прост и читабелен (рассматриваем исходный код передатчика), причем следует обратить внимание, что пример BasicGeneric может работать как на контроллерах STM8L, так и на STM32L.

Вначале идет секция подключений библиотек SPIRIT1, функций для работы с SDK (в частности, для работы с виртуальным последовательным портом).

/* Includes —————————————————*/

#include «SDK_EVAL_Config.h»

#include «SPIRIT_Config.h»//включает набор заголовочных файлов для различных регистров трансивера. Каждый файл содержит описание всех битовых полей в регистрах в виде макроопределений (используются в качестве параметров функций при управлении SPIRIT1). Рекомендуется просмотреть содержимое этих файлов, так как в них содержится множество полезных комментариев.

#include «SDK_Configuration_Common.h»//. Здесь задаются абсолютные значения параметров передатчика. В данном проекте – частота несущей – 868.000 МГц, скорость – 38400 бит/c, девиация – 20 кГц и так далее. При инициализации структуры типа SRadioInit можно задать свои значения параметров передатчика, отличные от базового примера.

#include «SPIRIT_SDK_Application.h»

#ifdef STM8L

#include «STM8L_Common.h»

#define XTAL_FREQUENCY 50000000//рабочая частота кварцевого резонатора. Она должна соответствовать номиналу реально запаянного кварца на плате разрабатываемого устройства.

#define SPIRIT_VERSION SPIRIT_VERSION_3_0

#define RANGE_TYPE RANGE_EXT_NONE //RANGE_EXT_SKYWORKS

#elif SDK

#define USE_VCOM

#include «SDK_Common.h»

#include «SPIRIT_SDK_EEPROM.h»

#endif

#ifdef USE_VCOM

#include «SDK_EVAL_VC_General.h»

#endif

Далее находится блок инициализации структур данных для работы SPIRIT1 – задание параметров радиоканала, определение типа пакетов и схемы адресации, используемой в данном случае. Шаблоны структур данных задаются в SPIRIT Library. В файле-справке SPIRIT1-Library.chm можно посмотреть описание и определение любой из функций и структур SPIRIT1 Library, а также – их параметров.

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

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

/**

* @brief Radio structure fitting

*/

SRadioInit xRadioInit = {

XTAL_OFFSET_PPM,//компенсация погрешности кварцевого резонатора (в долях ppm) – весьма полезная опция, особенно если по каким-либо причинам на узлах используются резонаторы различных производителей.

BASE_FREQUENCY,//абсолютное значение рабочей частоты( фактически – частоты нулевого канала), МГц. Может быть значением из диапазонов 300…348, 387…470 или 779…915 МГц.

CHANNEL_SPACE,//расстояние по частоте между каналами, Гц – рассчитывается как N * FREQUENCY_STEPS, где FREQUENCY STEPS = F_Xo/215. Значение может находиться в диапазоне: [0, F_Xo/2^15*255] Гц.

CHANNEL_NUMBER,//номер канала. Умножается на канальное расстояние и прибавляется к базовой частоте, используется для задания частоты синтезатора.

MODULATION_SELECT,//тип модуляции сигнала (см. SPIRIT1-Library.chm для доступных значений параметра).

DATARATE,//битовая скорость передачи по радиоканалу, бит/с. Значение можно задавать в диапазоне 100…500000.

FREQ_DEVIATION,//девиация частоты, Гц. Вычисляется как F_Xo*8/218, F_Xo*7680/218.

BANDWIDTH//полоса пропускания канального фильтра, Гц. Значение: 100…800100.

};

При настройке типа пакетов (в данном примере это Basic) в структуре xBasicInit указывается длина преамбулы, длина слова синхронизации, слово синхронизации, тип поля длины пакета, ширина поля длины пакета, режим проверки контрольной суммы, длина поля контрольной суммы, поле разрешения посылки адреса получателя, разрешение/запрет FEC, разрешение/запрет предварительной обработки данных (так называемое «отбеливание») соответственно.

/**

* @brief Packet Basic structure fitting

*/

PktBasicInit xBasicInit={

PREAMBLE_LENGTH,

SYNC_LENGTH,

SYNC_WORD,

LENGTH_TYPE,

LENGTH_WIDTH,

CRC_MODE,

CONTROL_LENGTH,

EN_ADDRESS,

EN_FEC,

EN_WHITENING

};

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

/**

* @brief Address structure fitting

*/

PktBasicAddressesInit xAddressInit={

EN_FILT_MY_ADDRESS,

MY_ADDRESS,

EN_FILT_MULTICAST_ADDRESS,

MULTICAST_ADDRESS,

EN_FILT_BROADCAST_ADDRESS,

BROADCAST_ADDRESS

};

В структуре xGpioIRQ определяем использование линий ввода-вывода SPIRIT1: третий вывод GPIO, режим активного выхода, установку уровня по приходу данных.

/**

* @brief GPIO structure fitting

*/

SGpioInit xGpioIRQ={

SPIRIT_GPIO_3,

SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_LP,

SPIRIT_GPIO_DIG_OUT_IRQ

};

Определяем уровень для флага завершения передачи.

/**

* @brief Declare the Tx done flag

*/

FlagStatus xTxDoneFlag = RESET;

Инициализируем структуру для отображения статуса прерываний.

/**

* @brief IRQ status struct declaration

*/

SpiritIrqs xIrqStatus;

Буфер с данными для передачи – пока просто последовательность байт с числами 1…20.

/**

* @brief Tx buffer declaration: data to transmit

*/

uint8_t vectcTxBuff[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};

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

/**

* @brief This function handles External interrupt request (associated with Spirit GPIO 3).

* @param None

* @retval None

*/

#ifdef STM8L

INTERRUPT_HANDLER(M2S_GPIO_3_EXTI_IRQ_HANDLER,12)

#elif SDK

void M2S_GPIO_3_EXTI_IRQ_HANDLER(void)

#endif

{

/* Check the flag status of EXTI line */

if(EXTI_GetITStatus(M2S_GPIO_3_EXTI_LINE))

{

/* Check the SPIRIT TX_DATA_SENT IRQ flag */

if(SpiritIrqCheckFlag(TX_DATA_SENT))

{

/* set the tx_done_flag to manage the event in the main() */

xTxDoneFlag = SET;

/* toggle LED1 */

SdkEvalLedToggle(LED1);

}

/* Clear the EXTI line flag */

EXTI_ClearITPendingBit(M2S_GPIO_3_EXTI_LINE);

}

}

Основной алгоритм работы приложения задается в функции main.

void main (void)

{

Вначале последовательно инициализируется поддержка работы с SDK.

SDK_SYSTEM_CONFIG();

#ifdef USE_VCOM

SdkEvalVCInit();

while(bDeviceState != CONFIGURED);

#endif

Начинается инициализация модуля SPIRIT1 – включение и определение версии дочерней платы с модулем.

/* Spirit ON */

SpiritEnterShutdown();

SpiritExitShutdown();

#ifdef STM8L

SpiritRadioSetXtalFrequency(XTAL_FREQUENCY);

SpiritGeneralSetSpiritVersion(SPIRIT_VERSION);

#elif SDK

SpiritManagementIdentificationRFBoard();

/* Initialize the signals to drive the range extender application board */

SpiritManagementRangeExtInit();

#endif

Настройка линий GPIO. Настраиваем линии контроллера материнской платы как входную и как источник внешнего прерывания – в данном примере на эту линию будет поступать сигнал SPIRIT1, оповещающий об окончании отправки пакета.

SdkEvalM2SGpioInit(M2S_GPIO_3,M2S_MODE_EXTI_IN);

Настраиваем выводы SPIRIT1 на выставление уровня при окончании передачи пакета.

/* Spirit IRQ config */

SpiritGpioInit(&xGpioIRQ);

Настройка разрешений прерывания для контроллера.

#ifdef STM8L

enableInterrupts();

#elif SDK

SdkEvalM2SGpioInterruptCmd(M2S_GPIO_3,0x0F,0x0F,ENABLE);

#endif

Настройка радио – инициализация параметров приемопередатчика, установка выходной мощности, установка режима обработки пакетов, настройки прерываний SPIRIT1.

/* Spirit Radio config */

SpiritRadioInit(&xRadioInit);

SdkEvalLedOn(LED1);

/* Spirit Radio set power */

SpiritRadioSetPALeveldBm(0,POWER_DBM);//задаем выходную мощность усилителя, равную 0 дБм (или 1 мВт).

SpiritRadioSetPALevelMaxIndex(0);

/* Spirit Packet config */

SpiritPktBasicInit(&xBasicInit);//задаем режим работы блока обработки пакетов – используем пакеты типа Basic.

SpiritPktBasicAddressesInit(&xAddressInit);

/* Spirit IRQs enable */

SpiritIrqDeInit(NULL);

SpiritIrq(TX_DATA_SENT , S_ENABLE);

Помимо задания параметров обработки пакетов через структуры, почти каждый из параметров можно установить отдельно, например, величину полезной нагрузки пакетов, адрес получателя.

/* payload length config */

SpiritPktBasicSetPayloadLength(20);

/* destination address */

SpiritPktBasicSetDestinationAddress(0x35);

/* IRQ registers blanking */

SpiritIrqClearStatus();

После всех настроек переходим к выполнению основного цикла работы, оформленного, как бесконечный цикл while.

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

/* infinite loop */

while (1){

#ifdef USE_VCOM

printf(«A data to transmit: [«);

for(uint8_t i=0 ; i<20 ; i++)

printf(«%d «, vectcTxBuff[i]);

printf(«]\n\r»);

#endif

/* fit the TX FIFO */

SpiritCmdStrobeFlushTxFifo();

SpiritSpiWriteLinearFifo(20, vectcTxBuff);

/* send the TX command */

SpiritCmdStrobeTx();

/* wait for TX done */

while(!xTxDoneFlag);

xTxDoneFlag = RESET;

/* pause between two transmissions */

SdkDelayMs(500);

}

}

#ifdef USE_FULL_ASSERT//уведомление об ошибках в параметрах.

/**

* @brief Reports the name of the source file and the source line number

* where the assert_param error has occurred.

* @param file: pointer to the source file name

* @param line: assert_param error line source number

* @retval : None

*/

void assert_failed(uint8_t* file, uint32_t line)

{

/* User can add his own implementation to report the file name and line number */

printf(«Wrong parameters value: file %s on line %d\r\n», file, line);

/* Infinite loop */

while (1)

{

}

}

#endif

Код программы приемника также достаточно прост – аналогично определяются структуры данных для радио и для обработчика пакетов. Перед инициализацией радио задается собственный адрес.

/* Addresses configuration parameters */

#undef MY_ADDRESS

#define MY_ADDRESS 0x35

#undef DESTINATION_ADDRESS

#define DESTINATION_ADDRESS 0x34

Для принятых данных выделяется массив размером 96 байт – полный размер премного FIFO-буфера.

/**

* @brief Rx buffer declaration: how to store the received data

*/

uint8_t vectcRxBuff[96], cRxData;

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

#ifdef STM8L

INTERRUPT_HANDLER(M2S_GPIO_3_EXTI_IRQ_HANDLER,12)

#elif SDK

void M2S_GPIO_3_EXTI_IRQ_HANDLER(void)

#endif

{

/* Check the flag status of EXTI line */

if(EXTI_GetITStatus(M2S_GPIO_3_EXTI_LINE)){

/* Get the IRQ status */

SpiritIrqGetStatus(&xIrqStatus);

/* Check the SPIRIT RX_DATA_DISC IRQ flag */

if(xIrqStatus.IRQ_RX_DATA_DISC)

{

/* toggle LED1 */

SdkEvalLedToggle(LED1);

/* RX command – to ensure the device will be ready for the next reception */

SpiritCmdStrobeRx();//очищаем приемный FIFO-буфер.

}

/* Check the SPIRIT RX_DATA_READY IRQ flag */

if(xIrqStatus.IRQ_RX_DATA_READY)

{

/* Get the RX FIFO size */

cRxData=SpiritLinearFifoReadNumElementsRxFifo();//получаем количество данных в FIFO.

/* Read the RX FIFO */

SpiritSpiReadLinearFifo(cRxData, vectcRxBuff);//считываем данные FIFO-буфера.

/* Flush the RX FIFO */

SpiritCmdStrobeFlushRxFifo();//очищаем FIFO.

/* A simple way to check if the received data sequence is correct (in this case LED5 will toggle) */

{

SpiritBool xCorrect=S_TRUE;

for(uint8_t i=0 ; i<cRxData ; i++)

if(vectcRxBuff[i] != i+1)

xCorrect=S_FALSE;

if(xCorrect) {

/* toggle LED5 */

SdkEvalLedToggle(LED2);

#ifdef USE_VCOM

printf(«DATA CORRECT\r\n»);

#endif

}

}

/* RX command – to ensure the device will be ready for the next reception */

SpiritCmdStrobeRx();//запускаем прием данных модулем.

#ifdef USE_VCOM

/* print the received data */

printf(«B data received: [«);

for(uint8_t i=0 ; i<cRxData ; i++)

printf(«%d «, vectcRxBuff[i]);

printf(«]\r\n»);

#endif

}

/* Clear the EXTI line flag */

EXTI_ClearITPendingBit(M2S_GPIO_3_EXTI_LINE);

}

}

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

void main (void)

{

//инициализируем отладочный набор.

SDK_SYSTEM_CONFIG();

#ifdef USE_VCOM

/* VC config */

SdkEvalVCInit();

while(bDeviceState != CONFIGURED);

#endif

//включаем SPIRIT1.

/* Spirit ON */

SpiritEnterShutdown();

SpiritExitShutdown();

//устанавливаем.

#ifdef STM8L

SpiritRadioSetXtalFrequency(XTAL_FREQUENCY);

SpiritGeneralSetSpiritVersion(SPIRIT_VERSION);

#elif SDK

SpiritManagementIdentificationRFBoard();

/* Initialize the signals to drive the range extender application board */

SpiritManagementRangeExtInit();

#endif

//настройка линий ввода-вывода контроллера и SPIRIT1.

SdkEvalM2SGpioInit(M2S_GPIO_3,M2S_MODE_EXTI_IN);

/* Spirit IRQ config */

SpiritGpioInit(&xGpioIRQ);

//разрешаем прерывания на управляющем контроллере.

#ifdef STM8L

enableInterrupts();

#elif SDK

SdkEvalM2SGpioInterruptCmd(M2S_GPIO_3,0x0F,0x0F,ENABLE);

#endif

//инициализируем радио.

/* Spirit Radio config */

SpiritRadioInit(&xRadioInit);

SdkEvalLedOn(LED1);

//задаем режим работы с пакетами данных.

/* Spirit Packet config */

SpiritPktBasicInit(&xBasicInit);

SpiritPktBasicAddressesInit(&xAddressInit);

//настраиваем прерывания на SPIRIT1.

/* Spirit IRQs enable */

SpiritIrqDeInit(&xIrqStatus);

SpiritIrq(RX_DATA_DISC,S_ENABLE);

SpiritIrq(RX_DATA_READY,S_ENABLE);

//настраиваем длину пакетов.

/* payload length config */

SpiritPktBasicSetPayloadLength(20);

//задаем порог и разрешаем контроль качества сигнала (SQI) во время приема пакета.

/* enable SQI check */

SpiritQiSetSqiThreshold(SQI_TH_0);

SpiritQiSqiCheck(S_ENABLE);

//задаем время ожидания пакета.

/* RX timeout config */

SpiritTimerSetRxTimeoutMs(1000.0);

SpiritTimerSetRxTimeoutStopCondition(SQI_ABOVE_THRESHOLD);

//очищаем регистры прерываний SPIRIT1.

/* IRQ registers blanking */

SpiritIrqClearStatus();

//запускаем прием данных.

/* RX command */

SpiritCmdStrobeRx();

//переходим в пустой бесконечный цикл.

/* infinite loop */

while (1){

}

}

Отладочные наборы STEVAL-IKR002Vх

Для старта разработки можно использовать отладочный набор из серии STEVAL-IKR002Vх. Он является универсальным отладочным набором с 32-битным микроконтроллером STM32L на борту.

Рис. 6. Отладочный набор STEVAL-IKR002Vх

Рис. 6. Отладочный набор STEVAL-IKR002Vх

В отладочные наборы STEVAL-IKR002Vх входят две материнские и две дочерние платы с трансивером SPIRIT1, которые определяют конкретный частотный диапазон набора (169, 433, 868, 915 МГц). В частности, для диапазонов 868 МГц предназначен набор STEVAL-IKR002V4.

Каждая материнская плата имеет USB-коннектор для подключения к персональному компьютеру, взаимодействия с пользовательским GUI и обновления прошивки. Интерфейс JTAG позволяет прошивать и отлаживать программное обеспечение контроллера на материнской плате.

Подключение дочерней платы с приемопередатчиком SPIRIT1 к материнской плате осуществляется двумя разъемами – J6 и J7, которые соединяются с разъемами J4 и J5 на плате с управляющим контроллером. Таким образом, управление приемопередатчиком осуществляется посредством последовательного интерфейса SPI и дополнительных линий GPIO0-GPIO3, подключенных к выводам контроллера PC7 – PC10 (см. документы Spirit1_RF_v4.pdf и SCH_RF_MOTHERBOARD_v3.pdf из директории «…\STMicroelectronics\SPIRIT1 DK_1.0.7\Documents\SPIRIT1\DevKit\STEVAL-IKR002Vx\» установленной SPIRIT1 SDK). Питание и принудительный сброс SPIRIT1 осуществляется посредством линий, подключенных к разъему J5 материнской платы (рисунки 7а и 7б).

Рис. 7a. Схематехника материнской платы с контроллером STM32L

Рис. 7a. Схематехника материнской платы с контроллером STM32L

 

Рис. 7б. Схематехника мезанинного модуля SPIRIT1

Рис. 7б. Схематехника мезанинного модуля SPIRIT1

Заключение

Несмотря на тенденцию перехода на однокристальные системы, применение связки «микроконтроллер + трансивер SPIRIT1» достаточно актуально, поскольку даже на сегодняшний день количество однокристальных систем, работающих в субгигагерцевом диапазоне, относительно невелико. Кроме этого, встроенная поддержка пакетов WMBus делает SPIRIT1 перспективным решением для перевода существующих систем автоматизации, многие из которых работают по протоколу MBus, на беспроводной режим. Более того, многие популярные SCADA-системы работают, в том числе, и с MBus-протоколом.

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

 

Литература

  1. SPIRIT1 Low data rate, low power Sub 1GHz transceiver – STMicroelectronics;
  2. Михаил Чигарев. SPIRIT1 – дух, объединяющий микроконтроллеры ST в беспроводную сеть. Новости Электроники №8/2013;
  3. BALF-SPI-02D3 50Ω Conjugate match to SPIRIT1 433MHz Balun Transformer & Integrated Filtering – STMicroelectronics;
  4. BALF-SPI-01D3 50Ω nominal input conjugate match balun to SPIRIT1, with integrated harmonic filter – STMicroelectronics;
  5. STSW-CONNECT009 Setup for SPIRIT1 design kit – STMicroelectronics.

Получение технической информации, заказ образцов, заказ и доставка.

ST_SPIRIT1_NE_04_15_opt

Наши информационные каналы

Теги:
Рубрики: