Работа с приемопередатчиком NRF24L01 (2,4 ГГц)

 

Автор статьи: Максим Фил

 

antenna-154946_640

 

Здравствуйте дорогие друзья, многие из Вас хотят заставить обмениваться свои устройства данными без проводов. Для таких случаев есть много различных решений, одно из них — модуль NRF24L01 работающий на частоте 2,4 ГГц. Модуль поставляется в полностью готовом исполнении и работает по протоколу SPI. Модуль имеет восемь ножек, две из которых питание (3,3 В.), четыре — шина SPI, одна отвечает за прерывания и одна используется в зависимости от режима работа модуля (работает как приемником или как передатчик). Все пины, кроме питания, могут воспринимать 5 В (что указанно в даташите)

 

NRF24L01_datasheet_1

 

 

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

Итак, у нас есть модуль с 6ю портами вводавывода. Для демонстрации работы мы будем использовать 5-ть ( нога прерывания IRQ в примере использоваться не будет).

NRF24L01_datasheet_2

Распиновка модуля выглядит следующим образом (картинка взята с просторов интернета):

 

NRF24L01_datasheet_3

 

Где

  • sckтактовый сигнал шины;
  • mosiлиния данных от мастера к передатчику;
  • misoлиния данных от передатчика к мастеру;
  • scnлиния подтвержающая передачу данных от мастера к передатчику, при передаче прижимается мастером к земле.

 

Модуль управляется по интерфейсу SPI.

Как показывает нижеприведенная диаграмма, SPI должен работать в режиме (что такое режимы SPI?), старший бит идет первым.

NRF24L01_datasheet_4

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

NRF24L01_datasheet_5

Как видим по диаграмме после подачи питания мы должны выждать 100 миллисекунд, после этого модуль переходит в режим power down и с ним можно проводить некоторые операции. Как нам говорит даташит, в этом режиме доступны все регистры для чтения и записи. Теперь надо определиться что и как писать.

NRF24L01_datasheet_6

К этой таблице мы вернемся еще, но в первую очередь для проверки работоспособности модуля нас интересует самая последняя команда — nop. Из ее описания понятно, что она ничего не делает и есть приписка: может использоваться для чтения регистра статус. Это то что нам нужно. Мы отправляем по spi 0b11111111 (0xFF), а принять должны регистр статус.

NRF24L01_datasheet_7

Прочитать мы должны 0b00001110(0x0E) Если это так, то можно переходить к следующим действиям. А если модуль ничего не отвечает, то проверьте его подключение. Если это не помогло, то модуль возможно нерабочий.

Теперь нам нужно разобраться как читать и писать в служебные регистры. Приведу вырезку из даташита с описанием регистров:

NRF24L01_datasheet_8

NRF24L01_datasheet_9

NRF24L01_datasheet_10

NRF24L01_datasheet_11

NRF24L01_datasheet_12

NRF24L01_datasheet_13

Вернемся к командам, нас интересует 1-я командачтение регистра. Выглядит она так — 000ААААА, где АААААадрес регистра(первый столбец из таблицы с регистрами).

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

Давайте попробуем прочитать регистр en_aa с адресом 0х01, для этого нам необходимо отправить по SPI два байта 0x01FF (вместо 0xFF может быть другое значение, это не принципиально) и получить в ответ 0b00111111 (0x3F).

С чтением разобрались, теперь запись: команда выглядит как 0х001ААААА. Для записи в регистр en_aa по адресу 0x01 с байта значением 0х00 нам необходимо отправить два байта 0х2100 ( где 0х21 это логическое или между 0010000 и 00000001 ), а записываем мы туда 0-ли, чтобы отключить автоподтверждение доставки.

С чтением и записью регистров мы разобрались. Но это были регистры управления модуля, для данных которые отправляются/принимаются модулем имеется специальный регистр FIFO. Для записи в регистр fifo одного байта надо отправить 0b10100000xxxxxxxx, а для чтения 0b01100001xxxxxxxx.

Как писать и читать данные нам понятно, теперь нам требуется проверить работу приемопередатчиков на практике, для этого нам необходимо выполнить следующие шаги:

 

Для передатчика

 

1. подать питание и выждать 100 мс

2. отключить автоподтверждение по всем каналам (отправляем 0х00 по адресу 0х01)

3. устанавливаем размер отправляемых данных (отправляем 0х01 по адресу 0х11 (для канала данных 0, для других каналов адреса 0х12, 0х13 и т.д.)

4. переводим в режим power-up (записываем 0х0А по адресу 0х00) и выжидаем 1,5 мс

5. записываем любые данные в модуль fifo

6. отправляем данные по радиоканалу (подтягиваем пин СЕ к лог 1це на минимум 10 мкс)

7. читаем регистр статус (если данные отправились, то 5-бит этого регистра будет установлен как 1-ца)

Если выполнить данные шаги, то модуль передаст по радиоканалу данные.

 

Опишем шаги для приемника

 

1. подать питание и выждать 100 мс

2. отключить автоподтверждение по всем каналам (отправляем 0х00 по адресу 0х01)

3. устанавливаем размер отправляемых данных (отправляем 0х01 по адресу 0х11 (для канала данных 0, для других каналов адреса 0х12, 0х13 и т.д.)

4. включаем прием по всем каналам (отправляем 0x3f по адресу 0х02)

5. переводим в режим powerup (записываем 0х0А по адресу 0х00) и выжидаем 1,5 мс

6. переводим модуль в режим приемника (записываем 0х0В по адресу 0х00)

7. прижаем пин СЕ к лог. 1-це и выжидаем 150 мкс

Таким образом модуль переведен в режим приемника, теперь периодически надо считывать регистр статус и если установлен 6-й бит, то прочитать данные из FIFO.

Вот собственно и все, выкладываю исходники приемника и передатчика для atmega16A на ассемблере.

 

Передатчик

 

Приемник

 




Буду признателен если вы поделитесь данным постом


Ваш комментарий


Ответ в цифрах

 
© s-engineer.ru, 2012-2018 | Все права защищены