» » Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 2

 
 
 

Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 2

Разместил erbol 6 апреля 2016. Просмотров: 4732

14 Продолжаем разговор. Как-то раз мы с пацанами решили соединить радио-модуль «nRF24L01+» вот с таким «тараканом» — Attiny85.
Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 2


Двигали нами три мотива:
• Прикладной — надо было уместить передатчик в пространство строго определенного размера.
• Исследовательский — неужели эта кроха ни на что путное, кроме как растерянно моргать светодиодами, не способна?
• Биологический — жаба задавила. Использовать нафаршированный ATmega328 только для того, чтобы он изредка выходил из беспробудной спячки, опрашивал пару датчиков и отправлял данные в эфир, показалось нам верхом расточительства.

Что в конце концов из этого получилось вы узнаете во второй части статьи.
Внимательный читатель при прочтении первой части статьи наверняка обратил внимание на то, что в Таблице 1 не нашлось места для ATtiny85, хотя в тексте он упомянут не один раз. Дело в том, что стандартный способ соединения радио-модуля с этим МК "вывод к выводу" не возможен по причине ограниченного количества последних - всего 5 пинов в заводской конфигурации.
Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 2

Можно, конечно, пожертвовать функцией Reset и обеспечить недостающий, шестой вывод. Но ведь помимо обслуживания nRF24L01+ хотелось бы ещё что-то делать, датчики, к примеру, опрашивать.

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

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

1) Прощайте, прерывания. Здравствуй, первая освобождённая нога!

Идея лежит на поверхности - отказ от прерываний. Создадим единую для передатчика и приёмника функцию проверки флагов регистра STATUS и поместим её в тело основной функции.

Удаляем из программы всё, что связано с прерываниями. Один вывод сэкономили.

2) CE нам больше не CE. Вторая свободная нога тиньки

Установим вывод CE в 1 на постоянной основе. С приёмником всё просто. Соединяем указанный вывод с питанием и, как только биты PWR_UP и PRIM_RX регистра CONFIG будут установлены в 1, трансивер готов принимать данные.

В случае с передатчиком есть одно препятствие. Согласно спецификации nRF24L01+ не должен единовременно находится в режиме передатчика более 4 миллисекунд. Какие кары ждут нарушителя, производитель умалчивает. Не будем рисковать и преступать запрет, а, по привычке, обойдём его.

Обратимся к диаграмме из спецификации и, следуя выделениям красным и зелёным, выпишем, что нужно сделать для успешной передачи в эфир данных.
Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 2

1. Установить бит PWR_UP регистра CONFIG в 1, а PRIM_RX - в 0.
2. Загрузить отправляемые данные в стек FIFO.
3. Вывод CE должен находится в высоком состоянии хотя бы 10 мкс.
4. Соблюсти все временные задержки и ограничения, включая злосчастные 4 мс.
В первой части мы так и делали – настраивали трансивер, загружали данные и передергивали на 11 мкс вывод CE.

Однако, пункты 1-4 определяют необходимые и достаточные условия, но - не последовательность. Что это означает? А то, что мы можем:
1. Подключить всё же вывод CE к питанию.
2. Загрузить отправляемые данные в стек FIFO.
3. Установить бит PWR_UP регистра CONFIG в 1, а PRIM_RX - в 0.
4. Выдержать 1.5 мс для перехода трансивера в состояние Standby-I, 10 мкс и 130 мкс, необходимые для отправки данных, что суммарно не превышает ограничение в 4 мс.
5. Вернуть бит PWR_UP в 0.

Говоря иначе, мы будем передёргивать бит PWR_UP, а не вывод CE. Можно передёргивать и бит PRIM_RX, но я выбрал этот вариант, поскольку он позволяет добиться максимального энергосбережения – передатчик большую часть времени находится в состоянии Power Down.

Перейдём к программе. Расширим макрофункции sbi() и cbi(), сделав их более универсальными:

и, для удобства, оформим процесс отправки данных в виде трёх функций:

Вычищаем из кода все упоминания о выводе CE, радуемся ещё одному свободному выводу и делаем

