В принципе, этот пост просто перепись моих исследований, ибо в русскоязычном сегменте сети есть только одна, много раз скопированная статья MaxMS (http://habrahabr.ru/post/210974/). В принципе, я довольно много подчерпнул оттуда.
Итак, у меня есть контроллеры на данном чипсете и есть желание сделать с ними что-либо полезное. Но прежде “деланья” чего-либо полезного, надо этот контроллер запрограммировать. Вместе с контроллером ко мне попал “официальный” программатор, но чего с ним можно делать, я даже не разбирался, потому что неспортивно.
Для начала я определил, какая именно версия nrf у меня.
Судя по плате (плюс я глазами пересчитал выводы), у меня 32х пиновая версия.
А значит, из этой таблички берем среднее
Теперь как программировать. Из той же статьи наиболее приемлемым для меня оказался вариант с Raspberry Pi. Во-первых, у него везде 3,3 вольта, а во вторых, из него легко получается мобильный комплекс – воткнул wifi и питание и все, комп для прошивки готов.
Результатом стал следующий ужас
Для памяти
RESET и VDD – на 3,3
GND – на землю
FCSN – 24я ножка CE0
PROG – 18я ножка GPIO24
Остальное согласно SPI на малинке. MISO-MISO, MOSI-MOSI и так далее
Затем выкачиваю с гитхаба https://github.com/derekstavis/nrf24le1-libbcm2835 программатор и собираю его
Первая проверка в виде попытки прочитать nvram выдала одни нули. Сначала я подумал, что либо контроллер дохлый, либо что-то не так подключил или какой-нибудь модуль не догрузил (Raspberry в этом отношении очень капризный), но попытка прочитать программу удалась
# ./nrf24le1 read firmware
[nrf24le1] nrf24le1_init: Initializing nRF24LE1
Initiate programming
Number of bytes to read: 16384, max flash size 16384
[nrf24le1] uhet_read: read addr: 0x0xbeae07dd, pack header: 0x3 0x0 0x0, bytes read: 16384
:2000000002024D41808B004180890142808D0000458084345678901200E4FDFCC3ED9FECA4
:200020009E501D908055E4F0A3746CF090805574FFF5F011F645F070F30DBD00010C80DC7A
:2000400022E490808AF0A3F022FFFFA10BC291914FE4FF914FD2912280E7FF0208EA80E17B
:20006000FFFFFF020CEABB010689828A83E0225002E722BBFE02E32289828A83E49322BB28
:20008000010CE58229F582E5833AF583E0225006E92582F8E622BBFE06E92582F8E222E51A
:2000A0008229F582E5833AF583E49322BB010689828A83F0225002F722BBFE01F322F8BB92
:2000C000010DE58229F582E5833AF583E8F0225006E92582C8F622BBFE05E92582C8F22207
:2000E000C5F0F8A3E028F0C5F0F8E582158270021583E038F022A3F8E0C5F025F0F0E5823D
.....
Внутри что-то записано и это что-то не очень похоже на мусор. Но для меня это мусор, ибо я не в курсе, что там записано и для чего.
Теперь надо проверить, что прошивка работает. Читаем в test текущую фирмварь
./nrf24le1 read firmware test
Любым редактором ее портим, но по-своему (я просто записал посрединке немного байтиков со значениями 0х01-0х20) и заливаем назад и пофиг, что работать не будет.
./nrf24le1 write firmware test
И тут же читаем назад, но в другой фаил.
./nrf24le1 read firmware test1
А теперь ищем в test1 наши правки. Если они есть – значит “программатор” работает. У меня все заработало. Теперь можно и свою программу написать 🙂
Посмотрел на официальный SDK, покривился, забрал “правленный”, взял пример с дерганьем порта p0.0
#include <stdint.h>
#include <stdio.h>
//подключение необходимых функций:
#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);
}
}
Пытаемся скомпилировать
# sdcc -Iinclude led_main.c
# ls -l
total 312
drwxr-xr-x 2 root root 4096 Jan 30 2014 include
-rw-r--r-- 1 root root 29083 Jan 13 13:14 led_main.asm
-rw-r--r-- 1 root root 850 Jan 13 13:13 led_main.c
-rw-r--r-- 1 root root 2382 Jan 13 13:14 led_main.ihx
-rw-r--r-- 1 root root 248 Jan 13 13:14 led_main.lk
-rw-r--r-- 1 root root 80283 Jan 13 13:14 led_main.lst
-rw-r--r-- 1 root root 26676 Jan 13 13:14 led_main.map
-rw-r--r-- 1 root root 1129 Jan 13 13:14 led_main.mem
-rw-r--r-- 1 root root 14900 Jan 13 13:14 led_main.rel
-rw-r--r-- 1 root root 80283 Jan 13 13:14 led_main.rst
-rw-r--r-- 1 root root 48610 Jan 13 13:14 led_main.sym
-rw-rw-rw- 1 root root 3087 Jan 31 2014 libs.h
drwxr-xr-x 22 root root 4096 Jan 30 2014 src
Судя по содержимому, мне нужно залить lem_main.ihx. Только формат ему поменять. Заодно и выкачиваю hex2bin (http://hex2bin.sourceforge.net)
# ./hex2bin -p 00 led_main.ihx
hex2bin v1.0.12, Copyright (C) 2012 Jacques Pelletier & contributors
Lowest address = 00000000
Highest address = 000003C2
Pad Byte = 0
8-bit Checksum = FB
Ну теперь полученный led_main.bin можно залить в контроллер.
# ./nrf24le1 write firmware led_main.bin
А теперь посмотрим осциллографом на вывод P0.0
Как видим, все согласно программе: 500мс включено и 500мс выключено.
Как говорится, ура. Обязательная программа для любого микроконтроллера работает как надо.
Но вообще-то у меня немного другая задача: связать два микроконтроллера между собой по радиоканалу и оценить, насколько он работоспособен в условиях обычной многоэтажки, где диапазон 2,4ГГц забит напрочь и намертво WiFi.
Но это тема следующего поста. Или даже через одного 🙂