Снижаем энергопотребление приемника S2-LP с помощью режима периодического прослушивания канала

5 мая

системы безопасностиучёт ресурсовсветотехникаинтернет вещейST Microelectronicsстатьяинтегральные микросхемыбеспроводные технологиипассивные ЭК и электромеханикаInternet-of-Thingswireless

В статье детально – с листингами и примерами – описано использование режима периодического прослушивания канала (Sniff mode) на трансивере S2-LP производства STMicroelectronics.

Режим периодического прослушивания канала – Sniff mode

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

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

S2-LP может работать в режиме приема, который называется LDC (Low Duty Cycle), чтобы потреблять крайне малый средний ток и обеспечивать при этом гарантированную связь.

Для снижения средней потребляемой энергии в режиме приема S2-LP содержит два специфических таймера:

  • Таймер ограничения времени режима приема (Rx Timeout timer). В приемопередатчике S2-LP режим приема контролируется по времени с целью минимизации потребления. Это реализовано путем ограничения времени работы приемника через специальный таймер, который принудительно обрывает режим приема после истечения времени TRXtimeout. Однако для того чтобы избежать прекращения приема валидного пакета предусмотрены несколько вариантов блокировки этого таймера в нужный момент. Остановить работу таймера можно, исходя из индикаторов качества принимаемого сигнала, таких как:
    • CS valid (уровень сигнала выше заданного);
    • SQI valid (качество преамбулы выше заданного);
    • PQI valid (синхрослово принято с заданным качеством).

Когда происходит остановка режима приема из-за срабатывания таймера (вышло время TRXtimeout), то принятые данные считаются некорректными и пакет будет проигнорирован.

  • Таймер быстрого прекращения приема (Fast RX termination timer). Новый механизм FAST RX TERMINATION (быстрое прекращение приема) был добавлен в микросхему S2-LP поверх механизма, описанного выше (и уже реализованного в предыдущей версии SPIRIT1). Этот новый механизм разрешается битом FAST_CS_TERM_EN, расположенным в регистре PROTOCOL[1] (0x3A).

Данный таймаут для быстрой оценки уровня несущей (Fast Carrier Sense – CS) базируется на новом выделенном таймере внутри демодулятора. Задача нового таймера – отмерить минимальное время, после которого значение RSSI, то есть уровень принимаемого сигнала, можно рассматривать как устоявшееся (для формирования адекватного значения RSSI требуется принимать сигнал в течение некоторого времени).

Типичный сценарий применения нового механизма FAST RX TERMINATION — асинхронный прием с малым временем активности (режим Low Duty Cycle, LDC – «долго спим, изредка включаемся»). Рассмотрим конкретную ситуацию, когда приемник и передатчик не синхронизированы по времени. В этом случае приемник периодически прослушивает эфир (дословно, делает «Sniff» – «принюхивается») для определения присутствия сигнала. Приемник должен прослушивать эфир достаточно часто, чтобы обнаружить сигнал во время преамбулы (то есть до передачи информативной части пакета), так как если обнаружение произойдет внутри тела пакета, то этот пакет нельзя будет принять корректно (часть данных уже пропущена). Таким образом, периодичность пробуждения жестко связана с длительностью преамбулы, которую формирует передатчик. Для снижения потребления продолжительность активного состояния приемника должна быть минимальной. Большую часть времени своего непродолжительного активного состояния приемник прослушивает эфир и в случае, если уровень несущей выше запрограммированного порога (валидный CS), продолжает прием и ждет появления синхрослова SYNC, которое передается сразу после преамбулы.

Если требуемого уровня несущей не наблюдается (то есть сигнал не обнаружен), то приемник должен вернуться в режим сна как можно скорее, без излишнего ожидания, чтобы минимизировать энергопотребление.

Благодаря вышеописанным таймерам микроконтроллер неактивен в режиме приема LDС и не принимает участия в обработке ложных срабатываний.

Диаграмма режима Sniff mode

При работе в режиме Sniff mode, он же – режим LDC (рисунок 1), приемопередатчик S2-LP полностью автономен и MCU будет вовлечен в процесс только после того как корректный пакет принят во внутреннее FIFO S2-LP. Микросхема в режиме Sniff mode потребляет очень мало энергии, так как большую часть времени приемник спит. Время сна определяется рабочим циклом, который конфигурируется с помощью таймера пробуждения «WakeUp Timer» (подробнее про него – далее), «Fast RX Termination Timer» и «RX Timeout».

Рис. 1. Работа S2-LP в режиме Sniff mode

Рис. 1. Работа S2-LP в режиме Sniff mode

Общая диаграмма логики работы режима Sniff mode

На рисунке 2 представлена диаграмма режима Sniff mode. Все действия в зеленом квадрате выполняются S2-LP самостоятельно (автономно), без привлечения управляющего микроконтроллера.

Рис. 2. Общая диаграмма логики работы режима Sniff mode

Рис. 2. Общая диаграмма логики работы режима Sniff mode

Описание преамбулы

Таблица 1. Формат пакета Basic: поле преамбулы

Преамбула Синхрослово SYNC Длина Адрес Полезные данные (Payload) Контрольная сумма CRC Постамбула (Postamble)
0: 2046 Пар бит 0: 32 бит 0: 2 байт 0: 1 байт 0: 65535 байт 0: 4 байт 0: 510 бит

Преамбула состоит из последовательности пар бит ‘01’ или ‘10’, которых может быть максимум 2046 (таблица 1). Длина преамбулы задается в битовых полях PREAMBLE_LEN, которые расположены в регистрах PCKTCTRL5 и PCKTCTRL6 (таблица 2).

Таблица 2. Задание длины преамбулы

Имя регистра Адрес Биты Наименование поля Описание
PCKTCTRL6 0x2B 7:2 SYNC_LEN Число бит, используемое для поля синхрослова SYNC в пакете
1:0 PREAMBLE_LEN[9:8] Старшие биты количества элементов преамбулы (длина преамбулы).

Элемент преамбулы – сочетание 01 или 10 для 2FSK

PCKTCTRL5 0x2C 7:0 PREAMBLE_LEN[7:0] Младшие биты количества элементов преамбулы (длина преамбулы).

Элемент преамбулы – сочетание 01 или 10 для 2FSK

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

Итак, для оптимизации процедуры обнаружения пакета очень важно иметь такой формат преамбулы (preamble pattern), который будет правильно воспринят S2-LP. S2-LP также содержит особый алгоритм для оценки качества преамбулы «на лету». Этот алгоритм называется PQI (Preamble Quality Indicator – индикатор качества преамбулы). Он проверяет, корректно ли изменяется сигнал с 0 на 1 в течение некоторого времени приема преамбулы (оценивает регулярность инверсии битов). Этот индикатор описан далее в данном документе.

Паттерн преамбулы при приеме используется внутренними алгоритмами радио S2-LP для автоматической подстройки частоты AFC (Automatic Frequency Correction), автоматической регулировки усиления AGC (Automatic Gain Control) и оценки уровня несущей частоты (Sniffing the Carrier Frequency). Для работы алгоритмов AFC и AGC минимальная длина преамбулы должна быть не менее двух пар бит.

Для того чтобы гарантировать отсутствие пропусков пакетов при быстром прослушивании канала, необходимо выполнять следующее требование: период между двумя включениями приемника должен быть короче, чем длина преамбулы минус длительность одного байта для внутренних алгоритмов радио и минус требуемое время на пробуждение приемника, то есть на время перехода из режима сна (Sleep mode) к режиму приема.

Индикаторы качества принимаемого сигнала

Определение наличия несущей (carrier sense) может быть использовано, чтобы принять решение, что мы в данный момент наблюдаем полезный сигнал. Это обнаружение базируется на измерении силы сигнала RSSI в приемном тракте (или шума, так как здесь мы еще не знаем, что именно мы наблюдаем). Существуют два режима для оценки уровня несущей – статический и динамический.

При использовании статического метода определения уровня несущей (CS_MODE = 0), индикатор обнаружения «carrier sense» активируется, когда измеренное значение RSSI становится выше порога, заранее заданного в регистре RSSI_TH, и деактивируется, когда RSSI снижается на 3 dB ниже того же порога.

Если используется динамическая оценка (CS_MODE = 1, 2, 3), индикатор «carrier sense» активируется, когда измеренное значение RSSI выше порога и наблюдается быстрое увеличение силы сигнала на 6, 12, или 18 dB. Индикатор сбрасывается, когда наблюдается уменьшение амплитуды на ту же величину.

Сигнал «carrier sense» также используется демодулятором внутри радио для следующих механизмов:

  • старта алгоритма автоматической подстройки частоты (AFC);
  • восстановления синхронизации (получение частоты тактирования для символьных отсчетов);
  • процедуры CSMA (для этого необходимо установить CS_MODE = 0).

Минимальная длительность окна приема в режиме «Sniff mode» должна выбираться с учетом требуемого времени для корректного формирования сигнала RSSI.

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

