BLE стек от TI. Разработка пользовательских приложений

  • Tutorial
Привет, Хабр!

После написания предыдущего материала про BLE розетку я познакомился со многими
людьми, которыми интересна тема использования BLE в собственных разработках, но есть определенные
сложности в использовании С-программирования с BLE стеком для СС2541. Использование
внутреннего контроллера дает много преимуществ, в частности: прошивка по воздуху, экономия
на внешнем контроллере, сокращение числа точек пайки…
Я решил разбить материал на две части. Первая – это подготовка к работе, программирование и
отладка. Вторая – создание собственного BLE профиля.


1. Подготовка к работе.

Для разработки приложений для СС2541 маст-хэв-набор это:
CC-debugger – внутрисхемный отладчик для 8051 чипов TI;
CC2450 USB dongle — для того чтобы быстро и просто проверять характеристики BLE профилей на
экране компьютера;
— ну и собственно какая-нибудь плата с чипом СС2541.
Идеально эти вещи сочетаются в отладочном наборе от TI – CC2541 mini DK. Рекомендую к приобретению.


Из софта нам понадобится:

собственно BLE стек;
— всегда должны быть под рукой: Smart RF Studio, Flash Programmer, Packet Sniffer;
— для отладки: BLE device monitor;
IAR для 8051 контроллеров в версии от 8.2 (можно взять с бесплатной 30и-дневной
лицензией).

Без лишних описаний, пройдемся по папкам стека, которые так или иначе потребуются для
работы.
— accessorize – содержит отладочную утилиту BTool, драйверы USB донгла и откомпилированные
образы готовых устройств;
— components – библиотеки (ОС, периферия и BLE);
— documents – папка создает видимость документации на все компоненты и модули;
— projects – примеры проектов.

2. IAR IDE, отладка программ.

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

— просто уменьшить количество виртуальных регистров с 16 до 8, и делать это для каждого
проекта, надеясь, что он соберется;
— исправить файл конфигурации линковщика (в простом случае это ti_51ew_cc2540b.xcl). В нем
нужно:
1) открыть этот файл (он лежит в папке \Projects\ble\common\cc2540\) в текстовом редакторе;
2) найти строку -Z(DATA)VREG+_NR_OF_VIRTUAL_REGISTERS=08-7F;
3) заменить ее на -Z(DATA)VREG=08-7F;
4) наслаждаться проектами, которые начнут собираться.

Подключив отладочную плату к CC-debugger, запустим приложение на ней (Project- Download and
Debug, Debug — Go).

Теперь при нажатии на правую кнопку брелок переходит в режим Advertising, то есть к нему
можно подключиться. Воткнем в USB донгл на базе СС2540. У нас есть два монитора для работы
с этим донглом: удобный BLE device monitor и хардкорный BTool (установочник последнего – в
комплекте со стеком). Воспользуемся BLE Device monitor.



Наиболее важные поля в данном окне:
• поле Handle – порядковый номер записи в таблице сервисов BLE устройства,
• поле Type – указывает тип записи (определяет запись сервиса, характеристику сервиса,
конфигурацию характеристики или же саму характеристику (ее UUID)),
• ну и третье важное поле – поле Value. В случае записи определения
сервиса данное поле собственно говорит UUID сервиса.
Документированные сервисы приведены здесь. Нам же, при условии что мы не являемся членами Bluetooth SIG, 16-
битные адреса сервисов использовать нельзя. Нужно использовать 128-битные UUID. Но об этом
позже.
Поле Value в записи декларации характеристики содержит:
-UUID характеристики (например,
0xFFF3 в примере),
-номер записи в таблице устройства (иначе говоря, handle – 0x002B в нашем
случае)
-порядок доступа к характеристике, определяемый битовой маской (в простейшем
случае – 0x02 – разрешение чтения, 0x08- разрешение записи, 0x10 – разрешение оповещения).

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

Для отладки крайне полезна также утилита Packet Sniffer. Не буду рассказывать подробно,
только скажу, что для работы со снифером пакетов потребуется перепрошить USB донгл прошивкой
sniffer_fw_cc2540_usb.hex, лежащей где-то в недрах папки установки снифера (кстати, я искренне надеюсь, что вам не придется отлаживать приложения на столь низком уровне).

Так выглядят посылки iBeacon в снифере эфира:


3. Механизм функционирования периферийного BLE устройства

Для начала разберемся, как работает периферийное устройство в примере SimpleBlePerepherial.
Основная логика работы программы сосредоточена в файле SimpleBLEPerepherial.c, при этом
функция main расположена в файле SimpleBLEPerepherial_Main.c, но его править, как правило,
смысла нет, поскольку в нем инициализируется периферия и OSAL (некоторое подобие
операционной системы). Используя BLE стек, мы получаем доступ только к части процессорного
времени (с наименьшим приоритетом). Это определяет, в частности, стиль программирования:
большое количество функций обратного вызова, отсутствие бесконечных циклов в теле
программы, максимальное использование прерываний…

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