3) Превращаем CSN и SCK в CSN_SCK

Здесь и дальше нам с мальчишками помогла замечательная статья Нёда Ральфа [1]. Идея состоит в объединении выводов CSN и SCK в один посредством RC-цепочки.
Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 2

Работает это при общении МК с nRF24L01+ следующим образом:
1. Сначала МК использует объединённый вывод CSN_SCK в качестве CSN, выставляя его в низкое состояние.
2. Затем - как SCK, подавая тактовые импульсы.

Параметры RC-цепочки подбираются таким образом, чтобы с одной стороны уровень напряжения на выводе CSN трансивера не успел подняться до логического 1 за время передачи байта, а с другой - чтобы SPI-протокол не получился совсем уж медленным.

В программе мы, во-первых, заменим макроопределения выводов CSN и SCK на CSN_SCK и добавим ещё одно - времени задержки цепочки RC_DELAY.
Можно, конечно, с помощью заумных формул высчитать значение задержки, мы же применили простой и проверенный способ – метод «тыка». В нашем случае вышло 1 мс.

Во-вторых, в функциях, созданных нами в первой части статьи, добавится строка _delay_ms(RC_DELAY). Где именно, вы узнаете, сделав завершающий шаг.

4) Превращаем MOSI и MISO в MOMI

Тот, кто успел уже пробежаться по вышеуказанной статье, понял, что речь снова идёт про объединение, только других выводов – MOSI и MISO в MOMI через резистор.
Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 2

Программно мы будем менять через регистр DDR направление вывода MOMI, используя его то как вход, то как выход, в зависимости от требований текущего момента.

Внесём соответствующие изменения в макросы и в окончательном виде они будут выглядеть так:


А написанные нами в прошлый раз функции примут такой вид:


Полный код для передатчика:


Полный код для приёмника:


Заключение

В итоге, ценой программных и минимальных аппаратных затрат, мы добились управления радио-модулем всего двумя выводами МК. В запасе осталось ещё три, ну и пин Reset прозапас.

Как вы понимаете, эта часть статьи не только о трансивере nRF24L01+, но и о SPI-протоколе в целом. К примеру, мы использовали описанные здесь приёмы для управления TFT-дисплеем всё тем же ATtiny85. Более того, информацию, полученную из пунктов 3 и 4, можно применить и в других случаях, при нехватке выводов.

Третья часть статьи целиком и полностью будет посвящена «ардуинщикам». В ней я покажу, как подружить оболочку Arduino IDE и ATtiny85, как запустить режим «Power Down» не только на nRF24L01+, но и на МК, чтобы получить максимальную экономию энергии.

Кроме того, мы рассмотрим вполне конкретный пример опроса датчика температуры, передачу и приём показаний по радиоканалу.

Всего вам доброго! Продолжение следует.

Ссылки

1. Nerd Ralph. nRF24l01 control with 2 MCU pins using time-division duplexed SPI

Об авторе

Ербол (erbol)
Актобе, Казахстан
Мне 50 лет. Родился и вырос в г. Актюбинск (ныне - Актобе), Казахстан. Женат, воспитываю четверых прекрасных детей.

С программированием и электроникой имею может и не отдаленные, но весьма эпизодические отношения: в далекие и бурные 90-е годы аж прошлого века посчастливилось участвовать в автоматизации экспериментальной установки с использованием микропроцессорного комплекта КР580.

А пару лет назад мои сорванцы вдруг заинтересовались микроконтроллерами. Пришлось из дальних уголков памяти вытаскивать свои старые познания и стряхивать с них пыль.
 

Понравилось? Палец вверх!

  • всего лайков: 57

Поделись с друзьями!


Связанные материалы:


Визуализация для микроконтроллера. Часть 2. TFT дисплей 1.8" (128х160) на ST7735

Следующий из рассматриваемых нами модулей обладает полноцветным дисплеем под управлением...

Визуализация для микроконтроллера. Часть 1. OLED дисплей 0.96" (128х64) на SSD1306