Как избежать ложного детектирования пакета

В этом разделе мы будем анализировать разные методы остановки процесса приема, как только станет понятно, что мы принимаем ложный пакет (то есть шум или отличный от ожидаемого сигнал). Это важно по следующим причинам:

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

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

Тем не менее, на практике пользователь должен адаптивно настраивать порог RSSI в зависимости от реальной шумовой обстановки или исходя из компромисса «чувствительность/пропуск пакета». Если работа происходит в условиях повышенного уровня шума, порог RSSI следует повышать.

Пример: при заданной полосе приемник в лаборатории принимает пакет при уровне сигнала -110 дБм. Приемник подключен к испытательному генератору кабелем, и измерения производятся в клетке Фарадея (нет внешних шумов). В этих условиях чувствительность приемника ограничена лишь его собственными шумами. Однако этот же приемник, размещенный на реальном объекте, даже при отсутствии полезного сигнала видит шум с уровнем -105 дБм. В этих условиях порог RSSI имеет смысл установить на уровне не -110, а -102 дБм, так как иначе приемник будет постоянно пытаться принимать шум.

Бинарные последовательности преамбулы, передаваемые при разных видах модуляции, представлены в таблице 3 (самый левый бит передается первым).

Таблица 3. Последовательности преамбулы при разных типах модуляции

Значение в битовом поле PREAMBLE_SEL Модуляция 2-(G) FSK или OOK/ASK Модуляция 4(G)-FSK
0 0101 0111
1 1010 0010
2 1100 1101
3 0011 1000

Выбор паттерна преамбулы задается в битовом поле PREAMBLE_SEL в регистре PCKTCTRL3 (таблица 4).

Таблица 4. Задание паттерна преамбулы

Имя регистра Адрес Биты Имя битового поля Описание
PCKTCTRL3 0x2E 7:6 PCKT_FRMT Формат пакета:
0: basic;
1: 802.15.4g;
2: UART OTA;
3: Stack.
5:4 RX_MODE Режим приема
0: normal:
1: direct through FIFO;
2: direct through GPIO.
3 FSK4_SYM_SWAP Выбор символьного отображения для 4(G)-FSK
2 BYTE_SWAP Выбор порядка передачи MSB или LSB
1:0 PREAMBLE_SEL Выбор паттерна преамбулы (подробнее об этом в таблице 3)

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

Установка правильного паттерна преамбулы передатчика является обязательным условием, если на приемном узле будет использоваться оценка качества преамбулы. Это ключ к правильной настройке шаблона преамбулы на стороне приемника для правильной обработки PQI.

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

Фильтрация принимаемых пакетов включается полем AUTO_PCKT_FLT регистра PROTOCOL, критерии фильтрации задаются в регистрах PCK_FLT_OPT и PCK_FLT_GOALS. Каждая опция фильтрации работает только в пакетных режимах, так как именно в конкретной структуре пакета определены адресные поля, которые будут автоматически анализироваться при приеме.

В S2-LP доступны следующие варианты фильтрации пакетов:

  • Проверка по полю «адрес назначения» (Destination address) на совпадение со значениями в регистрах BROADCAST, MULTICAST или TX_SOURCE_ADDR.

Когда пакет получен, поле «адреса назначения» из пакета будет сопоставляться с регистрами BROADCAST (широковещательный адрес), MULTICAST (групповой адрес) и TX_SOURCE_ADDR (ожидаемый адрес отправителя).

Если адрес назначения равен широковещательному адресу и бит DEST_VS_BROADCAST_ADDR установлен, то пакет будет принят, так как он был отправлен на широковещательный адрес приемника.

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

Если адрес назначения равен значению в регистре TX_SOURCE_ADDR (который также является собственным адресом принимаемого устройства) и установлен бит DEST_VS_SOURCE_ADDR, то пакет также принимается, так как адрес в пакете совпадает с собственным адресом принимаемого узла.

Если на приемном узле включена более чем однократная опция проверки адреса получателя, то пакет будет принят, если хотя бы одна из разрешенных проверок совпадет. Разрешенные проверки задаются битами DEST_VS_BROADCAST_ADDR/DEST_VS_MULTICAST_ADDR/DEST_VS_SOURCE_ADDR.

Если параметр автоматической фильтрации пакетов AUTO_PCKT_FLT включен, но ни один бит из вышеперечисленных опций фильтрации не установлен, то пакет будет автоматически принят, поскольку проверки выполняться не будут.

  • Проверка по полю «адрес отправителя» (Source address) на совпадение с регистром RX_SOURCE_ADDR.

Эта проверка будет активирована при установке бита SOURCE_FILTERING в регистре PCK_FLT_OPT (по умолчанию она не включена). Адрес отправителя, извлеченный из полученного пакета, сравнивается с содержимым регистра RX_SOURCE_ADDR. Регистр RX_SOURCE_MASK может быть использован для выбора не всех, а лишь отдельных битов для сравнения: таким образом можно включить группу исходных адресов, чтобы иметь возможность принимать сообщения от нескольких (но не всех) отправителей вместо одного адреса (по умолчанию регистр RX_SOURCE_MASK сброшен, поэтому ни один бит не выбран). Поле «Адрес отправителя» доступно только в пакетах формата STack, поэтому фильтрация по адресу отправителя для пакетов типа BASIC не работает.

Регистры S2-LP, отвечающие за функции фильтрации адреса, представлены в таблицах 5 и 6.

Таблица 5. Установка функций автоматической фильтрации пакетов S2-LP

Регистр PROTOCOL1:
Имя регистра Адрес Бит Имя битового поля Описание
PROTOCOL[1] 0x3A 7 LDC_MODE 1: Включить режим LDC (то есть режим периодического прослушивания канала)
6 LDC_RELOAD_ON_SYNC 1: Перезагрузка таймера LDC значением из регистра LDC_RELOAD.
5 PIGGYBACKING 1: Разрешить функцию PIGGYBACKING (совмещение передачи подтверждения и данных)
4 FAST_CS_TERM_EN 1: Разрешить таймер RX sniff timer
3 SEED_RELOAD 1: Перезагрузить генератор случайной задержки (Back Off random generator) значением из регистра BU_COUNTER_SEED
2 CSMA_ON 1: Разрешить работу функционала CSMA (оценка занятости канала перед включением передатчика)
1 CSMA_PERS_ON 1: Разрешить режим CSMA persistent enabled
0 AUTO_PCKT_FLT 1: Разрешить автоматическую фильтрацию пакетов
Примечание. Для того чтобы разрешить автоматическую фильтрацию пакетов и особенно фильтрацию по полю адреса, необходимо установить бит AUTO_PCKT_FLT в регистре PROTOCOL1.

Таблица 6. Варианты фильтрации пакетов S2-LP

Регистр PCKT_FLT_OPTION:
Имя регистра Адрес Бит Имя битового поля Описание
PCKT_FLT_OPTIONS 0x40 7 Зарезервировано
6 RX_TIMEOUT_AND_OR_SELECT 1: Функция ‘Или’ применяется к выбранным CS/SQI/PQI
5 Зарезервировано
4 SOURCE_ADDR_FILTERING 1: Прием пакета происходит только в том случае, если поле адреса «source» в пакете совпадает с регистром RX_SOURCE_ADDR
3 DEST_VS_BROADCAST_ADDR 1: Прием пакета происходит только в том случае, если поле адреса «destination» в пакете совпадает с регистром BROADCAST
2 DEST_VS_MULTICAST_ADDR 1: Прием пакета происходит только в том случае, если поле адреса «destination» в пакете совпадает с регистром MULTICAST
1 DEST_VS_SOURCE_ADDR 1: Прием пакета происходит только в том случае, если поле адреса «destination» в пакете совпадает с регистром RX_SOURCE_ADDR
0 CRC_FLT 1: Пакет отбрасывается, если CRC в теле пакета не совпадает с вычисленным по принятым данным CRC
Примечание. Этот регистр используется для выбора условий, при невыполнении которых принятый пакет будет проигнорирован.

Установка адресов для работы фильтров S2-LP представлена в таблице 7. 

Таблица 7. Регистры PCKT_FLT_GOALS[x]:

Адрес Бит Имя битового поля Описание
0x41 7:0 RX_SOURCE_MASK Только для режима приема пакетов (для принятых пакетов). 0s: не фильтровать по этому биту
0x42 7:0 RX_SOURCE_ADDR Задать адрес «адрес отправителя»/«адрес назначения» (RX packet source/TX packet destination field)
0x43 7:0 BROADCAST Широковещательный адрес
0x44 7:0 MULTICAST Групповой адрес
0x45 7:0 TX_SOURCE_ADDR Задать адрес «адрес отправителя» в передаваемом пакете/«адрес назначения» в принятом пакете (TX packet source/RX packet destination address)
Примечание. Этот регистр используется для установки различных адресов, которые ожидаются в принятом пакете. Советующий бит разрешения фильтрации должен быть установлен в регистре PCKT_FLT_OPTION.

