BLE стек от TI. Разработка пользовательских приложений
Привет, Хабр! После написания предыдущего материала про 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 andDebug, 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 — 0×002B в нашемслучае)-порядок доступа к характеристике, определяемый битовой маской (в простейшемслучае — 0×02 — разрешение чтения, 0×08- разрешение записи, 0×10 — разрешение оповещения).
Кроме того, из этого скрина важно почерпнуть, что пользовательская переменная для чтенияили записи определяется тремя записями в таблице устройства (определение характеристики, значение характеристики, описание характеристики — первое и второе поля обязательны, объявление третьего- правило хорошего тона), апеременная, которая, изменяясь, уведомляет приложение, помимо этого должна иметьдополнительную характеристику-конфигуратор, включающую или отключающую уведомление.
Для отладки крайне полезна также утилита 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 andVerify), на этом шаге самое важное — не стереть предпрошитый бутлоадер. Теперь, перезагрузивчип и подключившись к нему через BLE device monitor, увидим поддержку OAD.

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

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