Добрый день, друзья! Эта статья открывает цикл, посвящённый средствам визуального отображения...

Трансивер 2,4 ГГц Nordic Semiconductor nRF24L01. Перевод таблиц даташита, пояснения

Привет, датагорцы! Выкладываю перевод таблиц из спецификации nRF24L01+, файл с пояснениями и...

Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic

Приветствую всех настоящих и будущих поклонников отладочной платы Arduino! Сегодня,...

Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic

Доброго вам дня, уважаемые граждане и гости Датагор.ру - этого замечательного сообщества...

Предварительный усилитель на аудиопроцессоре TDA7318 (TDA7313) и Arduino. Часть 2

Проект в сборе. Сборка займет у вас примерно 15 минут. В первой части статьи мы подробно...

Вторая жизнь лампового радиоприемника Philips 592LN (Голландия, 1947). Часть 4.

Привет, датагорцы! В этой части моего повествования речь пойдёт о модуле BlueTooth...

Реинкарнация компьютерных БП. Часть 2

Если уж брать от убитого компьютерного БП, то - по максимуму. А это значит, что кроме перечисленных...

Реинкарнация компьютерных БП. Часть 1

Если нет надежды на восстановление БП, либо предстоящие затраты на его восстановление слишком...

Руководство по электрическому оборудованию автомобилей. A. Трантер

Эта книга предназначена дли тех, кто хочет понять работу электрических и электронных систем...

Технология выпаивания радиодеталей с односторонних плат

Я перепробовал несколько способов распайки плат. Иголками - происходит травмирование ножек...

Анатомия микроконтроллеров ATmega - 2

Итак, продолжим издевательство над МК. Что же нам ещё такого сделать? Давайте заставим мигать...
<
  • Подписчик
6 апреля 2016 10:11

Игорь / StalKer-NightMan

  • Регистрация: 15.03.2012
  • Публикаций: 1
  • Комментариев: 84
 
  • 0
Спасибо, Ербол, за хорошо прописанный материал.

<
  • Бонус
6 апреля 2016 10:19

Ербол / erbol

  • Регистрация: 11.12.2014
  • Публикаций: 7
  • Комментариев: 58
 
  • 0
Спасибо Игорь! smile Тут ведь ещё немалый редакторский труд Датагора присутствует, так что принимаю благодарность за двоих drinks

<
  • Гражданин
7 апреля 2016 01:51

Сергей / Yamazaki

  • Регистрация: 2.07.2009
  • Публикаций: 3
  • Комментариев: 136
 
  • 0
Класс! Красивые хаки, аккуратная оптимизация. Изящно сделано!

<
  • Бонус
7 апреля 2016 02:10

Ербол / erbol

  • Регистрация: 11.12.2014
  • Публикаций: 7
  • Комментариев: 58
 
  • 0
Спасибо, Сергей! smile Рад, что Вам понравилось! handshake

<
  • Гражданин
7 апреля 2016 10:44

Сергей / Yamazaki

  • Регистрация: 2.07.2009
  • Публикаций: 3
  • Комментариев: 136
 
  • 0
На али атмега8 стоит дешевле, чем тини85 wacko
Вот и оптимизируй, блин lol

<
  • Бонус
7 апреля 2016 11:10

Ербол / erbol

  • Регистрация: 11.12.2014
  • Публикаций: 7
  • Комментариев: 58
 
  • 0
Цитата: Yamazaki
На али атмега8 стоит дешевле, чем тини85 wacko
Вот и оптимизируй, блин lol

Кто не успел убежать, того и оптимизировали smile

<
  • Бонус
7 апреля 2016 11:20

Ербол / erbol

  • Регистрация: 11.12.2014
  • Публикаций: 7
  • Комментариев: 58
 
  • +1
Ну а если серьёзно, то такими темпами скоро многоножка с линуксом на борту будет общедоступной. Так что, все в этой части статьи - из темы "погоня за лишним байтом". smile Просто решил поделиться, вдруг кому пригодится

<
  • Главный редактор
7 апреля 2016 12:00