Проверка целостности принятых данных производиться через автоматический подсчет контрольной суммы с помощью одного из возможных полиномов вычисления CRC (таблица 8).

Таблица 8. Полиномы вычисления CRC

Режим CRC Длина в байтах Полином
(Hexa coding)
Полином для вычислений
Mode 1 1 0x07 X7 + X2 + X + 1
Mode 2 2 0x8005 X16 + X15 + X2 + 1
Mode 3 2 0x1021 X16 + X12 + X5 + 1
Mode 4 3 0x864CFB X24 + X23 + X18 + X17 + X14 + X11 + X10 + X7 + X6 + X5 + X4 + X3 + X + 1
Mode 5 4 0x04C011BB7 X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X + 1
Примечание. CRC Seed – это всегда все единицы.

В таблице 9 показано, как активировать режим проверки CRC.

Таблица 9. Активация режима проверки CRC

Имя регистра  

Адрес

 

Бит

Имя битового поля Описание
PCKTCTRL1  

0x30

7:5 CRC_MODE CRC:
0: No CRC
1: 0x07
2: 0x8005
3: 0x1021
4: 0x864CBF
5: 0x04C011BB7
4 WITH_EN 1: Разрешить режим Whitening («отбеливание») для данных
3:2 TX_SOURCE[1:0] Источник передаваемых данных (TX source data):
0: Нормальный режим (Normal mode);
1: Прямой через FIFO (Direct through FIFO);
2: Прямой через GPIO (Direct through GPIO);
3: Псевдослучайная последовательность PN9.
1 SECOND_SYNC_ SEL В режиме «ПЕРЕДАТЧИК»:
0: Выбрать первичное слово синхронизации (primary SYNC word);
1: Выбрать вторичное слово синхронизации (secondary SYNC word);
В режиме ПРИЕМА, если в поле SECOND_SYNC_ SEL установлена единица, включается режим обнаружения двух синхрослов (dual SYNC word detection mode).
0 FEC_EN 1: Разрешить избыточное кодирование FEC при ПЕРЕДАЧЕ или включить декодер Витерби при ПРИЕМЕ

Программная конфигурация S2-LP

Конфигурация пакета с помощью API стандартной библиотеки управления S2-LPприведена в таблице 10.

Таблица 10. Конфигурация пакета

S2-LP
Имя API S2LPPktBasicInit
Аргументы Структура в библиотеке управления S2-LP для конфигурации базового типа пакета (Basic packet configuration structure):

typedef struct {

uint16_t xPreambleLength; /* Задает длину преамбулы пакета 1…1024 пар бит */

uint8_t xSyncLength; /* Задает длину синхрослова 1…64 битов */

uint32_t lSyncWords; /* Задает синхрослово, начиная со старшего байта */

SFunctionalState xFixVarLength; /* Разрешает режим с переменной длиной пакета */

SFunctionalState cExtendedPktLenField; /* Увеличивает размер поля под длину пакета с 1 до 2 байт. Применимо только для режима переменной длины пакета */

BasicCrcMode xCrcMode; /* Установка типа CRC. Cм. S2LP_PacketHandler.h \ PktCrcMode */

SFunctionalState xAddressField; /* Включить в пакет поле «Адрес Назначения» (destination address field) */

SFunctionalState xFec; /* Разрешение избыточного кодирования/коррекции ошибок FEC/Viterbi */

SFunctionalState xDataWhitening; /* Разрешение режима отбеливания данных */

} PktBasicInit;

Описание функции S2LPPktBasicInit

ФункцияS2LPPktBasicInit инициализирует S2LP на работу с пакетом типа Basic с конкретными настройками, задаваемыми в структуре PktBasicInitstruct. Обратите внимание, что эта функция устанавливает автоматическую проверку CRC, если задано любое другое значение кроме 0 для BasicCrcMode. Cм. S2LP_PktBasic.h.

Настройки регистров приведены в таблицах 11, 12 и 13.

Таблица 11. Установки регистров PCKTCTRLx

Имя регистра Адрес Бит Имя битового поля Описание
PCKTCTRL6 0x2B 7:2 SYNC_LEN Длина поля синхрослова SYNC в битах
1:0 PREMABLE_LEN[9:8] Старшие биты длины преамбулы (длина задается в парах бит)
PCKTCTRL 0x2C 7:0 PREAMBLE_LEN[7:0] Младшие биты длины преамбулы (длина задается в парах бит)
PCKTCTRL4 0x2D 7 LEN_WID Ширина (число байт) поля длины пакета:
0: 1 byte;
1: 2 bytes.
6:4 Reserved
3 ADDRESS_LEN 1: Включить в состав пакета поле адреса
2:0 Reserved
PCKTCTRL3 0x2E 7:6 PCKT_FRMT[1:0] Выбор типа пакета:
0: Basic;
1: 802.15.4g;
2: UARTOTA;
3: Stack.
5:4 RX_MODE[1:0] Режим ПРИЕМА:
0: Нормальный режим (Normal Mode);
1: Прямой через FIFO (Direct through FIFO);
2: Прямой через GPIO (Direct through GPIO).
3 FSK4_SYM_SWAP Выбор паттерна символов для 4(G)FSK
2 BYTE_SWAP Выбор порядка передачи (MSB или LSB)
1:0 PREAMBLE_SEL Выбор паттерна преамбулы
PCKTCTRL2 0x2F 7:6 Reserved
5 FCS_TYPE_4G Это тип FCS в поле хедера пакета типа 802.15.4g
4 EC_TYPE_4G/STOP_BIT – Если включен режим пакетов типа 802.15.4, это будет тип FCS в поле хедера пакета 802.15.4g.
Выбор типа FEC пакета 802.15.4g:
0: NRNSC;
1: RSC.- Если разрешен пакет UART, здесь будет значение STOP_BIT.
3 INT_EN_4G/START_BIT – Если разрешен режим 802.15.4, то:
1: разрешить режим «interleaving» в пакете 802.15.4g;- Если разрешен пакет UART, здесь будет значение START_BIT.
2 MBUS_3OF6_EN 1: Разрешить кодирование/декодирование 3-out-of-6 (для wMBus)
1 MANCHESTER_EN 1: Разрешить кодирование/декодирование Manchester
0 FIX_VAR_LEN Режим длины пакета:
0: Фиксированный размер (Fixed);
1: Переменная длина (Variable).
PCKTCTRL1 0x30 7:5 CRC_MODE Вид CRC:
0: No CRC;
1: 0x07;
2:0x8005;
3:0x1021;
4: 0x864CBF;
5: 0x04C011BB7.
4 WITH_EN 1: Разрешить режим отбеливания данных (Whitening)
3:2 TX_SOURCE[1:0] Источник передаваемых данных (TX Source data):
0: Нормальный режим (Normal Mode);
1: Прямой через FIFO (Direct through FIFO);
2: Прямой через GPIO (Direct through GPIO);
3: Псевдослучайная последовательность PN9.
1 SECOND_SYNC_SEL Использование альтернативного синхрослова в режиме ПЕРЕДАТЧИК:
0: Выбрать первичное слово синхронизации (primary SYNC word);
1: Выбрать вторичное слово синхронизации (secondary SYNC word).В режиме ПРИЕМА, если в поле SECOND_SYNC_ SEL установлена 1, то включается режим обнаружения двух синхрослов (dual SYNC word detection mode).
0 FEC_EN 1: Разрешить избыточное кодирование FEC при ПЕРЕДАЧЕ или включить декодер Витерби при ПРИЕМЕ

Таблица 12. Установка синхрослова (SYNC word)

Имя регистра Адрес Бит Имя битового поля Описание
SYNC3 0x33 7:0 SYNC4 Синхрослово, байт 3
SYNC2 0x34 7:0 SYNC3 Синхрослово, байт 2
SYNC1 0x35 7:0 SYNC2 Синхрослово, байт 1
SYNC0 0x36 7:0 SYNC1 Синхрослово, байт 0

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

Таблица 13. Запись данных в регистры PCKTLEN1/0

Имя регистра Адрес Бит Имя битового поля Описание
PCKTLE N1 0x31 7:0 PCKTLE N1 Старший байт длины пакета в байтах
PCKTLE N0 0x32 7:0 PCKTLE N0 Младший байт длины пакета в байтах

Установка порога RSSI

Функция обнаружения несущей (carrier sense) настраивается с помощью следующих параметров:

  • Порог RSSI. При превышении порога RSSI AFC и алгоритм восстановления синхронизации символов начинают работать с потоком данных. Для максимизации чувствительности порог RSSI должен быть установлен на 3 дБ ниже ожидаемого уровня чувствительности. Регистр RSSI_TH и действующее пороговое значение RSSI связаны формулой 1:

$$RSSI\_TH = RSSI\_threshold\_dBm + 146\qquad{\mathrm{(}}{1}{\mathrm{)}}$$

 

  • Битовое поле CS_MODE  определяет режим работы функции обнаружения несущей (регистр RSSI_FLT, допустимые установки 0…3):
    • CS_MODE = 0 – статический метод оценки наличия несущей;
    • CS_MODE = 1 – динамический метод оценки наличия несущей с динамическим порогом 6 дБ;
    • CS_MODE = 2 – динамический метод оценки наличия несущей с динамическим порогом 12 дБ;
    • CS_MODE = 3 – динамический метод оценки наличия несущей с динамическим порогом 18 дБ.

Настройки регистров и API представлены в таблице 14.

Таблица 14. Настройки регистров и API

Имя регистра Адрес Бит Имя битового поля Описание
RSSI_FLT 0x17 7:4 RSSI_FLT Усиление фильтра RSSI
3:2 CS_MODE CS_MODE = 0 – статический метод оценки наличия несущей;
CS_MODE = 1 – динамический метод оценки наличия несущей с динамическим порогом 6 дБ;
CS_MODE = 2 – динамический метод оценки наличия несущей с динамическим порогом 12 дБ;
CS_MODE = 3 – динамический метод оценки наличия несущей с динамическим порогом 18 дБ.
1:0 Reserved
RSSI_TH 0x18 7:0 RSSI_TH Установка порога обнаружения сигнала с шагом в 1 дБ. Значение RSSI_TH можно пересчитать в дБм по формуле: RSSI в дБм = RSSI_TH – 146.

Пример кода использования API из библиотеки для S2-LP:



SRssiInit xSRssiInit = {

.cRssiFlt = 14,

.xRssiMode = RSSI_STATIC_MODE,

.cRssiThreshdBm = -70,

};

S2LPRadioRssiInit(&xSRssiInit);

Таймер пробуждения LDC/WakeUp 

Период пробуждения в режиме LDC должен быть установлен таким образом, чтобы гарантировать хотя бы одно пробуждение во время передачи преамбулы (этот период еще надо уменьшить на длительность одного байта из-за затрат времени на работу автоподстройки частоты и восстановления синхронизации по символам), другими словами (формула 2):

$$T_{WU} \leq ((L_{PREAMBLE}-1)\times 8\times T_{BIT})-T_{SLEEP\_RX},\qquad{\mathrm{(}}{2}{\mathrm{)}}$$

где:

TWU – период LDC;

LPREAMBLE – длина преамбулы в байтах;

TBIT – время передачи одного бита;

TSLEEP_RX – требуемое время на переход приемника из режима сна в режим приема (для уменьшения этого времени можно выполнять периодическую калибровку VCO отдельно, а не при каждом просыпании).

Пример:

  • Скорость = 38,4 кб/с
  • Длина преамбулы = 4 байта =32 бита
  • TSLEEP_RX =100 мкс

TWU(ms) ≤ (32-1) × 8 × (1/38400) – 0,1
TWU(ms) ≤ 6,36 мс 

Теперь коснемся конфигурации спящего режима. S2-LP содержит два основных контроллера, которые управляют поведением микросхемы. Переключением между основными режимами работы занимаются два узла: контроллер питания (Power Mode Controller, PMC) и радиоконтроллер (Radio Controller). Это не микроконтроллеры в привычном понимании. PMC управляет режимами потребления энергии. Он имеет четыре основных режима работы – Готовность (READY), Ожидание (STANDBY), Сон А (SLEEP A) и Сон Б (SLEEP B). Эти режимы переключаются с помощью специальных команд.

Режим SLEEP A отличается от режима SLEEP B только доступностью цифрового блока. В режиме SLEEP A буферы FIFO недоступны, и их содержимое не сохраняется, в то время как в режиме SLEEP B данные в буферах FIFO не теряются. Специальный конфигурационный бит SLEEP MODE SELECT в регистре PM_CONFIG0 определяет, в какой именно режим сна – Sleep A или Sleep B – перейдет S2-LP при команде перехода в режим SLEEP.

Контроллер питания будет в состоянии READY после сброса и перейдет в режим STANDBY только по команде, которая подается в режиме READY. Контроллер питания может перейти в режим сна (SLEEP A или SLEEP B) только с помощью команды по SPI (от управляющего микроконтроллера) либо команды внутреннего радиоконтроллера (рисунок 3). Контроллер питания S2-LP может быть выведен из режима STANDBY с помощью команды SPI READY. Контроллер питания S2-LP может быть выведен из режима SLEEP A/SLEEP B c помощью нескольких событий:

  • команды SPI READY;
  • запроса на пробуждение через вывод GPIO S2-LP;
  • срабатывания внутреннего таймера LDC-CSMA Timer. 

Рис. 3. Машина состояний контроллера питания

Рис. 3. Машина состояний контроллера питания

Различным состояниям соответствует разное число работающих подсистем S2-LP, что влияет на энергопотребление (таблица 15).

Таблица 15. Работа подсистем S2-LP в разных состояниях

Состояние Малопотребляющий RC-генератор Сохранение данных в FIFO Кварцевый генератор
STBY
SLEEP A +
SLEEP B + +
READY +

Настройки регистров и API представлены в таблице 16.

Таблица 16. Настройки регистров и API

Имя регистра Адрес Бит Имя битового поля Описание
PM_CONF0 0x79 7 Reserved
6:4 SET_SMPS_LVL CS_MODE = 0 – статический метод оценки наличия несущей;
CS_MODE = 1 – динамический метод оценки наличия несущей с динамическим порогом 6 дБ;
CS_MODE = 2 – динамический метод оценки наличия несущей с динамическим порогом 12 дБ;
CS_MODE = 3 – динамический метод оценки наличия несущей с динамическим порогом 18 дБ.
3:1 Reserved
0 SLEEP_MODE_SEL 0: SLEEPA – сон без сохранения данных в FIFO;
1: SLEEPB – coн с сохранением данных в FIFO.

Пример кода из библиотеки S2-LP API:



/* используем режим SLEEP_A mode (default) */
S2LPTimerSleepB(S_DISABLE);

Оценку потребления при реализации периодического пробуждения можно сделать с помощью специальной программы S2-LP Consumption Tool, которая входит в состав пакета S2-LP SDK (рисунок 4).

Рис. 4. Чем реже происходит пробуждение S2-LP, тем больше экономия потребления в режиме Sleep A

Рис. 4. Чем реже происходит пробуждение S2-LP, тем больше экономия потребления в режиме Sleep A

открыть картинку в полном формате

Таймер быстрого окончания приема

Что же происходит, когда таймер быстрого окончания приема разрешен? Проверяется измеренный уровень RSSI против заданного порога (бит CSvalid):

  • если бит CS valid низкий (то есть RSSI ниже порога), то режим приема RX немедленно прекращается;
  • если бит CS valid высокий (то есть RSSI выше порога), то режим приема RX продолжается и радиоконтроллер запускает оценку включенных параметров качества CS/PQI/SQI (в заданном логическом сочетании) для управления механизмом таймаута в нормальном режиме.

Что происходит, когда таймер быстрого окончания приема НЕ разрешен? Радиоконтроллер немедленно запускает оценку включенных параметров качества CS/PQI/SQI (в заданном логическом сочетании) для управления механизмом таймаута в нормальном режиме.

Если приемник и передатчик не синхронизированы, то приемник должен периодически прослушивать канал («принюхиваться», sniff) для проверки наличия несущей. Эту проверку приемник должен делать достаточно часто, чтобы не пропустить преамбулу. Если при очередной проверке несущая обнаружена (то есть установился бит CS valid), то приемник остается в активном режиме и ожидает появления валидного синхрослова. Если несущая не обнаружена, то прием выключается максимально быстро и S2-LP уходит в режим сна до следующего пробуждения. Такой механизм позволяет, с одной стороны, не пропустить ни одного полезного пакета, а с другой – существенно снижает средний ток потребления по сравнению с вариантом, когда режим приема включен постоянно.

Данные о времени, которое требуется для измерения RSSI, представлены в таблице 17.

Таблица 17. Время, требуемое на измерение RSSI при различной полосе пропускания приемного фильтра

Минимальная ширина фильтра приемника, кГц Максимальная ширина фильтра приемника, кГц Экспонента канального фильтра Эффективное время определения RSSI, мкс
Условия: порог RSSI на 3 дБ выше статической чувствительности; сигнал на 6 дБ выше статической чувствительности
4,0 6,7 7 4500
6,7 13,5 6 2370
13,5 26,9 5 1100
26,9 53,9 4 642
53,9 108,0 3 336
108,0 216,1 2 168
216,1 433,6 1 92
433,6 769,3 0 48

Измерения проведены для частоты опорного генератора 25 МГц (использовался кварцевый резонатор 50 МГц). Все измерения проведены при точной настройке приемника и передатчика на одну частоту – было устранено расхождение частот кварцев (XTAL offset calibrated). Критерий успешности – прием 1000 пакетов без единой ошибки. 

