
BLE под микроскопом (24-52 link)
Компания NORDIC уже несколько лет выпускает новые кристаллы серии nRF52. Однако до сих пор многие используют более старое семейство nRF24. Сегодня я покажу как организовать между ними двухстороннюю связь на advertising каналах. Кроме того, используя способность кристалла nRF52 измерять уровень RSSI, мы будем выводить его на график.
Варианты соединений
Читая форум Nordic-а о возможностях беспроводной связи между старым и новым семействами, я увидел, что есть две возможности. Это протокол ESB (Enhanced Shock Burst) и надстройка над ним — протокол Gazell. Это конечно хорошо, но есть ряд трудностей. Со стороны nRF24 это то, что исходники есть в nRFgo_SDK_2.3.0 только под модули nrf24le1 и nrf24lu1 (связка nRF24L01 + микроконтроллер). Однако у радиолюбителей больше получил распространение вот такой модуль без контроллера.
Рис.1

Для начала несколько слов о системе, которую будем строить. Прием-передачу мы будем вести на каналах advertising-а в формате BLE пакетов. Это позволит при помощи сотового телефона и программы NRF Connect (андроид и iOS) увидеть в эфире наши пакеты. Это сильно поможет нам и позволит разбить первоначальную задачу на этапы. У нас будет Host с радиоканалом на nRF24L01 и Device на м/к nRF52832. Причем, т.к. nRF24L01 это просто радиоканал, ему будет нужен контроллер. Мы создадим сразу два проекта на разных м/к от компании ST. Host будет несколько раз в секунду посылать в эфир радиопакет. Его будет принимать Device, измерять уровень RSSI и отправлять ответный пакет обратно, в котором будет содержатся его значение. После приема ответной посылки, Host будет выводить в СОМ порт по одному байту с уровнем RSSI. Для того, что бы наглядно отслеживать изменение уровня приема, я написал небольшую графическую программу.
Host Nrf24L01+Stm8L152
Итак, начнем с Host-а на связке Nrf24L01+Stm8L152. Для этой задачи я взял модуль Nrf24L01, фото которого приводил выше и STM8L-DISCOVERY, отладочную плата на базе STM8L152C6T6. Ниже приводится распиновка модуля nRF24L01.
Рис.2

Распиновка со стороны STM8L-DISCOVERY
#define LED_PORT GPIOC
#define LED_PIN GPIO_Pin_7
#define IRQ_PORT GPIOE
#define IRQ_PIN GPIO_Pin_0
#define CE_PORT GPIOD
#define CE_PIN GPIO_Pin_1
#define SPI_CLK_PORT GPIOE
#define SPI_CLK_PIN GPIO_Pin_4
#define SPI_MISO_PORT GPIOE
#define SPI_MISO_PIN GPIO_Pin_2
#define SPI_MOSI_PORT GPIOE
#define SPI_MOSI_PIN GPIO_Pin_5
#define SPI_CSN_PORT GPIOD
#define SPI_CSN_PIN GPIO_Pin_0
#define LED_PIN GPIO_Pin_7
#define IRQ_PORT GPIOE
#define IRQ_PIN GPIO_Pin_0
#define CE_PORT GPIOD
#define CE_PIN GPIO_Pin_1
#define SPI_CLK_PORT GPIOE
#define SPI_CLK_PIN GPIO_Pin_4
#define SPI_MISO_PORT GPIOE
#define SPI_MISO_PIN GPIO_Pin_2
#define SPI_MOSI_PORT GPIOE
#define SPI_MOSI_PIN GPIO_Pin_5
#define SPI_CSN_PORT GPIOD
#define SPI_CSN_PIN GPIO_Pin_0
Рис.3

Для вывода данных в СОМ порт был использован USB-переходник на м/с cp2102 подключенный к ножкам PC2 и PC3. Здесь можно взять его драйвер. В итоге получилось вот что.
Рис.4

На модуле nRF24L01 вы можете видеть запаянный электролитический конденсатор между ножек питания. Его рекомендуют ставить для устойчивой работы модуля. Полный проект и прошивку можно взять здесь и здесь. Открыть его можно при помощи среды разработки IAR for Stm8. Прошиваем м/к и запускаем. Синий светодиод на плате STM8L-DISCOVERY будет моргать 2 раза в секунду, показывая отправляемые посылки. Теперь самое время запустить программу NRF Connect и увидеть примерно такую картинку, которая изображена на Рис.5а. Если у вас всё получилось — поздравляю вас, первая половина задач выполнена.
Рис.5a________________________________Рис.5b_______________________________Рис.5c______________________________

Host Nrf24L01+stm32F103
Что бы не уходить далеко от работы Host-а, повторим всё то же самое для м/к stm32F103. Для этого я взял «синюю таблетку» с установленным на ней USB разъемом. Это позволило не использовать переходник, а выводить данные напрямую в USB порт, используя эти драйвера. Проект для stm32F103 я собрал в STM32CubeMx.
Распиновка со стороны синей таблетки
#define SPI_CE_PORT GPIOB
#define SPI_CE_PIN GPIO_PIN_4
#define SPI_IRQ_PORT GPIOB
#define SPI_IRQ_PIN GPIO_PIN_5
#define SPI_MISO_PORT GPIOB
#define SPI_MISO_PIN GPIO_PIN_6
#define SPI_CLK_PORT GPIOB
#define SPI_CLK_PIN GPIO_PIN_7
#define SPI_MOSI_PORT GPIOB
#define SPI_MOSI_PIN GPIO_PIN_8
#define SPI_CSN_PORT GPIOB
#define SPI_CSN_PIN GPIO_PIN_9
#define SPI_CE_PIN GPIO_PIN_4
#define SPI_IRQ_PORT GPIOB
#define SPI_IRQ_PIN GPIO_PIN_5
#define SPI_MISO_PORT GPIOB
#define SPI_MISO_PIN GPIO_PIN_6
#define SPI_CLK_PORT GPIOB
#define SPI_CLK_PIN GPIO_PIN_7
#define SPI_MOSI_PORT GPIOB
#define SPI_MOSI_PIN GPIO_PIN_8
#define SPI_CSN_PORT GPIOB
#define SPI_CSN_PIN GPIO_PIN_9
Рис.6

