[Из песочницы] Плата BLE400 и разработка под nRF51822

Для разработки под микроконтроллер nRF51822 существует несколько комплектов от Nordic Semiconductor, все они достаточно дороги зато обеспечивают возможность удобной работы без возни с программаторами. При этом у китайских производителей можно обнаружить платы облегчающие отладку контроллеров за смешные деньги. Статья посвящена работе с клоном платы от Waveshare которая продаётся под названием BLE400.
qboktxvnwsb1cxfb6yraxpk9rz8.jpeg

Плата предназначена для использования совместно с модулями NRF51822, представляющие собой распаянный чип с антенной и парой кварцевых резонаторов. Стоимость комплекта из платы и модуля составляет около 20 долларов.

nuesr77fipst_y01tw0-ql9ss8k.jpeg

BLE400 содержит на борту USB порт и преобразователь USB-UART на базе чипа CP2102 с выведенными сигналами RX, TX, CTS и RTS. На уровне схемы она частично совместима с PCA10001, отладочной платой от Nordic, пара светодиодов и две кнопки подключены к тем же портам, любителям помигать светодиодом это немного упростит жизнь. К сожалению плата не умеет выполнять роль программатора nRF51822, хотя прошивка позволяющая работать с загрузчиком типа Arduino в сети есть. Бегло перечислю что же именно встроено в плату, частично это будет перевод документации отсюда.

z4whgl9fejx-fsbvruii05xntdw.jpeg

  1. Посадочное место под модуль NRF51822, ключей нет, вставить неправильно модуль можно, но тогда он закроет батарею и антенна будет наоборот
  2. Дублирует пины модуля NRF51822, удобно для макетирования
  3. Выведенный для удобства подключения интерфейс I2C, дублирует соответствующие сигналы с гребёнки SDA — P0.00 SCL — P0.01 SMBA — P0.02 и питание, можно использовать готовые модули от Waveshare
  4. Интерфейс SPI, выведены сигналы MISO — P0.23 MOSI — P0.24 SCK — P0.25 NSS — P0.30
  5. Питание, при подключении по USB можно воспользоваться питанием 5 вольт, от батарейки и программатора доступно будет только 3.3. Питание сделано на RT9193 с максимальным током 300mA, сам модуль потребляем максимум 2mA и готов отдать в нагрузку максимум 3 пина по 5 mA или 1 пин с током в 15mA. Итого 250 мА на периферию в запасе есть
  6. Mini-USB гнездо для подключения питания или связи с ПК. 5 вольт порта напрямую подключено к гребёнке питания
  7. Упрощенный SWD интерфейс для программирования. Выведено питание 3.3в, SWDIO и SWCLK
  8. Продублированный UART, он же подключен к CP2102 и доступен для мониторинга на ПК через виртуальный COM порт. RX — P0.05 TX — P0.06 CTS — P0.07 RTS — P0.12
  9. Батарейка типоразмера CR1225, пригодится для автономного тестирования
  10. Набор светодиодов, подключены к P0.18 P0.19 P0.20 P0.21 P0.22. Светятся при подаче логической единицы. Здесь же можно посмотреть активность сигналов RX, TX и SPD
  11. Две кнопки подключенные к портам P0.16 и P0.17. При нажатии даёт логический ноль
  12. Кнопка сброса. Сбрасывает CP2102 и NRF51822 занулением сигнала SWDIO
  13. Контролер виртуального COM порта на CP2102, DTR и DSR не распаяны
  14. Джамперы для отключения интерфейса UART от CP2102
  15. Джамперы для отключения светодиодов и кнопок


Изначально в модуль прошит код для работы с nRF Toolbox for BLE от Nordic Semiconductor, для проверки его работоспособности этого достаточно. Подключаем плату к ПК, устанавливаем драйвера для CP2102 и подключаемся к плате при помощи терминала. Я воспользовался PuTTY, параметры порта: скорость 38400 дата бит 8, Стоповый бит один, управление потоком программное.

