STM Урок 103. Модули NRF24L01. Часть 2



В предыдущей части урока мы познакомились с некоторыми характеристиками модуля NRF24L01.

 

Процесс обмена данными модуля с контроллером происходит по шине SPI с использованием ещё некоторых ножек. Есть ножка CE, которая управляет включением модуля, а также включением модуля в определённый режим. Также имеется ножка IRQ, которая меняет свой уровень в момент определённых событий, например, когда пакет полностью отправился, либо ноборот, когда мы получили пакет и он уже лежит в буфере FIFO. Также уровень меняется, когда достигнут максимальный предел повторов отправки пакета.

В основном вот такие характеристики. А со всеми особенностями мы уже будем знакомиться в процессе использования.

Например, есть особенность такая, что скорость заявлена 2 Mbps, но на самом деле с такой скоростью поток данных мы конечно не передадим, так как пакеты данных не могут превышать 32 байта, так как именно такие ячейки памяти содержатся в буфере FIFO. А пакет за пакетом мы же не можем принимать, надо же ещё когда-то и буфер освобождать, также существуют специальные импульсы определённой длительности для отправки данных. Есть также тайминг для перевода модуля из одного режима в другой — 135 мкс. Например для перевода из режима приёмника в режим передатчика и наоборот. Также я читал, что необходимо не реже чем через 4 милисекунды перекалибровывать модуль, на что тоже уходит порядка 200 мкс, сначала я ничего не перекалибровывал и данные нормально передавались и принимались. Единственное то, что порой при включении модулей передача и приём начинался не сразу и иногда для старта надо было перезагрузить один из модулей, причём порой на холодную, то есть с отключением питания. Но тем не менее модули мне запустить удалось, данные передать удалось. Но потом, исследовав массу исходных кодов (вы даже не представляете какую), я пришел к выводу, что если мы пакеты передаём не чаще чем раз в 4 милисекунды, а также существует риск потери связи, например вследствие усадки батарейки на одном из устройств обмена, то лучше после передачи данных переводить модуль в режим приёмника и уже когда будем передавать следующий пакет, переводить его заново в режим передатчика, выжидая все тайминги. В технической документации указано, что если модуль бездействует дольше 4 милисекунд, то он уйдёт в дежурный режим, поэтому так и так его придется оттуда выводить. Даже не знаю, почему без этого всё работало. Также мне удалось отследить по определённым битам, в какой именно из 6 каналов адресован был пакет. А иначе бы я и не затеял урок по модулю.

Так что продолжаем дальше.

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

В технической документации также подробно описан процесс самой передачи данных на низком уровне. Думаю нам это не очень интересно, так как этим процессом мы все равно управлять не можем, мы не можем изменить преамбулы и прочие тонкости. Поэтому давайте хотя бы посмотрим, как должен происходить процесс обмена данными модуля с микроконтроллером.

Вообще модуль поддерживает обмен данными с контроллером на скорости до 10 Mbps.

Вот это процесс обмена данными модуля с контроллером в режиме приёма и передачи

 

 

Как мы видим и в режиме приёма и в режиме передачи данных по SPI первым делом передаётся команда, а уж затем передаются или принимаются данные. Только думаю, чтобы мы совсем не сошли с ума от теории, давайте всё же немного спустимся на землю, создадим и настроим проект хотя бы пока для передатчика, подключим схему, начнём писать код и уж потом по ходу написания, когда нам непосредственно придется применять команды и регистры, мы и будем с ними знакомиться по ходу написания. И писать будет веселей с подпиткой информации да и если мы уже сейчас всё изучим, мы к моменту написания половину забудем и нам всё равно придётся прыгать по тексту, а если будем смотреть в режиме видеоурока, то отматывать. Как-то нехорошо.

Основная цель данного урока: изучить необходимые нам команды и регистры модуля, которые мы будем использовать для написания кода проекта, а также написать проект, в котором мы инициализируем модуль, научимся записывать данные в регистры, а также их оттуда считывать. Думаю, для первого занятия этого будет достаточно. А в следующих уроках мы уже соединим два модуля, протестируем их на передачу и приём, а уже в последующих уроках мы попробуем передать какие-то полезные данные, например окружающую температуру, а на приёмном устройстве её отобразить на каком-то дисплее либо на светодиодном индикаторе.

 

 

Поэтому подумаем о проекте.

Для передатчика мы сегодня применим маленькую отладочную плату на базе контроллера STM32F103C8T6, которая нам уже долгое время служит верой и правдой.

Подключим модуль к плате, не забыв подключить в разрыв питания стабилизатор с конденсатором, а также подключим переходник USB-TTL, посредством которого мы будем отслеживать состояние некоторых регистров. Ножки для подключения мы увидим в Cube MX.

Схема наша выглядит следующим образом

 

 

Ну и давайте запустим генератор проектов Cube MX, создадим новый проект, выберем контроллер

 

 

 

Добавим резонатор

 

 

Включим отладчик

 

 

Включим USART

 

 

Включим SPI

 

 

Включим ножку PA4 на выход. Это будет ножка для контакта CSN

 

 

Также включим ножку PA3 на выход для контакта CE, а также ножку PA2 на вход для контакта прерываний IRQ

 

 

Ножку PC13 также задействуем на выход, для управления светодиодом

 

 

Идём в Clock Configuration и настроим плату на 64 Мгц, думаю, хватит за глаза (нажмите на картинку для увеличения изображения)

 

 

Переходим в Configuration и настроим первым делом SPI

 

 

Думаю данной скорости нам хватит. Зато не наловим глюков с проводами.

USART не трогаем, просто зайдём и убедимся, что там всё хорошо, а то всякое бывает

 

 

Заполним настройки проекта

 

 

Сохраним настройки, сгенерируем проект, откроем его в Keil, настроим программатор на autoreset и настроим уровень оптимизации 1.

Соберём проект и продолжим работу с ним в следующей части занятия, в которой мы начнём писать функцию инициализации модуля, напишем функции чтения и записи регистров, а также познакомимся с некоторыми командами и регистрами.

 

 

Предыдущая часть Программирование МК STM32 Следующая часть

 

 

Модуль NRF24L01+ с антенной можно купить здесь NRF24L01+

Модуль NRF24L01+ без антенны можно купить здесь (целых 4 штуки) NRF24L01+

Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6

Программатор недорогой можно купить здесь ST-Link V2

 

 

Техническая документация:

nRF24L01

nRF24L01P

nrf24l01 tutorial

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

STM Модули NRF24L01

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*