Игорь Петрович Котов / Datagor

  • Регистрация: 25.02.2011
  • Публикаций: 262
  • Комментариев: 1607
 
  • 0
Цитата: Yamazaki
а али атмега8 стоит дешевле, чем тини85

Цены на Али - не показатель.Чего больше смогли украсть с завода или выкопать из отбраковки, то и подешевле может оказаться.
На промышленных складах оптовые цены на ATTINY85 ниже.
Это про бабки, хотя мы договорились здесь никогда экономические вопросы не обсуждать. smile

А про оптимизацию кода - ОНА НЕСОМНЕННО И ВСЕГДА НЕОБХОДИМА (главное, без фанатизма), иначе получаем горы кривого прожорливого кода с горами глюков. Привычка не экономить ресурсы (МК, процессора, памяти ли) - плохая, хоть и барская. crazy
Утрируя, скажу, что раньше Фотошоп занимал 68 Мб, теперь 3 Гб, а делает тоже самое. Он - Фотошоп. Тоже самое с Офисом и пр.
Про игры вааще помолчу.

<
  • Главный редактор
7 апреля 2016 19:29

Игорь Петрович Котов / Datagor

  • Регистрация: 25.02.2011
  • Публикаций: 262
  • Комментариев: 1607
 
  • +2
Немного весёлого оффтопа

<
  • Бонус
7 апреля 2016 20:09

Ербол / erbol

  • Регистрация: 11.12.2014
  • Публикаций: 7
  • Комментариев: 58
 
  • 0
История из жизни! yahoo

<
  • Кандидат
25 апреля 2016 18:31

/ spasum

  • Регистрация: 4.04.2015
  • Публикаций: 0
  • Комментариев: 2
 
  • 0
Здравствуйте! Во-первых, спасибо вам огромное за статью!
А во-вторых, скажите пожалуйста, если мне хватит и одной–двух освобожденных ног на AtTiny85, но при этом мне очень важно энергопотребление, то бишь важна скорость SPI (быстро передали и уснули), то какой лучше способ использовать из последних трех? Какой менее замедляет SPI? MOMI, CSN_SCK или метод с CE?

<
  • Бонус
27 апреля 2016 09:16

Ербол / erbol

  • Регистрация: 11.12.2014
  • Публикаций: 7
  • Комментариев: 58
 
  • 0
Цитата: spasum
Здравствуйте! Во-первых, спасибо вам огромное за статью!
А во-вторых, скажите пожалуйста, если мне хватит и одной–двух освобожденных ног на AtTiny85, но при этом мне очень важно энергопотребление, то бишь важна скорость SPI (быстро передали и уснули), то какой лучше способ использовать из последних трех? Какой менее замедляет SPI? MOMI, CSN_SCK или метод с CE?

Добрый день! Меньше всего затраты по времени при использовании MOMI, поскольку в двух остальных двух случаях приходится использовать задержки. Но, если речь идёт о передатчике, можно применить ещё один приём - полностью отказаться от линии MISO. В 3 части будет показано, как это сделать. Удачи Вам! smile

<
  • Кандидат
28 апреля 2016 06:02

/ spasum

  • Регистрация: 4.04.2015
  • Публикаций: 0
  • Комментариев: 2
 
  • 0
Спасибо вам за ответ! Да, интересует именно передатчик, с нетерпением жду 3ю часть!

<
  • Бонус
28 апреля 2016 17:09

Ербол / erbol

  • Регистрация: 11.12.2014
  • Публикаций: 7
  • Комментариев: 58
 
  • 0
Почти готова smile. Правда, она для ардуинщиков, но большая часть кода передатчика на Си, так что должна Вам пригодиться

Информация
Вы не можете участвовать в комментировании. Вероятные причины:
— Администратор остановил комментирование этой статьи.
— Вы не авторизовались на сайте. Войдите с паролем.
— Вы не зарегистрированы у нас. Зарегистрируйтесь.
— Вы зарегистрированы, но имеете низкий уровень доступа. Получите полный доступ.