image
Некоторое время назад на хабре упоминались недорогие (от $6 ) радиомодули nRF24LE1 со встроенным микроконтроллером.На этих радиомодулях ребята из COOLRF планировали осуществлять свой проект, но в итоге «переехали» на более дорогой чип Atmega128RFA1, а nRF24LE1 как я понял отодвинули на второй план.

В статье мы рассмотрим возможность прошивки радиомодуля через Raspberry PI и USBasp а так же пару примеров кода на Си.

Описание nRF24LE1


Существует 3 варианта корпуса чипа: QFN24 (4×4 mm), QFN32 (5×5 mm), QFN48 (7×7 mm). И периферия I2C, UART, SPI у каждого варианта находятся на разных выводах (см с 131 страницы даташита). Здесь я рассмотрю вариант QFN32 и технические характеристики будут относится к нему.

Радиопередающая часть полностью аналогична «безмозглому» варианту nRF24L01+:
2.4 Ггц,125 каналов. Поддерживаемые скорости 250kbps, 1Mbps и 2Mbps и т.д.

Встроенный же 8051-совместимый микроконтроллер имеет следующие параметры:
  • Тактовая частота 16мгц.Частотой можно управлять (понижать до 125кгц) в реальном времени.
  • Доступная flash память для программы 16кб.
  • ОЗУ (RAM) память 1 кб.
  • 1 кб. NVRAM (EEPROM память)
  • 7 выводов поддерживают 6..12 битных АЦП.
  • Два восьмибитных PWM (ШИМ) вывода.
  • А так же имеются интерфейсы: I2C, UART, SPI.
  • Напряжение питания 1,9В...3,6В.
  • Программирование через slave SPI.

Программирование nRF24LE1 через Raspberry PI


Прошить nRF24LE1 возможно через «родной» программатор, который относительно дорог — около $30 на Ebay. Цена мне конечно не понравилась и на просторах интернета был найден вариант программатора на основе Raspberry PI github.com/derekstavis/nrf24le1-libbcm2835. Исходный код программатора был немного модифицирован и русифицирован — пришлось переводить с португальского. Модифицированную версию можно скачать по ссылке в конце статьи.

Для программирования радиомодуля необходимо подключить выводы SPI согласно таблице:
image
Вывод PROG nRF24LE1 необходимо подключить к 24 выводу GPIO на Raspberry PI. FCSN подключаем аналогично на СЕ0 (вывод 8) .Reset подтягиваем на плюс. Не забываем подключить GND к минусу и VDD к +3.3в.
Карта нумерации выводов радиомодуля может быть разная(из-за разного корпуса микросхемы и разводки печатной платы) и обычно данную информацию можно найти там же где продается сам nRF24LE1, например при покупке на Ebay карта нуме��ации указывается на странице товара.

Для заливки прошивки воспользуемся скомпилированной программой nrf24le1 используя следующие команды:
  • ./nrf24le1 test — выводит тестовую информацию nRF24LE1 (InfoPage).
  • ./nrf24le1 write — прошьет файл main.bin, лежащий в этой же папке в nRF24LE1.
  • ./nrf24le1 read -создаст дамп прошивки из nRF24LE1 под имененем main-dump.bin .

Программирование nRF24LE1 через USBasp


После изучения варианта прошивки через Raspberry PI, был разработан свой вариант более простой, который может реализовать любой пользователь, программирующий микроконтроллеры AVR и имеющий на вооружении программатор USBasp. Про данный программатор ранее я упоминал, реализовав на нём несколько разнообразных устройств в том числе nRF24L01-USB.
Для данной идеи был использован тот же исходный код программатора под Raspberry PI. А USBasp перепрограммирован в USB-SPI переходник используя библиотеку V-USB.
Программатор на базе USBasp относительно медленный -вся прошивка в 16кб. «заливается» за 12 секунд, но это компенсируется ценой — все же цена этого программатора $3, а не $30.
Подключение nRF24LE1 к USBasp в следущем порядке, по нумерации десяти контактного разъема:
image
Кстати, неясно толерантны ли выводы nRF24LE1 к 5 Вольтам и нужны ли делители на резисторах для согласования уровней между nRF24LE1 и USBasp. В итоге я не использовал делители и никаких негативных последствий не получил — Вы можете так же не устанавливать делители, но на свой страх и риск. Например у nRF24L01+ выводы толеранты и допускают подключение 5 Вольтовым микроконтроллерам.
Все действия по программированию аналогичны программированию через Raspberry PI.