Подключаемся, в терминале вбиваем английский символ Y или y, получаем в ответ команду Start… — контроллер работает.

Теперь он доступен в списке BLE совместимых устройств на телефоне с именем Nordic_UART. Установив приложение для Android можно поиграться с передачей символов через виртуальный Bluetooth терминал и протестировать эмуляцию UART.

qgjci0adipkt6njvr6tzlo1omvy.jpeg

Переходим к программированию. Нам всё-таки понадобится программатор, оригинал от Segger будет немножко дорог, но благодаря автолюбителям на рынке достаточно клонов J-link ARM v8, стоят они около 15 долларов и для наших целей их более чем достаточно. Будем считать что драйвера на программатор (например J-Link Software v4.52b +) уже установлены. Подключаемся к плате стандартным JTAG кабелем от программатора или четырьмя проводами, достаточно соединить VTref, GND, SWDIO и SWCLK.

al83dtzch3x-sh0lkgrwr_s3pa8.png


Для проверки подключения запустим JLink.exe и получим информацию о установленном чипе

SEGGER J-Link Commander V4.74b ('?' for help)
Compiled Aug 19 2013 23:26:57
DLL version V4.74b, compiled Aug 19 2013 23:26:44
Firmware: J-Link ARM V8 compiled Nov 28 2014 13:44:46
Hardware: V8.00
S/N: 20091135
Feature(s): RDI,FlashDL,FlashBP,JFlash,GDBFull
VTarget = 3.293V
Info: Found SWD-DP with ID 0x0BB11477
Info: FPUnit: 4 code (BP) slots and 0 literal slots
Info: Found Cortex-M0 r0p0, Little endian.
Found 1 JTAG device, Total IRLen = 4:
Cortex-M0 identified.
JTAG speed: 100 kHz


Нам понадобится следующее ПО

  • Keil MDK-ARM v4
  • nRF51 SDK
  • nRFgo Studio


Для получения Lite версии Keil MDK-ARM необходима регистрация, остальное доступно для скачивания так. nRFgo Studio версии 1.21.2 у меня так и не запустилась под Windows 10, но младшая версия 1.15.1 работает. Последняя версия SDK с поддержкой платы pca10001 это версия 6, скачиваем по ссылке. После установки SDK в папке куда установлена среда Keil появится каталог \ARM\Device\Nordic\nrf51822 содержащий все необходимые файлы. Примеры рассчитаны на использование Keil версии 4, файл проекта имеет расширение uvproj в отличии от Keil 5 где расширение uvprojx. Собственно Keil 4 мы используем чтобы не запутаться в файлах конфигурации и совместимости примеров.

Программировать плату можно не только через консоль J-Link Commander, но и через nRFgo Studio, через неё же мы можем очистить чип или залить SoftDevice для работы с Bluetooth. Делается это из меню nRF51 Programming. В чипе уже залито ядро BLE стека. Очистить его можно через пункт меню Erase all.

9jkrrvni-i4d2bbmbu61mqhnga0.png

Следующая задача — помигать светодиодами, заботливо распаянными на плате. Как уже упоминалось ранее, светодиоды и кнопки совместимы с платой pca10001 от Nordic, значит используем пример оттуда, открываем в папке с Keil4 \ARM\Device\Nordic\nrf51822\Board\pca10001\blinky_example\arm\ файл проекта blinky.uvproj.
Собираем проект нажав F7 и прошиваем через меню Flash→Download. У меня по умолчанию не прошивалось из-за выбранной по умолчанию скорости заливки JTAG равной 2000 kHz. Исправить можно из меню Option for target → Debug → Setting. После замены на 100 kHz всё успешно заработало. Светодиоды LED0 и LED1 успешно перемигиваются, микроконтроллер работает. Если загрузить всё же не получается можно попробовать прошить HEX из из папки _build blinky_arm.hex с использованием nRFgo Studio или из консоли программатора J-Link. Но сначала стоит убедить что в настройках Keil выбран программатор J-Link.

tsv_zjf2jae7nrra3pew4gx60mo.png

