Радиомодули для беспроводной передачи данных. Часть 3.
Автор: Сергей Безруков (aka Ser60), sergeilb60@mail.ru
Опубликовано 22.10.2014.
Создано при помощи КотоРед.
Обратимся теперь к радиомодулям на основе приёмо-передатчиков фирмы Texas Instruments для субгигагерцового диапазона. Продукцию фирмы для этого диапазона можно условно разделить на 4 следующих класса. К первому классу относятся микросхемы приёмников и передатчиков, основанных на чипе CC1101 и его бюджетных вариантах. Ко второму – трансиверы CC112x с улучшенными характеристиками. К третьему – высокопроизводительные трансиверы CC120x, и к четвёртому – трансиверы со встроенными микроконтроллерами с Flash памятью и развитой периферией, в которые можно загрузить программу пользователя. Я опустил старые микросхемы CC10xx с гораздо более ограниченным функционалом, вместо которых фирма сегодня рекомендует использовать CC1101.
В статье рассмотрены вопросы применения микросхем только из первых двух классов. Отмечу, что большинство трансиверов первоначально разработаны Норвежской фирмой Chipcon AS, которая в 2006 году вошла в состав TI. Поэтому до недавнего прошлого контроллер, управляющий радиотрактом этих микросхем, был выполнен по архитектуре 8051, что не типично для линейки микроконтроллеров, производимых TI. Это относилось и к трансиверам с загрузкой программы пользователя CC1110/CC1111. Относительно недавно TI выпустила новую линейку трансиверов четвёртого классa CC430F513x/CC430F613x с интегрированным микроконтроллером серии MSP430. Однако, и в них использован радиотракт из полулярной и удачно разработанной ранее базовой модели CC1101.
Разработка программного обеспечения для всех примеров в статье производилась для микроконтроллера семейства Kinetis фирмы Freescale с архитектурой ARM Cortex-M0+. Однако, как и ранее, основное внимание будет уделено аспектам работы с радиомодулями без привязки к конкретной модели микроконтроллера. Тем не менее, я уже рассказывал о подобных МК в [1]. Кроме того, если Вы когда-либо работали с 8-битными МК фирмы Freescale, например с семейством HCS08, Вам будет гораздо легче при необходимости детально разобраться в прилагаемых программах, поскольку многие системные и периферийные модули в 8- и 32-битных МК фирмы во многом похожи. Рассматриваемые здесь радиомодули, как и в предыдущих статьях, имеют богатый функционал, полное описание которого с примерами имело-бы объём книги. Поэтому и в этой вводной статье мы ограничимся лишь односторонней передачей и приёмом короткого пакета данных. Вместо номера пакета в предыдущих статьях я решил передавать более осмысленные данные, именно значение температуры, получаемое с датчика TMP112A, подключённому к МК по интерфейсу I2C. Сопряжение МК со всеми радиомодулями в статье выполнено по следующей схеме.
Передача пакетов модулем на CC1150
Передатчик CC1150 является самым простым в использовании и принадлежит к первому классу нашей классификации. Он выпускается в корпусе с всего 16 выводами с шагом 0.65 мм, поддерживает модуляцию типов (G)FSK, MSK, OOK и bit rate до 500 kbps, и обеспечивает мощность в нагрузке до +10 dBm. Для уменьшения числа пассивных компонентов я использовал интегрированный балун фирмы Johanson Technology [4], разработанный специально для CC1101 и его производных. Такие балуны выпускаются фирмой для рабочих частот начиная с 430 мгц, я применил балун для диапазона 915 мгц.
Схема собрана на плате размером 15×18 мм и толщиной 0.8 мм, фольга на обратной стороне платы, как и ранее, используется в качестве земли. Антенной служит отрезок одножильного провода длиной 82 мм. Все детали на плате типоразмера 0402 кроме C7 (0603). Кристалл в корпусе размером 3.2×2.5 мм и нагрузочной емкостью 10 пФ. Микросхема требует распайки подложки на землю. Изображения увеличиваются при кликании.
![]() |
![]() |
Связь передатчика с микроконтроллером производится по интерфейсу SPI на частотах до 9 мгц. Вывод GDO0 чипа можно запрограммировать на одну из 11 функций [2]. В нашем случае он сконфигурирован на индикацию конца передачи пакета падающим уровнем напряжения. Микросхемы фирмы из первого класса были разработаны задолго до Si446x, рассмотренных ранее. Отчасти поэтому, в них всё проще, включая гораздо меньшее число опций и настроек. Вместо API функций, как у Si446x, конфигурация чипа производится записью данных в регистры. Передатчик CC1150 по сути состоит только из передающей части трансивера CC1101, и имеет всего 29 регистров конфигурации. Записи и чтению регистров предшествует посылка в чип байта заголовка, в котором определяется адрес регистра, операция с ним (запись или чтение), и тип операции – работа с единичным регистром, или с блоком регистров, расположенных в последовательных адресах (burst access). В последнем случае производится автоматическая инкрементация адреса регистров. Помимо записи конфигурации чипа в регистры, в него можно посылать однобайтовые команды для перевода передатчика в определённое состояние. Всего поддерживается 9 комманд.
Для программной настройки чипа фирма предлагает систему SmartRF Studio, доступную для свободной загрузки с вебсайта фирмы. Помимо параметров явно заданных пользователем система определяет оптимальные значения других параметров, из которых не все оговорены в ДШ (например, содержимое регистров TEST). Studio может работать как с подсоединённым через CC-debugger чипом или демо-платой, так и без них. Ниже показано окно Studio для настройки передатчика на те-же параметры передачи, что и в предыдущих статьях (частота 903 мгц, модуляция 2-FSK, девиация 5.15 кгц, burst rate 1.2 kpbs) и мощность +10 dBm.
Параметры для загрузки в регистры передатчика показаны в правой части окна. Их можно экспортировать в разные форматы нажатием на кнопку Register export. В открывшемся окне сначала нажимаем на кнопку Select в правой части и в открывшемся маленьком окне выбираем все регистры, как показано ниже. Если при этом выбрать HTML формат в левой части окна Register Export, получим содержимое регистров вместе с их адресами в передатчике и комментариями.
Как я отмечал, CC1150 основан на чипе CC1101, и содержимое всех его регистров совместимо с таковыми для CC1101. Однако, у последнего регистров больше (46 против 29), и некоторые регистры CC1101 не имеют смысла для CC1150. Это приводит к тому, что не все регистры CC1150 находятся в последовательных адресах и их нельзя загрузить в течении одной SPI сессии, используя опцию автоинкремента адреса. Для загрузки единичного регистра необходимо сначала передать байт заголовка, содержащий адрес регистра с последующим значением регистра. Например, для загрузки регистра IOCFG1 (см. таблицу выше) в передатчик следует послать байты 0х01 0х2Е, где 0х01 – адрес регистра.
Однако, можно поступить и иначе, особенно если в качестве приёмника будет использован CC1101. Для этого сначала генерируем в Studio конфигурацию для CC1101 с теми-же параметрами передачи (частота и пр.), и заменяем в ней значения последних 3-х регистров TEST2, TEST1, TEST0 значениями, рекомендованными Studio для CC1150. Получим массив из 46 регистров, находящихся в последовательных адресах, который можно будет загрузить в CC1150 в течении одной SPI сессии, используя burst access. Для этого сначала загружаем в передатчик байт заголовка 0х40, и потом все 46 байт конфигурации. Содержимое регистров CC1101, расположенных по адресам, не задействованным в CC1150, будет проигнорировано последним и не повлияет на его работу. Таким образом, можно будет в программах приёмника и передатчика использовать практически одну и ту же конфигурацию.
Для завершения конфигурировании передатчика осталось выставить его выходную мощность. В случае +10 dBm следует послать байт 0хC4 по адресу 0x3E. Наконец, последний шаг – выбор режима передатчика между посылками пакетов. Минимальное токопотребление передатчика в 200 нА достигается в режиме SLEEP, однако при этом (в отличии от CC1101) вся память передатчика обесточивается и он, как и Si4012, забывает все свои установки. Следующим по токопотреблению (220 мкА) является режим XOFF, в котором сохраняется содержимое всех регистров, но кварцевый генератор выключен. Именно такой режим используеся в моей программе, что достигается посылкой в CC1150 байтов 0x3E, 0xC4, 0x32. Первые 2 из них устанавливают выходную мощность, а последний по завершении конфигурирования переводит чип в режим XOFF.
Режим XOFF является также начальным состоянием, в котором передатчик находится сразу после подачи питания. Выход из этого состояния в активный режим начинается по падению уровня напряжения на выводе CS. Однако, кварцевому генератору нужно некоторое время для активизации. Готовность генератора индицируется падением напряжения на выводе SO, до которого не следует посылать в чип никакие команды – его SPI интерфейс не готов и команды будут проигнорированы. Время раскрутки кварцевого генератора зависит от параметров кристалла и в моём случае составляет около 260 мксек. В программе я просто вставил задержку на 260 мксек каждый раз перед посылкой пакета.
Итак, мы разобрались с конфигурацией чипа, теперь самое время поговорить о структуре пакета. Напомню, что в предыдущих статьях пакет состоял из 6 байт. Первый байт – длина информационной части пакета (0х05), второй – порядковый номер пакета, а 4 оставшиеся – ASCII коды тестовой строки “ABCD”. Сейчас вместо номера пакета мы передадим значение температуры, измеренное сенсором TMP112A в нашей схеме. Структура пакета показана ниже.
Как следует из русунка, структура пакета CC1150 во многом аналогична таковой для Si4461. Пакет также начинается с битов преамбулы и 2-4 байтов синхрослова. После них следует байт длины пакета (для пакетов переменной длины) и адрес приёмника (по желанию для автоматической фильтрации пакетов приёмником; в нашем случае адрес не передаётся). Затем идут байты информационной части. Пакет завершается байтами контрольной суммы, автоматически вычисляемой с помощью полинома CRC16 и добавляемой к пакету, если это разрешено конфигурацией. В передатчике имеется FIFO объёмом 64 байт, куда следует загрузить передаваемый пакет, начиная с поля длины. Биты преамбулы и синхрослова автоматически добавляются к передаваемому пакету из регистров конфигурации. Для загрузки нашего пакета в FIFO следует послать в CC1150 последовательность байтов 0x7F 0x05 0x16 0x41 0x42 0x43 0x44. Здесь 0х7F – адрес FIFO и запрос на burst access, а 0х16 – значение температуры от датчика TMP112A.
Начало передачи пакета осуществляется подачей одно-байтовой команды STX (код 0х35). В нашей конфигурации после передачи синхрослова напряжение на выводе GDO0 поднимается от 0 до напряжения питания, а после передачи всего пакета (включая контрольную сумму, если разрешено) падает обратно до 0. Таким образом, окончание передачи пакета можно определить, разрешив прерывание МК по падающему уровню сигнала на выводе GDO0, а сам МК отправить в сон на всё время передачи пакета.
Прилагаемая программа после конфигурирования передатчика, как описано выше, входит в основной цикл с пробуждением каждую секунду от таймера. По пробуждении считывается значение температуры из сенсора, формируется пакет в RAM МК, куда включется измеренная температура. Затем пакет загружается в FIFO передатчика функцией Send_Package() из файла main.s. После загрузки пакета в CC1150 подаётся команда начала передачи STX. По окончании передачи передатчик вводится в режим XOFF до следующего пробуждения. Токопотребление схемы определяется потреблением передатчика в режиме XOFF и составляет около 220 мкА. Его можно сократить на 3 порядка, если после окончания передачи переводить чип в состояние SLEEP командой SPWD (код 0х39) и каждый раз после пробуждения передатчика заново загружать в него конфигурацию. Потребление остальной части схемы в паузах между передачами не превышает 2 мкА.
Тестовая схема была собрана на безпаячной макетке. МК и сенсор TМP112A смонтированы на индивидуальных маленьких платах (сенсор – на зелёной). В качестве антенны передатчика использовалась укороченная Whip-антенна ANT-916-JJB-ST фирмы Linx диаметром 7 мм и высотой активной части 9 мм. Как оказалось, с этой антенной обеспечивается практически такая-же дальность связи, как и со штыревой проволочной (см. подробности ниже). Приём производился на модуль на Si4461 из второй части статьи с отображением температуры на ЖКИ и без изменения программы МК.
Отмечу, что CC1150 стоит особняком среди бюджетных изделий первого класса из-за корпуса и особенностей режима сна. Остальные бюджетные аналоги CC1101 этого класса (приёмник CC113L, передатчик CC115L, и трансивер CC110L) выпускаются в корпусах QFN20 и совместимы друг с другом и CC1101 по выводам корпуса, конфигурации регистров, структуре пакетов и пр., но не поддерживают некоторые функции CC1101 (например, FEC – Forward Error Correction). В частности, все они сохраняют значения своих регистров в режиме сна с потреблением около 200 нА. Более того, для всех них подходит балун, использованный нами выше с CC1150. Работа с ними полностью аналогична таковой с CC1101, я о ней уже рассказывал в [3].
Передача пакетов модулем на CC1101
Схема модуля почень похожа на CC1150. В ней использован такой-же балун и кварцевый резонатор.
Модуль собран на плате размером 15×18 мм с фольгой на обратной стороне, используемой в качестве земли. В переходные отверстия (via) диаметром 0.3 мм вставлены отрезки провода, распаянные с обох сторон. Антенна также проволочная. Вывод подложки микросхемы необходимо соединить с землёй.
![]() |
![]() |
Для интерфейса с МК помимо линий SPI задействованы выводы GDO0 и GDO2. Первый из них, как и в CC1150, сконфигурирован для индикации окончания передачи пакета, а второй – для индикации готовности передатчика при выходе из сна. Вся схема потребляет около 2 мкА в промежутках между передачей пакетов.
Конфигурация CC1101 производится с помошью SmartRF Studio за несколько кликов. При запуске Studio выбираем CC1101 в окне, показанном ниже. Далее, во вновь открывшемся окне конфигурации устанавливаем параметры передачи, например, такие-же как и ранее для CC1150. Вычисленные Studio значения конфигурационных регистров (всего 46 значений) загружаем в передатчик по интерфейсу SPI. Так как значения расположены в регистрах с последовательным набором адресов, для загрузки можно использовать burst access, начиная с адреса 0. Именно, сначала засылаем в CC1101 байт 0х40 и следом за ним все 46 байтов конфигурации.
Данные в регистрах с адресами 0х00 и 0х02 служат для конфигурации функций выводов GDO2 и GDO0, соответственно. В нашем случае, вместо задержки на 260 мкс при пробуждении чипа можно ожидать установки 0 на выводе GDO2 в качестве сигнала готовности чипа. Вместо этого, можно также ожидать наличие 0 на выводе SO/GDO1 после установки CS в 0 каждый раз при активизации интерфейса SPI и до начала коммуникации (первого импульса на линии SCLK). При работающем в номинальном режиме кварцевом генераторе трансмиттера напряжение на выводе SO/GDO1 сразу падает до нуля при сбросе CS в 0. В противном случае оно сразу поднимается до напряжения питания. При задействовании вывода SO/GDO1 для ожидания готовности чипа, вывод GDO2 можно не использовать вообще.
После установки значений регистров конфигурации следует задать выходную мощность передатчика как описано выше для CC1150. Процессы передачи пакета для CC1101 и перевод его в различные состояния также полностью идентичны таковым для CC1150.
Для тестирования передатчиков CC1150 и CC1101 на дальность связи я устанавливал их на открытой веранде дома, и отходил с приёмником на модуле CC1101, подсоединённым через CC-debugger к SmartRF Studio, в ту-же точку на расстояние около 370 м от дома, как и в случае с Si4012 из первой части статьи. Уровень сигнала, показываемый Studio в точке приёма был в пределах -90 … -95 dBm, приём пакетов был уверенным. В моей ранней статье [3] рассказано о готовых модулях на чипах из первого класса, производимых фирмой Anaren.
Приём пакетов модулем на CC1101
Для приёма пакетов в регистры CC1101 можно загрузить такую-же конфигурацию, что использовалась выше для передачи. После её загрузки приём начинается с посылки в CC1101 команды SRX (код 0x34). Далее, при данной конфигурации, следует ожидать падающего уровня сигнала на выводе GD00. Как только это произойдёт, то либо пакет принят и загружен в FIFO приёмника, либо произошла ошибка, которую можно определить по байту состояния чипа. В случае успешного приёма длина пакета (при передаче пакетов переменной длины – наш случай) доступна из регистра RXBYTES по адресу 0x3B. Для его чтения следует послать в CC1101 байт заголовка 0хFB и далее прочитать 1 байт длины.
После определения объёма информации, доступной в FIFO приёмника, для её чтения следует послать в в CC1101 байт заголовка 0хFF и принять через интерфейс SPI число байт, соответствующее длине пакета. В нашей конфигурации после приёма пакета CC1101 автоматически переходит в режим IDLE. Поэтому для приёма следующего пакета в него опять следует послать команду SRX.
В прилагаемой программе приём пакетов производится в основном цикле программы. В начале цикла в CC1101 посылается команда SRX и ожидается прерывание по падающему уровню на выводе GDO0. Как только это произойдёт, вызывается функция Read_Package, которая работает в соответствии с вышеизложенным. Содержимое принятого пакета можно посмотреть отладчиком в буфере SPIbuf в RAM МК.
Радиомодули на основе CC1125
К этому классу в нашей классификации относятся передатчик CC1175, трансивер CC1125, и его бюджетные варианты CC1120 и CC1121. Все микросхемы выпускаются в корпусах QFN32 и совместимы по выводам. Передающая часть микросхем обеспечивает мощность в нагрузке до +16 dBm (40 мВт), что почти в 4 раза выше, чем у CC1101. Трансиверы предназначены для работы в узкополосных системах цифровой связи с минимальным по частоте расстоянием между каналами от 6.25 кгц у CC1175 и CC1125, от 12.5 кгц у CC1120 и от 50 кгц у CC1121. Приёмные части трансиверов обладают рекордными показателями по избирательности и чувствительности. Максимальную чувствительность при малой скорости передачи (300 bps) обеспечивает наиболее дорогая модель трансивера CC1125 (-129 dBm при согласовании с 50 Ом антенной, что соответствует 0.08 мкВ) . С такими параметрами следует ожидать значительно большую дальность устойчивой связи. Фирмой Johanson Technology также выпускаются балуны для этих микросхем [5], которые, однако, отличаются от балунов для микросхем из первого класса. Балун и выходной фильтр передатчика можно собрать и на дискретных компонентах по схеме из ДШ.
В модуле применены детали типоразмера 0402 кроме C20 (0603). Кристал в корпусе размера 2.0×1.6 мм и нагрузочной ёмкостью 10 пФ. Фольга на обратной стороне платы (размер платы 19×17 мм) служит в качестве общего провода. Через проходные отверстия (via) земля на обратной стороне платы соединена с островками земли на верхней стороне. Для соединения подложки чипа с обратной стороной платы под ним просверлено отверстие и после распайки чипа на плату залито припоем. Поначалу я вывел вывод RESET передатчика на разъём, но впоследствии это оказалось необязательно и я установил подтягивающий резистор R2 (который необходим) на плату. Вывод GDO3 передатчика на разъём не выведен и в данном проекте не используется. В качестве антенны применена та-же Whip-антенна, что и раньше: модель ANT-916-JJB-ST фирмы Linx. Такая-же антенна установлена и на втором экземпляре модуля, который я собрал для проверки дальности связи.
![]() |
![]() |
Работа с модулями из второго класса во многом аналогична работе с CC1101. Однако, у них имеется больше регистров конфигурации. Адресное пространство регистров разбито на 2 части. К первой части относятся регистры с адресами 0х00 – 0х2Е, и доступ к ним производится также как и у CC1101. Ко второй части относятся регистры из расширенного адресного пространства. Для доступа к ним следует предварительно послать в чип байт заголовка 0х2F с выставленными битами операции (чтение/запись) и автоинкрементации адреса для burst access (по желанию). После этого байта следует адрес регистра в расширенном пространстве и далее значение регистра (при записи). SmartRF Studio делает конфигурацию регистров очень лёгкой и основанной на интуитивном графическом интерфейсе с пользователем. Единственное, на что следует обратить внимание – это какие регистры сохраняются в режиме сна.
В CC112x/CC1175 имеется несколько новых опций. Например, введена поддержка автоматической отправки пакета-подтверждения при успешном приёме пакетов (по желанию). Подтверждающий пакет должен быть предварительно записан в FIFO передатчика. Кроме того, введена поддержка повторной посылки пакета путём переустановки указателей на пакет в FIFO. Кстати, размер каждой FIFO у приёмной и передающей частей увеличен до 128 байт. Также улучшена система автопробуждений при приёме пакетов, имеется генератор случайных чисел, дополнительно рандомизируемый шумом приёмника, и т.д., и т.п. Однако, перечисленные опции очень полезны для реализации более сложных сетевых протоколов, и работа с ними выходит за рамки этой вводной статьи.
Для проверки работы модулей, каждый из них был подключён к SmartRF Studio через индивидуальный CC-debugger. Один работающий экземпляр Studio может поддерживать несколько CC-debugger-ов и позволяет независимо конфигурировать подсоединённые к ним модули. У модуля на верхней монтажке вывод RESET подтянут резистором к напряжению питания и не подсоединён к Studio. У нижнего модуля все его выводы честно подсоединены к Studio, согласно [6]. Неподсоединённый к Studio вывод RESET на функционирование модуля не влияет. Сначала модули были расположены в разных углах стола, чтобы убедиться в правильности их конфигурации для совместной работы. Один из модулей был сконфигурирован на приём, другой – на передачу. Зелёный светодиод у CC-debugger символизирует о распознавании модуля в Studio.
После отладки на столе модули были подключены к разным лаптопам и оба они вынесены на улицу. Дальность связи тестировалась при установке выходной мощности передатчика +15 dBm и остальными параметрами как и ранеее, и оказалась весьма значительной. Согласно Google Maps она в условиях показанных ниже получилась около 1.1 км. Значения RSSI в точке приёма, отмеченной красным маркером, согласно Studio, находилось в районе -121 dBm.
В заключении несколько слов о питании радиомодулей фирмы. Как следует из ДШ, их диапазон питающих напряжений соответствует таковому для большинства МК (1.8 – 3.6 В). Понижение питающего напряжения приводит в повышению потребляемого тока. Однако, из-за наличия внутреннего LDO в радио-микросхемах, также уменьшается рассеивание мощности на LDO. Поэтому в активном режиме рекомендуется питать модули как можно более низким напряжением. Экономия энергии при этом получается весьма ощутимой [7].
Часто напряжение питания устройства ограничено снизу другими компонентами в схеме. Например многие сенсоры требуют питающего напряжения не менее 2.1 – 2.4 В. Уменьшить напряжение питания, скажем, с 3.3 В до 2.1 В можно с помошью серии высокоэффективных DC-DC конвертеров TPS6273x (х = 0,2,3), специально разработанных для использования с приёмо-передающими устройствами (применение внешних линейных стабилизаторов никакого выигрыша по энергетике не даст).
Конвертеры работают на частоте до 3 мгц, поэтому размеры дросселя получаются очень маленькими. Я ставил многослойные дроссели типоразмера 0402 в передатчиках с потреблением до 40 мА. Помех приёму при их работе не наблюдалось. Конвертер не обязан работать постоянно. При заземлении управляющего входа с помощью МК конвертер выключается и напряжение батареи поступает на его выход без изменения. При этом собственное потребление конвертера снижается до 30 нА. Включать конвертер следует в основном лишь тогда, когда радиомодуль переводится в режим приёма или передачи.
Литература
1. О применении микроконтроллеров семейства Kinetis в микромощных устройствах.
2. GDO Pin Usage, DN506, Texas Instruments.
3. Радиоканал передачи данных на модулях A110LR09A.
4. Johanson Technology Matched Balun Filters, DN025, Texas Instruments.
5. CC112x IPC 868/915MHz 2 layer Reference Design, SWRR106, Texas Instruments.
6. CC Debugger. User’s Guide. SWRU197H, Texas Instruments.
7. Using a DC-DC Converter to Reduce Power (Current) Consumption In CC430 Systems, SLAA500, Texas Instruments.
Файлы:
Sorry, the comment form is closed at this time.