Как рассчитать минимальное время для быстрого прекращения приема? Функция быстрого прекращения приема включается с помощью бита FAST_CS_TERM_EN, который расположен в регистре PROTOCOL [1], адрес – 0x3A. Таймер времени оценки несущей (Carrier Sense, CS) реализован внутри демодулятора. Назначение данного таймера – отсчитать время, в течение которого значение RSSI принимает стабильное значение, сопоставимое с  принимаемым сигналом. Этот таймер тактируется от того же источника тактовых сигналов, который задействован и в работе цифрового приемного канального фильтра. Частота тактов в МГц определяется по формуле 3:

$$f_{CS\_TIMER}=\frac{f_{CLK}}{24\times 2^{CHFLT\_E}},\qquad{\mathrm{(}}{3}{\mathrm{)}}$$

где CHFLT_E – экспонента в программном коде канального фильтра.

Значение для этого таймера задается через слово «RSSI_SETTLING_LIMIT» в регистре FAST_RX_TIMER. 

Важное замечание: предполагается, что значение времени в таймере установки RSSI устанавливается таким образом, чтобы этот таймер сработал раньше, чем таймеры оценки качества PQI/SQI timer.

Пример:

  • RX bandwidth = 100 кГц ⇒ CHFLT_E =3
  • fCLK = 25 МГц

fCS_TIMER = 25/24/2CHFLT_E

fCS_TIMER = 0,12 МГц

Таким образом, тактовая частота таймера TCS_TIMER = 8,4 мкс.

Согласно таблице 17, при полосе приемника 100 кГц время на корректное измерение RSSI должно быть не менее 336 мкс. Для того чтобы проводить оценку несущей по истечении не менее 336 мс, нам необходимо установить значение в RSSI_SETTLING_LIMIT, равное 336/8,4 = 40 (0x28). 

Настройки регистров и API представлены в таблицах 18 и 19.

Таблица 18. Настройки регистров

Имя регистра Адрес Бит Имя битового поля Описание
PROTOC OL1 0x3A 7 LDC_MODE 1: Разрешить работу режима LDC mode
6 LDC_RELOAD_ON_SYNC 1: Таймер LDC перезагружается значением из регистра LDC_RELOAD
5 PIGGYBACKING 1: Разрешить функцию PIGGYBACKING
4 FAST_CS_TERM_EN 1: Разрешить таймер RX sniff timer (таймер быстрого окончания приема)
3 SEED_RELOAD 1: Перезагрузить генератор случайной задержки Back Off random generator значением из регистра BU_COUNTER_SEED.
2 CSMA_ON 1: Разрешить режим оценки занятости канала CSMA
1 CSMA_PERS_ON 1: Включить опции «CSMA постоянно включен»
0 AUTO_PCKT_FLT 1: Включение автоматической фильтрации пакетов

Таблица 19. Настройки API

Имя регистра Адрес Бит Имя битового поля Описание
FAST_RX_ TIMER 0x54 7:0 RSSI_SETTLING_LIMIT Конфигурация Sniff timer (время срабатывания таймера быстрого окончания приема)

Пример кода из библиотеки S2-LP API:


/* Задать значение таймера быстрого окончания приема в микросекундах */ 
S2LpSetTimerFastRxTermTimerUs(336);
/* Разрешить fast rx timer */ 
S2LpTimerFastRxTermTimer(S_ENABLE);

Ограничение времени приема RX

В микросхеме S2-LP режим работы приемника ограничивается по времени для минимизации потребления. Это реализуется с помощью таймера ограничения приема (RX timeout), который останавливает работу приемника после истечения времени TRX (задается в специальном таймере). Однако существует несколько вариантов остановки этого таймера, чтобы избежать прекращения приема при валидном пакете. Остановка таймера означает, что таймаут никогда не наступит и прием будет продолжаться, пока не будет прекращен по другим причинам, например, принудительно со стороны микроконтроллера командой SABORT либо самостоятельно по окончании приема пакета. При приеме пакета приемник всегда знает его длину, она берется либо из самого принимаемого пакета, либо заранее задается в отдельном регистре приемника.

Остановка таймера ограничения режима приема может производиться по результатам оценки качества принимаемого сигнала, а именно:

  • уровень несущей выше порога (CS valid);
  • синхрослово принято успешно (SQI valid);
  • качество преамбулы выше порогового условия (PQI valid);

Можно комбинировать разные оценки качества сигнала, задавая логические отношения «AND» и «OR» между любыми из них. Это делается с помощью бита выбора RX_TIMEOUT_AND_OR_SELECT в регистре PCKT_FLT_OPTIONS. Чтобы выбрать, какой из показателей качества следует учитывать в логическом соотношении AND/OR, пользователь должен использовать биты маски, доступные в регистре PROTOCOL [2].

Когда прием прерывается по срабатыванию таймера ограничения приема, пакет считается действительным в том случае, если было обнаружено синхрослово. Принятый пакет не игнорируется S2-LP автоматически. Выбор, игнорировать или нет такой пакет, остается за пользователем. Но если в дополнение включена опция фильтрации, например, активирован бит CRC_CHECK в регистре PCKT_FLT_OPTIONS, то тогда пакет будет автоматически проигнорирован, если контрольная сумма окажется неверной.

Ответственность за выбор правильного логического сочетания проверок качества сигнала лежит на разработчике приложения. В частности, рекомендуется всегда включать проверку корректного синхрослова (SQI), чтобы избежать возможных зависаний в состоянии приема, если таймер остановлен, но ожидаемое синхрослово не было распознано из-за кратковременной помехи. В таком случае приемник будет бесконечно ожидать синхрослово, и его можно разблокировать только командой SABORT со стороны микроконтроллера. В любом случае, если обнаружено синхрослово (SQI valid), приемник обычно останавливается после приема заданного числа байт пакета внутренней командой от демодулятора.

При некоторых неудачных настройках таймера и индикаторов качества возможен некорректный прием пакета при формально корректном окончании процесса приема с соответствующим выставлением прерывания по готовности принятых данных в приемном FIFO («RX data ready»). Например, подобная ситуация может возникнуть при следующем сочетании настроек:

  • запрограммировано безусловное срабатывание таймера ограничения режима приема (режим “Timeout always stopped”);
  • настроены условия «CS valid AND SQI valid» (сильный сигнал и синхрослово принято) или «Все оценки качества сигнала валидны»;
  • порог RSSI задан таким большим, что условие CS_timeout никогда не остановит таймер.

При перечисленных условиях и успешном приеме синхрослова срабатывание таймера может произойти до окончания приема всего пакета (то есть в середине пакета – см. таблицу 20), но при этом возникнет прерывание по готовности данных «RX data ready» и пакет не будет проигнорирован (хотя в FIFO пакет будет не весь, то есть он заведомо некорректен). Однако этой ситуации не случится, если включить механизм фильтрации пакетов по контрольной сумме. Чтобы избегать подобных коллизий (пусть и созданных самим разработчиком из-за противоречивых настроек), рекомендуется всегда задействовать фильтрацию пакетов по CRC (контрольной сумме).

Плохой вариант настройки – это комбинировать проверку синхрослова (SQI valid check is set) по «ИЛИ» с такими настройками как «RSSI выше порога» (CS valid) или “Любой параметр качества выше порога”. Может случиться так, что RSSI будет достаточно высок, поэтому проверка «CS valid» остановит таймер. Но если синхрослово далее не будет обнаружено, то автоматического останова приема не произойдет (таймер прерывания приема уже остановлен). Вывести приемник из этого состояния можно будет лишь по команде SABORT от микроконтроллера.

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

RX_TIMEOUT_, AND_OR_SELECT CS_TIMEOUT_MASK SQI_TIMEOUT_MASK PQI_TIMEOUT_MASK Описание
0 0 0 0 0 Нет остановки по таймауту (No timeout stop)
1 1 0 0 0 Таймаут всегда отключен (Timeout always stopped)
2 X 1 0 0 RSSI выше порога (RSSI above threshold (default))
3 X 0 1 0 Синхрослово принято (SQI above threshold)
4 X 0 0 1 Качество преамбулы выше порога (PQI above threshold)
5 0 1 1 0 RSSI вышепорога И синхрослово принято (Both RSSI AND SQI above Threshold)
6 0 1 0 1 RSSI выше порога И качество преамбулы выше порога (Both RSSI AND PQI above Threshold)
7 0 0 1 1 Синхрослово принято И качество преамбулы выше порога (Both SQI AND PQI above Threshold)
8 0 1 1 1 ВСЕ выше порогов (ALL above threshold)
9 1 1 1 0 RSSI выше порога ИЛИ синхрослово принято(RSSI OR SQI above threshold)
10 1 1 0 1 RSSI выше порога ИЛИ качество преамбулы выше порога (RSSI OR PQI above threshold)
11 1 0 1 1 Синхрослово принято ИЛИ качество преамбулы выше порога (SQI OR PQI above threshold)
12 1 1 1 1 ЛЮБОЙ выше порога (ANY above threshold)