Дальше важно обратить внимание на кэлбэк, вызываемый стеком, определяющий параметры
соединения, – peripheralStateNotificationCB. Функция всегда позволяет понимать, установлено ли
соединение с центральным устройством или же нет.

Любые действия (управление выводами, чтение показателей датчиков, и т.д.) настоятельно
рекомендую выполнять в периодической задаче. Для этого понадобится функция из библиотеки
OSAL — osal_start_timerEx(), которой помимо идентификатора пользовательской задачи нужно
передать время, через которое произойдет системное прерывание, и битовую маску события,
которое при возникновении обрабатывается в кэлбэке SimpleBLEPeripheral_ProcessEvent().

4. Поддержка OAD

Теперь рассмотрим функцию OAD – обновление прошивки по воздуху. Сразу отмечу, что
такая функция доступна только в чипах с памятью 256 кБ. Максимально подробно механизм
создания приложений для OAD описан в документе, однако пару моментов прояснить стоит. Во-первых, память на чипе
выделяется для двух образов программы: текущей (исполняемой) и области для программы,
принимаемой по воздуху. Во-вторых, на чип должен быть установлен бутлоадер – загрузчик,
который при старте устройства будет выбирать, какой из образов нужно запустить.
Попробуем создать приложение с возможностью обновления прошивки по воздуху. Первым
делом прошьем чип прошивкой бутлоадера. Для этого скомпилируем проект BIM, находящийся
в папке \Projects\ble\util\BIM, и загрузим в контроллер получившийся образ посредством
Smart RF Flash Programmer (действие Erase, Programm and Verify). Дальше соберем образ, с
которым наше устройство будет стартовать: соберем проект SimpleBLEPerepherial в конфигурации
СС2541-OAD-ImgA (кстати, файл разметки памяти, который мы поправили в самом начале,
в этой сборке изменен, так что придется внести аналогичные изменения еще и в файл
cc254x_f256_imgA.xcl). Дошьем этот образ через Smart RF Flash Programmer (действие Append and
Verify), на этом шаге самое важное – не стереть предпрошитый бутлоадер. Теперь, перезагрузив
чип и подключившись к нему через BLE device monitor, увидим поддержку OAD.



Теперь скомпилируем образ для загрузки по воздуху и загрузим его на чип. Для начала
скомпилируем конфигурацию СС2541-OAD-ImgB. Далее в BLE Device Monitor перейдем во
вкладку File-programm. Убедимся, что чип работает на образе «А», выберем .bin файл в папке
выходных файлов конфигурации «ImgB» и обновим прошивку.

Презагрузим чип, переподключимся и убедимся, что чип работает с образом «B».



Стало быть, прошивка была обновлена и запущена новая версия. Теперь можно выделить для одного из секторов больший объем памяти, но это уже совершенно другая история…

На этом про стек все. В следующей части создадим свой пользовательский BLE профиль. Надеюсь, что для старта работы с СС2541 статья будет полезна.
  • +9
  • 24,8k
  • 6

Intellectro

19,00

Компания

Поделиться публикацией

Похожие публикации

Комментарии 6
    0
    Большое спасибо за статью, только недавно искал подобный материал.
    А искал потому что пара китайских биконов на СС2541 практически одновременно, на ровном месте, потеряли возможность конфигурироваться. Зайти в сервис, где раньше были настройки можно, а вот считать/записать значения не получается, возвращает not permitted.
    Не можете предположить от чего такое могло произойти? Проблема со чтением/записью eeprom? Сам адвертайзинг работает с когда-то задаными параметрами.
      +1
      Да, честно говоря сложно сказать… Была бы прошивка — разобрались бы в миг. Посмотрите параметры конфигурации переменной — права доступа к переменной в частности. Есть переменные которые не позволяют быть прочитанными/записанными, если устройства не спарены или не произведена аутентификация — чем черт не шутит — может у китайцев была переменная типа «allow only encrypted reading»…
        0
        Китайцы не хотят давать прошивку, даже скомпилированную. Вот поэтому и думал прошить их собственной, примеров в принципе хватает, но тому кто раньше дружил только с Ардуиной оказалось все не так просто, плюс нужна платная IAR.
        А про чип от Nordic nRF51822 сможете что-то рассказать? Проще/сложнее/так же?
          0
          Я не думаю, что есть простые пути, честно говоря. С Нордиком не работал, так что единственное что могу утверждать — что нордик немного дешевле.
      0
      Спасибо за полезную статью. Меня интересует вопрос, можно ли обновлять прошивку по воздуху со смартфона на android? Есть ли какие-то официальные приложения или надо писать самому?
        +1
        Добрый день! Да, обновить прошивку с андройда можно. Для этого использую BLE Device Monitor проблема только в том, что например на Xperia E1 эта фича не работает, зато на Galaxy и Note все проходит прекрасно. Ну и на айфонах проблем с OAD нет.

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

      Самое читаемое