Сам проект и прошивку можно взять здесь и здесь. Открыть его можно при помощи среды разработки IAR for Stm32. Для программирования STM32F103 можно использовать любой программатор. Я использовал такой.
Рис.7

Подключаем питание и пробуем увидеть посылки на advertising каналах. Картинка будет та же что на Рис5а. На этой плате ничего не моргает, оба светодиода светятся непрерывно. У меня не получилось оживить зеленый светодиод на ножке PС13. Частота посылок выше, чем на плате c stm8L152, и составляет 10 Гц. Все эти параметры легко меняются внутри проектов.
Device Nrf52832
Итак, будем считать, что первая часть системы с Host-ом у нас заработала. Теперь будем запускать Device. Это можно делать на подходящем KIT-е от NORDIC PCA10040
Рис.8

Можно так же использовать любую плату с м/к nRF52832. Я буду использовать плату от старой разработки. Но и на ките PCA10040, я проверял, он так же запускается. Проект и прошивка лежат здесь и здесь. Он собран в среде Keil uVision4 с использованием уже старого SDK12.3.0, который можно взять здесь. Для того что бы проект без проблем собрался, его папку необходимо поместить в директорию nrf52832_workspace_SDK12\examples\peripheral\. Дело в том, что любой проект от NORDIC-а содержит огромное количество связанных ссылок, поэтому в произвольном месте не соберется. Что бы прошить nRF52832 можно использовать программу nRFgoStudio или nRF Connect for Desktop.
При запуске пректа Device, я бы рекомендовал сначала сделать вот что. Т.к. Device работает в режиме прослушивания эфира, он не посылает в эфир радиопакетов. Это произойдет только как ответ, после приема пакета от Host-а. Поэтому надо сначала проверить, что устройство живо. Для этого в проекте надо закомментировать функцию BleListen() и наоборот раскомментировать BleRadioTransaction(). Так, как изображено ниже.

В этом случает Device сам начнет выдавать в эфир радиопакеты. Их можно будет увидеть на телефоне. Примерная картинка изображена на Рис.5b. Если всё нормально, возвращаем всё назад и включаем оба устройства Host и Device. На телефоне мы должны увидеть их оба, как на Рис.5с. Это значит, что Device увидел посылку Host-а и в ответ передал свою. Если Host в свою очередь принял ответную посылку с уровнем RSSI, то он выставляет в COM-порт это значение. Теперь если мы запустим на Windows программу LevelRssi и выберем правильно порт, мы увидим как меняется уровень RSSI при разном взаимном расположении устройств.
Заключение
Я уже практически закончил оформлять статью, как мне пришла ещё одна мысль. Я решил использовать в качестве Device более распространенное устройство, а именно донгл pca10059, созданный на основе м/к nRF52840. Вот его фотка.
Рис.9

Благо у меня было две такие платы. Пересобрав проект я столкнулся с проблемой залить в него прошивку. Я знал, что делать это нужно при помощи программы nRF Connect for Desktop, но не сразу сообразил как ввести донгл в режим DFU (обновления прошивки). Рассказываю как это сделать. В режим DFU мы попадаем сразу после reset-a. Надо сначала воткнуть донгл в USB разъем, а затем нажать кнопку reset (дальнюю от процессора), с горизонтальным толкателем. На донгле начинает моргать красный светодиод. Открываем программу nRF Connect и нажимаем кнопку «Install» в разделе Programmer. Когда скачается необходимый софт, нажмите кнопку «Open».
Рис.10

Перед вами раскроется окно программатора.
Рис.11

Слева вверху выберите нужный COM порт. Вы увидите примерно следующую картинку.
Рис.12

С левой стороны мы увидим что находится в памяти контроллера. Нажав на кнопку «Add HEX file» можно добавить на правую сторону файл для заливки. Здесь так же не обошлось без проблем. Кнопки «Erase all» и «Erase & write» для нас недоступны. Дело в том, что у донгла нет программатора, поэтому заливка программы происходит при помощи bootloader-a. А попадаем мы в него через MBR раздел. Если мы сотрем эти разделы, то прошивка через режим DFU будет невозможна. По идее надо просто добавить на правую половину экрана прошивку и нажать кнопку «Write». Вроде всё верно, но работать не будет. Наша программа начинается с нулевого адреса во FLASH памяти, а этот адрес уже занят разделом MBR. Как с этим справится можно прочитать в этом уроке. Если читать долго или нет желания, объясню в картинках на примере Keil-a. Вот картинка проекта с распределением памяти микроконтроллера для проектов без стека.
Рис.13

Надо сдвинуть указатель FLASH-a на 0x1000, а RAM на 0x20000008 и перекомпилировать проект.
Рис.14

После этого уже можно воспользоваться программой nRF Connect for Desktop. Вот пожалуй и всё. То что у меня получилось можно посмотреть на видео внизу.
yadi.sk/i/BGQQnga1HeN50A
yadi.sk/i/d8A9pU82kBcTMw
yadi.sk/i/XGac8xwpksVX7g
Сотрудник Группы Компаний «Цезарь Сателлит»
Печерских Владимир