Таймер окончания приема (RX timeout) должен быть настроен таким образом, чтобы обеспечивал достаточное время, которое требуется для выполнения проверок PQI и SQI. Если качество преамбулы выше порога и синхрослово принято успешно, то пакет считается действительным (то есть S2-LP принимает действительно ожидаемые данные, а не шум).

Регистры и API должны быть настроены, как показано в таблице 21.

Таблица 21. Настройка регистров и API

Имя регистра Адрес Бит Имя битового поля Описание
TIMERS5 0x46 7:0 RX_TIMER_CNTR Счетчик для таймера ограничения приема (Counter for RX timer)
TIMERS4 0x47 7:0 RX_TIMER_PRESC Предделитель для таймера ограничения приема (Prescaler for RX timer)

Для точного вычисления значений RX_TIMER_CNTR и RX_TIMER_PRESC смотрите реализацию API-функции S2LPTimerComputeRxTimerRegValues.

Пример кода из библиотеки S2-LP API:



/* Задать время таймера окончания приема в микросекундах */
 S2LPTimerSetRxTimerUs(30000);

Оценка качества преамбулы PQI

Значение PQI лежит в диапазоне 0…255. Оно увеличивается на 1 каждый раз, когда наблюдается инверсия бита в приемном сигнале и уменьшается сразу на 4 единицы, когда наблюдается повторение того же бита.

Если включена проверка индикатора качества преамбулы (бит PQI_EN регистра QI установлен в «1»), то текущее пиковое значение PQI сравнивается с порогом и бит прерывания по валидной преамбуле (preamble valid IRQ) устанавливается в «1», как только будет превышен порог. Порог качества преамбулы равен 4 × PQI_TH (PQI_TH = 0…15).

Как это работает:

  • во-первых, вычисляется порог (PQI threshold) по считанному из регистра PQI_TH значению (Порог = 4 × PQI_TH);
  • затем счетчик PQI рассматривается как беззнаковое целоe, поэтому он не может быть менее нуля;
  • каждый раз, когда счетчик PQI уменьшается на 4 (при ошибочном приеме очередного бита преамбулы) и становится меньше нуля, его значение принудительно устанавливается в «0».

Настройки регистров PQI и API при этом отображены в таблице 22.

Таблица 22. Настройки регистров PQI и API

Имя регистра Адрес Бит Имя битового поля Описание
QI 0x37 7:5 SQI_TH Установка порога для определения валидности синхрослова (SQI threshold)
4:1 PQI_TH Установка порога для определения качества преамбулы (PQI threshold)
0 SQI_EN 1: Разрешение проверки корректного приема синхрослова (SQI check)

Пример кода из библиотеки S2-LP API:



/* Разрешить проверку качества преамбулы и установить порог на 15
 (максимальное значение – наиболее строгая проверка) */

S2LPRadioSetPqiCheck(0xF);

Как проверить работу PQI?

Для следующих примеров рассмотрим конфигурацию приемника:

  • частота – 862 МГц;
  • модуляция – 2 FSK;
  • скорость – 38 кбит/с;
  • девиация – 20 кГц;
  • фильтр RX: 100 кГц.

Пример 1. PQI_THRESHOLD: 0x01 (регистр 0x37 [4:1]): соответственно, PQI_THRESOLD установлен как 4.

Диапазон значений PQI_THRESHOLD составляет 0…255 (0x00 & 0xFF). Вычисление PQI следующее: порог как беззнаковое целое увеличивается на 1 каждый раз, когда наблюдается инверсия бита и уменьшается на 4 каждый раз, когда наблюдается повторение бита (рисунок 5).

Рис. 5. Порог PQI не превышен до тех пор, пока мы не наблюдаем четыре инверсии битов подряд

Рис. 5. Порог PQI не превышен до тех пор, пока мы не наблюдаем четыре инверсии битов подряд

Пример 2. PQI_THRESHOLD: 0x04 (регистр 0x37 [4:1]): соответственно, PQI_THRESOLD установлен как 16 (рисунок 6).

Рис. 6. Порог PQI превышен после 16 инверсий битов подряд

Рис. 6. Порог PQI превышен после 16 инверсий битов подряд

Проверка качества приема синхрослова SQI

Качество приема синхрослова SQI – это измерение степени корреляции между принятым синхрословом и ожидаемым (заданным) значением. Величина, представляющая идеальное совпадение, находится в регистре SYNC_LENGTH. Если длина синхрослова определена в размере 32 бита (в регистре SYNC_LENGTH), то идеальное совпадение будет, когда текущая принятая последовательность из 32 бит будет полностью совпадать с выбранным синхрословом – 32 бита из 32. Можно установить менее жесткую проверку и ориентироваться на совпадение, например, 30 бит из 32. Установка менее строгой проверки имеет как отрицательные, так и положительные стороны. Это может привести, с одной стороны, к приему ложных пакетов (которые, впрочем, потом будут проигнорированы по несовпадению CRC), зато с другой (хорошей) стороны, мы имеем шанс корректно принять пакет, в котором только синхрослово было слегка искажено помехой.

Если индикатор качества синхрослова разрешен (поле SQI_EN в регистре QI установлено в «1»), то текущее пиковое значение SQI сравнивается с пороговым значением, и прерывание обнаружения валидного синхрослова (sync valid IRQ) формируется, как только порог превышен. Пороговое значение качества синхрослова эквивалентно SYNC_LEN – 2xSQI_TH. Битовое поле SQI_TH находится в регистре QI и может иметь значения 0…7. Когда SQI_TH равно 0, требуется идеальное совпадение для срабатывания индикатора SQI. Если SQI_TH = 1, 2, 3…7, то синхрослово будет считаться успешно принятым даже при наличии нескольких несовпадающих битов. При установке SQI_TH ≠ 0 рекомендуется не использовать синхрослово по умолчанию, а именно 0x88. Лучше выбрать менее регулярное число с точки зрения повторения бит. Используемое синхрослово прописывается в регистрах SYNC1/2/3/4. Рекомендуется всегда разрешать проверку качества синхрослова (SQI check enabled).

Пиковое значение SQI можно считывать из регистра LINK_QUALIF1, величина битового поля SQI [5:0] представляет текущее пиковое значение 0…32, в то время как бит SQI [6], установленый в “1”, показывает, что пиковое значение SQI относится ко вторичному синхрослову (в определенных режимах S2-LP поддерживает поиск и прием пакетов по двум разным синхрословам).

Установки регистров SQI показаны в таблице 23.

Таблица 23. Установки регистров SQI

Имя регистра Адрес Бит Имя битового поля Описание
QI 0x37 7:5 SQI_TH SQI threshold
4:1 PQI_TH PQI threshold
0 SQI_EN 1: enable the SQI check

Для примеров проверки работы SQI рассмотрим такую конфигурацию приемника:

  • частота – 862 МГц;
  • модуляция – 2 FSK;
  • скорость – 38 кбит/с;
  • девиация – 20 кГц;
  • фильтр RX – 100 кГц.

Пример 1. SQI_THRESHOLD: 0x00 (регистр 0x37 биты [5:4]): соответственно, требуется точное совпадение синхрослова (SYNC word matching). SQI_EN: 0X01 (регистр 0x37 [0]). Синхрослово запрограммировано как 0x88778877, 4 байта (рисунок 7).

Рис. 7. Точное совпадение синхрослова

Рис. 7. Точное совпадение синхрослова

Пример 2. SQI_THRESHOLD: 0x04 (регистр 0x37, биты [5:4]): соответственно, допускается несовпадение до 4 битов при детектировании синхрослова. SQI_EN: 0X01 (регистрr 0x37 бит [0]). Синхрослово запрограммировано как 0x88778877, 4 Байта (рисунок 8).

Рис. 8. Несовпадение синхрослова (до 4 битов)

Рис. 8. Несовпадение синхрослова (до 4 битов)

Примеры кода

Проект в SDK

Примеры реализации приемника с периодическим прослушиванием канала (Sniff mode) можно найти в папке, куда установлен программный пакет S2-LP SDK:

…\S2‑LP_DK_1.3.0\Projects\Projects_Cube\S2LP_DK\S2‑LPLibrary_Examples\src\Sniff

Папка, содержащая нужные файлы, показана на рисунке 9.

Рис. 9. Папка с программным пакетом S2-LPSDK

Рис. 9. Папка с программным пакетом S2-LP SDK

Описание примера