Светодиоды это замечательно, но нам всё же нужен Bluetooth, пример для работы лежит в папке \ARM\Device\Nordic\nrf51822\Board\pca10001\s110\ble_app_beacon. Это реализация iBeacon, для нас он интересен работой с программным BLE стеком от Nordic. Пример рассчитан на версию стека s110, самую простую по возможностям, но для демонстрации работоспособности этого вполне достаточно. Ядро необходимо скачать отдельно и версий его достаточно много, при этом версия заголовков должна коррелировать с версией ядра. Скачать ядра можно по ссылке в разделе SoftDevices.

Изначально вместе с SDK идут заголовочные файлы для версии 7.0.0, но у меня эта версия ядра не стартовала. Теоретически работать должна любая версия стека, доступны для скачивания версии v6, v7, v8. С примерами из SDK седьмая и восьмая версия стека у меня не заработали, остановился на 6.2.1.

Скачиваем ядро, распаковываем в удобную для вас папку, например, Cores ARM\Device\Nordic\nrf51822\Cores\6.2.1. Очищаем уже существующую папку \ARM\Device\Nordic\nrf51822\Include\s110 и копируем в неё заголовочные файлы из папки include распакованного ядра.

SoftDevice необходимо прошить, для этого воспользуемся nRFgo Studio, выбираем из меню Device Manager пункт nRF51 Programming и убеждаемся что программатор не отвалился. В закладке Program SoftDevice выбираем файл с ядром \ARM\Device\Nordic\nrf51822\Cores\6.2.1\s110_nrf51822_6.2.1_softdevice.hex. Если файл правильного формата внизу будет указанна занимаемая ёмкость, для этой версии SoftDevice равная 80 кб.

erqb-ackdrou-sxsgmm7hzdeqvg.png

Жмём кнопку Program. Карта памяти устройства теперь имеет следующий вид:

5zyl-9gcin0xykxdpcv8js-yppo.png

Оперативной памяти стало меньше на 8 кб, а первые 80 килобайт постоянной памяти заняло ядро. Меняем Target на цель со стеком s110, выбираем из меню nrf51822_xxaa_s110 (256К)

hwtzdpkbhqceo-zb5c7knngzbj8.png

Для сборки примера с мигающим светодиодом при установленном SoftCore необходимо ввести коррективы в карту памяти, делается это из меню Options for Target — Target. Базовый адрес меняется на CODE_R1_BASE = 0x00014000, а свободная память стартует с адреса 0×20002000.

tvmtyqm_m9h0yubwtvid1xmnc_8.png

Так как при заливке скетча мы не должны затереть ядро, меняем настройки программатора. Делается это из меню Options for Target — Debug, кнопка Setting.

bm7taoxsrjucrzwyn25ktbqq_su.png

Собираем проект и заливаем его в контроллер, если ядро установилось корректно мы получим те же мигающие светодиоды. Пора заливать прошивку имитирующую iBeacon, открываем проект из папки \ARM\Device\Nordic\nrf51822\Board\pca10001\s110\ble_app_beacon. Меняем карту памяти по аналогии с мигающим светодиодом, собираем и заливаем в устройство.

Если все прошло успешно LED0 будет светиться, это индикатор что пакеты рассылаются. Устанавливаем на устройство Android или iOS приложение умеющее видеть iBeacon, я скачал
Beacon Scanner. UUID устройства совпадает с константой APP_BEACON_UUID в исходном коде, значит это наш маячок.

lxkdalmvrrtvv6svwlkuzyf7wpa.png


В принципе этой информации достаточно для быстрого и весьма недорогого старта работы с BLE. В минусах это поддержка устаревшего Keil 4 и нестабильная работа программатора на частотах 100 kHz и выше. Если среда разработки выдает ошибку загрузки уменьшайте скорость доступа до 50 kHz или даже менее. Иногда программатор отваливается и вернуть его к жизни можно только запуском JLink.exe, возможно это связано с тем что он является клоном оригинала.

© Habrahabr.ru