[Из песочницы] Плата BLE400 и разработка под nRF51822
Для разработки под микроконтроллер nRF51822 существует несколько комплектов от Nordic Semiconductor, все они достаточно дороги зато обеспечивают возможность удобной работы без возни с программаторами. При этом у китайских производителей можно обнаружить платы облегчающие отладку контроллеров за смешные деньги. Статья посвящена работе с клоном платы от Waveshare которая продаётся под названием BLE400.
Плата предназначена для использования совместно с модулями NRF51822, представляющие собой распаянный чип с антенной и парой кварцевых резонаторов. Стоимость комплекта из платы и модуля составляет около 20 долларов.
BLE400 содержит на борту USB порт и преобразователь USB-UART на базе чипа CP2102 с выведенными сигналами RX, TX, CTS и RTS. На уровне схемы она частично совместима с PCA10001, отладочной платой от Nordic, пара светодиодов и две кнопки подключены к тем же портам, любителям помигать светодиодом это немного упростит жизнь. К сожалению плата не умеет выполнять роль программатора nRF51822, хотя прошивка позволяющая работать с загрузчиком типа Arduino в сети есть. Бегло перечислю что же именно встроено в плату, частично это будет перевод документации отсюда.
- Посадочное место под модуль NRF51822, ключей нет, вставить неправильно модуль можно, но тогда он закроет батарею и антенна будет наоборот
- Дублирует пины модуля NRF51822, удобно для макетирования
- Выведенный для удобства подключения интерфейс I2C, дублирует соответствующие сигналы с гребёнки SDA — P0.00 SCL — P0.01 SMBA — P0.02 и питание, можно использовать готовые модули от Waveshare
- Интерфейс SPI, выведены сигналы MISO — P0.23 MOSI — P0.24 SCK — P0.25 NSS — P0.30
- Питание, при подключении по USB можно воспользоваться питанием 5 вольт, от батарейки и программатора доступно будет только 3.3. Питание сделано на RT9193 с максимальным током 300mA, сам модуль потребляем максимум 2mA и готов отдать в нагрузку максимум 3 пина по 5 mA или 1 пин с током в 15mA. Итого 250 мА на периферию в запасе есть
- Mini-USB гнездо для подключения питания или связи с ПК. 5 вольт порта напрямую подключено к гребёнке питания
- Упрощенный SWD интерфейс для программирования. Выведено питание 3.3в, SWDIO и SWCLK
- Продублированный UART, он же подключен к CP2102 и доступен для мониторинга на ПК через виртуальный COM порт. RX — P0.05 TX — P0.06 CTS — P0.07 RTS — P0.12
- Батарейка типоразмера CR1225, пригодится для автономного тестирования
- Набор светодиодов, подключены к P0.18 P0.19 P0.20 P0.21 P0.22. Светятся при подаче логической единицы. Здесь же можно посмотреть активность сигналов RX, TX и SPD
- Две кнопки подключенные к портам P0.16 и P0.17. При нажатии даёт логический ноль
- Кнопка сброса. Сбрасывает CP2102 и NRF51822 занулением сигнала SWDIO
- Контролер виртуального COM порта на CP2102, DTR и DSR не распаяны
- Джамперы для отключения интерфейса UART от CP2102
- Джамперы для отключения светодиодов и кнопок
Изначально в модуль прошит код для работы с nRF Toolbox for BLE от Nordic Semiconductor, для проверки его работоспособности этого достаточно. Подключаем плату к ПК, устанавливаем драйвера для CP2102 и подключаемся к плате при помощи терминала. Я воспользовался PuTTY, параметры порта: скорость 38400 дата бит 8, Стоповый бит один, управление потоком программное.
Подключаемся, в терминале вбиваем английский символ Y или y, получаем в ответ команду Start… — контроллер работает.
Теперь он доступен в списке BLE совместимых устройств на телефоне с именем Nordic_UART. Установив приложение для Android можно поиграться с передачей символов через виртуальный Bluetooth терминал и протестировать эмуляцию UART.
Переходим к программированию. Нам всё-таки понадобится программатор, оригинал от Segger будет немножко дорог, но благодаря автолюбителям на рынке достаточно клонов J-link ARM v8, стоят они около 15 долларов и для наших целей их более чем достаточно. Будем считать что драйвера на программатор (например J-Link Software v4.52b +) уже установлены. Подключаемся к плате стандартным JTAG кабелем от программатора или четырьмя проводами, достаточно соединить VTref, GND, SWDIO и SWCLK.
Для проверки подключения запустим 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.
Следующая задача — помигать светодиодами, заботливо распаянными на плате. Как уже упоминалось ранее, светодиоды и кнопки совместимы с платой 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.
Светодиоды это замечательно, но нам всё же нужен 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 кб.
Жмём кнопку Program. Карта памяти устройства теперь имеет следующий вид:
Оперативной памяти стало меньше на 8 кб, а первые 80 килобайт постоянной памяти заняло ядро. Меняем Target на цель со стеком s110, выбираем из меню nrf51822_xxaa_s110 (256К)
Для сборки примера с мигающим светодиодом при установленном SoftCore необходимо ввести коррективы в карту памяти, делается это из меню Options for Target — Target. Базовый адрес меняется на CODE_R1_BASE = 0x00014000
, а свободная память стартует с адреса 0×20002000.
Так как при заливке скетча мы не должны затереть ядро, меняем настройки программатора. Делается это из меню Options for Target — Debug, кнопка Setting.
Собираем проект и заливаем его в контроллер, если ядро установилось корректно мы получим те же мигающие светодиоды. Пора заливать прошивку имитирующую iBeacon, открываем проект из папки \ARM\Device\Nordic\nrf51822\Board\pca10001\s110\ble_app_beacon
. Меняем карту памяти по аналогии с мигающим светодиодом, собираем и заливаем в устройство.
Если все прошло успешно LED0 будет светиться, это индикатор что пакеты рассылаются. Устанавливаем на устройство Android или iOS приложение умеющее видеть iBeacon, я скачал
Beacon Scanner. UUID устройства совпадает с константой APP_BEACON_UUID в исходном коде, значит это наш маячок.
В принципе этой информации достаточно для быстрого и весьма недорогого старта работы с BLE. В минусах это поддержка устаревшего Keil 4 и нестабильная работа программатора на частотах 100 kHz и выше. Если среда разработки выдает ошибку загрузки уменьшайте скорость доступа до 50 kHz или даже менее. Иногда программатор отваливается и вернуть его к жизни можно только запуском JLink.exe, возможно это связано с тем что он является клоном оригинала.