В этих примерах объясняется, как настроить один узел в качестве передатчика, а другой – в качестве приемника в режиме периодического прослушивания канала (Sniff mode). Устройство A конфигурируется как передатчик с увеличенной до 64 байт длиной преамбулы, а устройство B – как приемник с использованием режима малого энергопотребления. Передатчик A передает пакет из 20 байт каждую секунду. Приемник B находится большую часть времени в спящем режиме и пробуждается на очень короткое время, чтобы измерить силу сигнала RSSI. Если в момент пробуждения пакет находится в эфире, приемник обнаруживает этот сигнал и продолжает работать, ожидая прием слова синхронизации и передаваемых данных. Если измеренное значение RSSI ниже заданного порога -70 дБм, приемник сразу уходит в сон для максимальной экономии потребления. Процесс работы можно наблюдать через вывод в COM-порт, задав параметр переменной окружения USE_VCOM. В этом случае и передатчик, и приемник будут выводить свой буфер (отправляемые/принятые данные) в терминал каждый раз, когда происходит ПЕРЕДАЧА/ПРИЕМ пакета.

Инициализация Приемника

  • Системная инициализация:


HAL_Init();

SystemClock_Config();

SdkEvalIdentification();

SdkEvalLedInit(LED1);

SdkEvalM2SGpioInit(M2S_GPIO_SDN,M2S_MODE_GPIO_OUT);
 S2LPSpiInit();

EepromSpiInitialization();

Строки выше задают тактирование и производят настройку периферии. После этой секции должен быть правильно настроен SPI. 

  • Включение S2-LP:


/* Запуск S2LP */
 S2LPEnterShutdown();
 S2LPExitShutdown();
S2LPManagementIdentificationRFBoard();

/* Если на отладочной плате установлена микросхема EEPROM с измеренными при производстве данными,
то программа компенсирует сдвиг частоты кварца с помощью функции S2LPManagementGetOffset
(если EEPROM не присутствует, эта функция возвратит 0) */

xRadioInit.lFrequencyBase = xRadioInit.lFrequencyBase + S2LPManagementGetOffset();

/* Инициализация вывода GPIO3 как приемника IRQ от S2-LP */
 SdkEvalM2SGpioInit(M2S_GPIO_3,M2S_MODE_EXTI_IN);

/* При необходимости конфигурируется оборудование для работы со внешним усилителем мощности */
S2LPManagementRangeExtInit();

/* При необходимости устанавливается бит EXT_REFS2-LP */
 S2LPManagementTcxoInit();

/* Конфигурирование выводов S2LP gpio */

S2LPGpioInit(&(SGpioInit){S2LP_GPIO_3, S2LP_GPIO_MODE_DIGITAL_OUTPUT_LP, S2LP_GPIO_DIG_OUT_IRQ});

M2S_GPIO_PIN_IRQ=SdkEvalGpioGetPin(M2S_GPIO_3);

После этой секции S2-LP будет находиться в состоянии READY:

  • Инициализация радио:


/* Конфигурация S2LP Radio */
 S2LPRadioInit(&xRadioInit);

/* Выполняем калибровку RCO */
 S2LPManagementRcoCalibration();

SdkEvalM2SGpioInterruptCmd(M2S_GPIO_3,IRQ_PREEMPTION_PRIORITY,0,ENABLE);

  • Конфигурация пакета:


/* Конфигурация пакета S2LP */
 S2LPPktBasicInit(&xBasicInit);

if(VARIABLE_LENGTH==S_DISABLE) {

S2LPPktBasicSetPayloadLength(20);

}

  • Разрешение прерываний:


/* Конфигурация прерываний на S2LP */
S2LPGpioIrqDeInit(&xIrqStatus); S2LPGpioIrqConfig(RX_DATA_READY,S_ENABLE);

Необходимо разрешить на S2-LP как минимум прерывание DATA_READYIRQ, чтобы информировать MCU о том, что пакет принят успешно, и теперь можно вычитать пакет из FIFO.

  • Конфигурация порога RSSI:


SRssiInit xSRssiInit = {

.cRssiFlt = 14,

.xRssiMode = RSSI_STATIC_MODE,

.cRssiThreshdBm = -70,

};

S2LPRadioRssiInit(&xSRssiInit);

  • Конфигурация таймера периодического пробуждения LDC:


/* Задать режим работы LDC */
 S2LPTimerSetWakeUpTimerUs(1000*MIN_PERIOD_WAKEUP);

  • Конфигурация таймера прекращения приема (RX timeout):


/* Установить максимальное время в режиме приема */
 S2LPTimerSetRxTimerUs(30000);
  • Таймер быстрого прекращения приема (время на оценку RSSI):

/* Установить время быстрого прекращения приема */
 S2LpSetTimerFastRxTermTimerUs(400);
  • Выбор режима сна (SLEEP) – устанавливаем сон типа А:

/* Используем режим SLEEP_A (по умолчанию) */
 S2LPTimerSleepB(S_DISABLE);
  • Разрешение режима периодического включения приемника LDC: 

/* Разрешить режим LDC */
 S2LPTimerLdcrMode(S_ENABLE);
  • Разрешение быстрого прекращения приема (FAST RX termination):

/* Разрешить таймер быстрого прекращения приема */
 S2LpTimerFastRxTermTimer(S_ENABLE);
  • Команда на включение режима ПРИЕМ запускает режим LDC в совокупности с функцией быстрого прекращения приема:

/* Команда запуска RX включает режим LDC in fast RXtermination mode */
 S2LPCmdStrobeRx();
  • Команда на выполнение бесконечного цикла:

/* Бесконечный цикл */

while (1) {

}

Обработка прерываний IRQ от S2-LP на стороне приемника

  • Обработка прерывания IRQ_DATA_READY:

/* Получаем статус IRQ: флаг IRQ сбрасывается автоматически */
 S2LPGpioIrqGetStatus(&xIrqStatus);

/* Проверяем флаг S2LP RX_DATA_READY IRQ flag */
 if(xIrqStatus.IRQ_RX_DATA_READY)

{

/* Получаем количество принятых байт в буфере RXFIFO */

cRxData = S2LPFifoReadNumberBytesRxFifo();

/* Вычитываем принятые данные из RXFIFOS2-LP в ОЗУ STM32 */
 S2LPSpiReadFifo(cRxData, vectcRxBuff);

/* Возвращаем S2-LP назад в состояние сна */

S2LPCmdStrobeSleep();

}

Современные приемники диапазона 868 МГц требуют единиц-десятков миллиампер тока для нормальной работы. Такое потребление не позволяет обеспечить работу в режиме непрерывного приема в течение более одного месяца при использовании типовых батарей емкостью 1…2 А/ч. Режим периодического прослушивания канала позволяет радикально увеличить время работы приемника, при этом лишь незначительно проигрывая в мгновенной доступности. Приемопередатчик S2-LP идеально подходит для такой задачи, так как содержит необходимые таймеры и механизмы оценки принимаемого сигнала, позволяющие реализовать режим Sniff mode без снижения чувствительности и без привлечения ресурсов управляющего микроконтроллера.

Приложения

Бесконечная преамбула

Если необходимо создать преамбулу длиной более чем ее максимальный размер, то приложение должно использовать специальный метод формирования преамбулы с использованием FIFO.

Трансивер S2-LP не имеет механизма автоматического прекращения передачи, когда данные в FIFO закончились. Поэтому можно использовать эту особенность следующим образом:

  • на этапе конфигурации обходим обработчик пакетов, используя функцию S2LPPacketHandlerSetTxMode(DIRECT_TX_FIFO_MODE);
  • загружаем один байт в FIFO: fifo_write(1,0xaa);
  • подаем команду-строб на включение передатчика. В эфир начинает передаваться «бесконечная» преамбула;
  • конфигурируем пакетный обработчик на передачу обычного пакета, то есть настраиваем вариант SYNC + PAYLOAD. Устанавливаем размер синхрослова, конфигурируем преамбулу и включаем режим NORMAL_TXMode. Выполнение этих действий по конфигурации в момент передачи «бесконечной» части преамбулы позволяет уменьшить промежуток между «бесконечной» частью преамбулы и финальной частью с синхрословом и полезными данными;
  • микроконтроллер ждет нужное для длины преамбулы время (например, 500 мс с помощью функции SdkDelayMs(500)) или спит в малопотребляющем режиме. В то же время S2-LP (согласно спецификации) не прервет передачу (как SPIRIT1), а будет продолжать передавать последний байт FIFO бесконечно долгое время;
  • через 500 мс микроконтроллер может записать другие данные в FIFO, чтобы передать их далее в нормальном режиме NORMAL_TX_MODE. Сначала посылается команда SABORT (прекращаем текущую «бесконечную» преамбулу), затем очищаем FIFO и записываем туда нормальный пакет;
  • запускаем передачу пакета командой-стробом включения передатчика.

/* Задаем параметры пакета для нормального режима */

PktBasicInitxBasicInit={ PREAMBLE_LENGTH,

SYNC_LENGTH, SYNC_WORD, VARIABLE_LENGTH, EXTENDED_LENGTH_FIELD, CRC_MODE,

EN_ADDRESS, EN_FEC, EN_WHITENING,

};

/* Конфигурация пакета для передачи преамбулы */

Пример кода:


PktBasicInit xBasicInitPreamble={ 0,

0, SYNC_WORD,

VARIABLE_LENGTH, EXTENDED_LENGTH_FIELD, PKT_NO_CRC, EN_ADDRESS,

EN_FEC, S_DISABLE, };

/* 1. Установить размер преамбулы и синхрослова в 0 */
 S2LPPktBasicInit(&xBasicInitPreamble);

/* 2. Установить режим «direct FIFO mode» */
 S2LPPacketHandlerSetTxMode(DIRECT_TX_FIFO_MODE);

/* 3. ОчиститьTx FIFO */
 S2LPCmdStrobeFlushTxFifo();

/* 4. Записать 1 байт с паттерном преамбулы в FIFO, он будет
 передаваться бесконечно */
 S2LPSpiWriteFifo(1, &tmp);

/* 5. Начать передачу бесконечной преамбулы */

S2LPCmdStrobeTx();

/* 6. Задать режим нормальной преамбулы и синхрослова для подготовки
 передачи SYNC + PAYLOADTx */

S2LPPktBasicInit(&xBasicInit);

/* 7. Установить режим передачи в Нормальный режим в рамках подготовки
 к передаче SYNC + PAYLOADTx */

S2LPPacketHandlerSetTxMode(NORMAL_TX_MODE);

/* 8. Задержка на требуемую длительность преамбулы */

SdkDelayMs(500);

/* 9. Остановить передачу бесконечной части преамбулы */
 S2LPCmdStrobeSabort();

/* 10. ОчиститьFIFO перед отправкой пакета */
 S2LPCmdStrobeFlushTxFifo();

/* 11. Заполнить FIFO полезными данными пакета PAYLOAD */
 S2LPSpiWriteFifo(20, vectcTxBuff);

/* 12. Запустить передачу синхрослова и пакета SYNC + PAYLOAD */
 S2LPCmdStrobeTx();

Это наглядно изображено на рисунке 10.

Рис. 9. Передача бесконечной преамбулы – смешанный метод

Рис. 9. Передача бесконечной преамбулы – смешанный метод

Специальный случай активации режима CSMA

Последовательность активации режима CSMA (проверка занятости канала перед передачей) в сочетании с длинной преамбулой:



/* 1. Добавлено отключение CSMA, что бы обеспечить корректную работу в сочетании
 с длинной преамбулой */

S2LPCsma(S_DISABLE);

/* 2. Задаем обычные параметры для преамбулы и синхрослова для подготовки передачи
 SYNC + PAYLOADTx */

S2LPPktBasicInit(&xBasicInit);

/* 3. Устанавливаем нормальный режим для SYNC + PAYLOADTx */

S2LPPacketHandlerSetTxMode(NORMAL_TX_MODE);

/* 4. Останавливаем передачу бесконечной преамбулы */

S2LPCmdStrobeSabort();

/* 5. Очищаем FIFO-буфер передачи перед отправкой пакета */

S2LPCmdStrobeFlushTxFifo();

/* 6. Заполняем FIFO-буфер передатчика пакетом */

S2LPSpiWriteFifo(20, vectcTxBuff);

/* 7. Запускаем передачу синхрослова и полезных данных пакета */

S2LPCmdStrobeTx();

…

/* Ждем окончания передачи и снова активируем режим CSMA */

S2LPCsma(S_ENABLE);

Главное – выполнить базовую инициализацию и смену режима после задержки. 

Основным преимуществом данного решения генерации длинной преамбулы является возможность его легкого встраивания в существующий проект. Недостатком является неизбежная пауза в передаче, однако это не будет проблемой для приемника,  если слово SYNC достаточно длинное. Разрыв равен времени несколько битов (в зависимости от скорости передачи данных Data Rate).

Результаты практической проверки sniff-режима – оценка времени детектирования RSSI и среднее потребление тока

В таблицах 24 и 25 приведены данные, полученные в результате подробных измерений, выполненных на отладочной плате S2-LP при различных конфигурациях радиоканала. Время обнаружения RSSI и энергопотребление были измерены при разном напряжении.

Таблица 24. Результаты измерений при периоде пробуждения 10 мс (начало)

Настройки: S2-LP в режиме LPM. Режим периодического прослушивания канала с периодом пробуждения 10 мс
Скорость передачи данных (Data Rate), кбайт/с Девиация (Freq Dev), кГц Канальный фильтр (Channel filter), кГц Экспонента (Exponent) Статическая чувствительность (Static sensitivity), дБм Порог RSSI на 3 дБ выше чувствительности (RSSI threshold +3 dB above sensitivity), дБм Минимальное время для измерения RSSI (Minimum Sniff time for RSSI evaluation FAST RX TERMINATION), измеренное, мкС
1,2 4 33 4 ‐116 ‐113 642
4,8 20 65 3 ‐115,5 ‐112 336
38,4 30 130 2 ‐108,5 ‐105 168
100 50 260 1 ‐106 ‐103 92

Таблица 24. Результаты измерений при периоде пробуждения 10 мс (окончание)

VBAT 3.6 В VBAT 3 В VBAT 1.8 В
Продолжительность окна приема в режиме Sniff, измеренная без функции обнаружения несущей (RX active windows duration in Sniff mode measured without carrier detection), мс Средний ток потребления (Average current), мкА Продолжительность окна приема в режимеSniff, измеренная без функции обнаружения несущей (RX active windows duration in Sniff mode measured without carrier detection), мс Средний ток потребления (Average current), мкА Продолжительность окна приема в режиме Sniff, измеренное без функции обнаружения несущей (RX active windows duration in Sniff mode measured without carrier detection), мс Средний ток потребления (Average current), мкА
0,878 542 0,885 586 0,973 880
0,578 357 0,59 376 0,642 551
0,408 233 0,42 238 0,5 357
0,332 175 0,343 197 0,422 288

На рисунке 11 представлен скриншот результатов измерения с помощью анализатора Agilent DC power analyzer при питании S2-LP напряжением 3,6 В, битовой скорости (Data Rate) 4,8 кбайт/с, девиации частоты (Freq Dev) 20 кГц и полосе пропускания приемника (Channel Filter) 65 кГц.

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

Рис. 10. Скриншот результатов измерения с помощью анализатора Agilent DC power analyzer

Рис. 10. Скриншот результатов измерения с помощью анализатора Agilent DC power analyzer

Таблица 25. Результаты измерений при периоде пробуждения 1 с (начало)

Настройки: S2-LP в режиме LPM. Режим периодического прослушивания канала с периодом пробуждения 10 мс
Скорость передачи данных (Data Rate), бит/с Девиация (Freq Dev), кГц Канальный фильтр (Channel filter), кГц Экспонента (Exponent) Статическая чувствительность (Static sensitivity), дБм Порог RSSI на 3 дБ выше чувствительности (RSSI threshold +3 dB above sensitivity), дБм Минимальное время для измерения RSSI (Minimum Sniff time for RSSI evaluation FAST RX TERMINATION), мкс
1,2 4 32 4 ‐116 ‐113 642
4,8 20 65 3 ‐115,5 ‐112 336
38,4 30 130 2 ‐108,5 ‐105 168
100 50 260 1 ‐106 ‐103 92

Таблица 25. Результаты измерений при периоде пробуждения 1 с (окончание)

VBAT 3.6V VBAT 3V VBAT 1.8V
Продолжительность окна приема в режиме Sniff, измеренная без функции обнаружения несущей (RX active windows durationin Sniff mode measured without carrier detection), мс Средний ток потребления (Average current), мкА Продолжительность окна приема в режиме Sniff, измеренная без функции обнаружения несущей (RX active windows durationin Sniff mode measured without carrier detection), мс Средний ток потребления (Average current), мкА Продолжительность окна приема в режиме Sniff, измеренная без функции обнаружения несущей (RX active windows duration in Sniff mode measured without carrier detection), мс Средний ток потребления (Average current), мкА
0,878 6,096 0,885 6,706 0,973 9,38
0,578 4,079 0,59 4,482 0,642 5,88
0,408 2,929 0,42 3,162 0,5 4,28
0,332 2,416 0,343 2,586 0,422 3,31

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

Оригинал

Перевел Олег Пушкарев по заказу АО КОМПЭЛ

•••

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

О компании ST Microelectronics

Компания STMicroelectronics является №1 производителем электроники в Европе. Компоненты ST широко представлены в окружающих нас потребительских товарах – от iPhone до автомобилей разных марок. Лидеры индустриального рынка выбирают компоненты ST за их надежность и выдающиеся технические параметры. В компании ST работает 48 000 сотрудников в 35 странах. Производственные мощности расположены в 12 странах мира. Более 11 тысяч сотрудников заняты исследованиями и разработками – инновационное лидерство ...читать далее

Товары
Наименование
S2-LPQTR (ST)
S2-LPTXQTR (ST)
BALF-SPI2-01D3 (ST)
BALF-SPI2-02D3 (ST)
SPIRIT1QTR (ST)
SPIRIT1QTR_0 (ST)