Пишем первые программы на nRF24LE1


Для написания программы я воспользовался бесплатным кросс платформенным компилятором SDCC sdcc.sourceforge.net.
nRF24LE1 имеет SDK, где расписаны основные функции для работы с микроконтроллером.Этот SDK проверен и поправлен мною. Он собран из нескольких источников.

Вот так выглядит пример мигания светодиодом
#include <stdint.h>
#include <stdio.h>

//подключение необходимых функций SDK:

#include "src/gpio/src/gpio_pin_configure.c"
#include "src/gpio/src/gpio_pin_val_clear.c"
#include "src/gpio/src/gpio_pin_val_set.c"

#include "delay.h"
#include "src/delay/src/delay_us.c"
#include "src/delay/src/delay_s.c"
#include "src/delay/src/delay_ms.c"

void main()
{
 // мигаем портом P0_0
	gpio_pin_configure(GPIO_PIN_ID_P0_0, // укажем необходимые параметры
			GPIO_PIN_CONFIG_OPTION_DIR_OUTPUT |
			GPIO_PIN_CONFIG_OPTION_OUTPUT_VAL_CLEAR |
			GPIO_PIN_CONFIG_OPTION_PIN_MODE_OUTPUT_BUFFER_NORMAL_DRIVE_STRENGTH);
	
		while(1)
	{
gpio_pin_val_set(GPIO_PIN_ID_P0_0); // установка в 1
	 delay_ms(500); 
gpio_pin_val_clear(GPIO_PIN_ID_P0_0); //установка в 0
	 delay_ms(500); 
	}
}


Пример плавного зажигания светодиода используя PWM вывод
#include <stdio.h>

//подключение необходимых функций SDK:
#include "delay.h"
#include "src/delay/src/delay_us.c"
#include "src/delay/src/delay_s.c"
#include "src/delay/src/delay_ms.c"

#include "src/pwm/src/pwm_configure.c"
#include "src/pwm/src/pwm_start.c"

void main()
{
int i=0;
  // делитель на 10 , битность 8
  pwm_configure(PWM_CONFIG_OPTION_PRESCALER_VAL_10 || PWM_CONFIG_OPTION_WIDTH_8_BITS);
  
	//main program loop
	while(1)
	{

pwm_start(PWM_CHANNEL_0,i);

	  i++;

	 delay_ms(200);   

	 if (i>255) i=0;

	}
}



В данный момент доделываю пример для работы с nRF24L01-USB. Уже реализовано чтение датчика DHT22 и управление нагрузками по радиоканалу. В будущем планирую сделать примерный аналог библиотеки Arduino RF24 -осталось доделать пару функций.
В целом, после программирования на микроконтроллерах AVR программирование nRF24LE1 мне показался не чуть не сложным.

UPD: Забыл упомянуть, что компилятор создает hex файл, а программаторам нужен бинарный. Для преобразования файла можно воспользоваться утилитой hex2bin. Можно прописать команду hex2bin -p 00 main.ihx в make файл.

Какие подручные железки можно ещё переделать под программирование nRF24LE1 ?


Подойдет любой аналогичный мини компьютеру Raspberry PI, например Cubieboard.
Можно реализовать программатор на Arduino. Возможно займусь таким вариантом.
Любой микроконтроллер с аппаратной поддержкой USB, например STM-ки.

Исходные коды и пример:
Программатор на Raspberry PI
Программатор на USBasp (обновлено 5.02.14)
SDK
led_delay
Даташит

Может что-то упустил и остались вопросы — пишите в комментариях.