Author Topic: nRF24L01  (Read 31478 times)

Offline UnКаЙF

  • Full Member
  • ***
  • Posts: 241
  • Karma: +9/-6
    • View Profile
Re: nRF24L01
« Reply #15 on: May 10, 2014, 03:29:32 pm »
С умом - вставить в цикл что-то вроде sched_yield(). Только вот оно не везде работает. Ну или usleep, там. А использование прерываний вместо просто даже опроса пина через gpio только усложнит жисть  ;)
« Last Edit: May 10, 2014, 04:13:50 pm by UnКаЙF »

Offline UnКаЙF

  • Full Member
  • ***
  • Posts: 241
  • Karma: +9/-6
    • View Profile
Re: nRF24L01
« Reply #16 on: May 11, 2014, 11:14:35 am »
Вот. Несколько избыточно, но аппаратный CS должен работать.
UPD: Перезалил вариант библиотеки использующий только аппаратный CS SPI-контроллера.
« Last Edit: July 05, 2014, 05:34:43 am by UnКаЙF »

Offline UnКаЙF

  • Full Member
  • ***
  • Posts: 241
  • Karma: +9/-6
    • View Profile
Re: nRF24L01
« Reply #17 on: May 12, 2014, 12:54:45 pm »
Один из моих модулей иногда ловит ошибки по SPI на 12MHz скорости. Снизил у себя до 8 MHz в RF24::begin();

Offline bearpaw

  • Jr. Member
  • **
  • Posts: 72
  • Karma: +7/-0
    • View Profile
Re: nRF24L01
« Reply #18 on: May 12, 2014, 01:53:27 pm »
Один из моих модулей иногда ловит ошибки по SPI на 12MHz скорости. Снизил у себя до 8 MHz в RF24::begin();

А у меня - стабильно на 12MHz :)
Модули такие http://m.ebay.com/itm/110929270444?nav=SEARCH

Отправлено с моего GT-I9100 через Tapatalk


Offline UnКаЙF

  • Full Member
  • ***
  • Posts: 241
  • Karma: +9/-6
    • View Profile
Re: nRF24L01
« Reply #19 on: May 12, 2014, 02:02:32 pm »
У мя вот такие: http://www.ebay.com/itm/2PCS-Arduino-NRF24L01-2-4GHz-Wireless-Transceiver-Module-New-/170819064718?pt=LH_DefaultDomain_0&hash=item27c59c138e
Возможно китайский клон, а возможно ёмкость монтажа моей макетки влияет.

Offline bearpaw

  • Jr. Member
  • **
  • Posts: 72
  • Karma: +7/-0
    • View Profile
Re: nRF24L01
« Reply #20 on: May 12, 2014, 02:38:53 pm »
У мя вот такие: http://www.ebay.com/itm/2PCS-Arduino-NRF24L01-2-4GHz-Wireless-Transceiver-Module-New-/170819064718?pt=LH_DefaultDomain_0&hash=item27c59c138e
Возможно китайский клон, а возможно ёмкость монтажа моей макетки влияет.

Да это, по сравнению с моими, благородные модули! :)

А вот и моя "макетка" :D

Offline UnКаЙF

  • Full Member
  • ***
  • Posts: 241
  • Karma: +9/-6
    • View Profile
Re: nRF24L01
« Reply #21 on: May 15, 2014, 05:21:00 am »
Макетка:

Offline bearpaw

  • Jr. Member
  • **
  • Posts: 72
  • Karma: +7/-0
    • View Profile
Re: nRF24L01
« Reply #22 on: May 15, 2014, 06:15:55 am »
Макетка:

А что это там за хитрый IDC такой?

Отправлено с моего GT-I9100 через Tapatalk


Offline UnКаЙF

  • Full Member
  • ***
  • Posts: 241
  • Karma: +9/-6
    • View Profile
Re: nRF24L01
« Reply #23 on: May 15, 2014, 07:38:09 am »
Голь на выдумки хитра. Использовал разъем от переходника ноутбучного винта.

Offline bearpaw

  • Jr. Member
  • **
  • Posts: 72
  • Karma: +7/-0
    • View Profile
Re: nRF24L01
« Reply #24 on: May 15, 2014, 07:43:42 am »
Кстати, вот создал репозиторий с библиотекой на гитхабе...
https://github.com/bearpawmaxim/librf24-sunxi

Offline Mochalov_da

  • Newbie
  • *
  • Posts: 25
  • Karma: +0/-0
    • View Profile
Re: nRF24L01
« Reply #25 on: May 16, 2014, 11:58:17 am »
А вот и я 8)
Сделал:
Quote
this->mode = 0 | SPI_LOOP;
Теперь получаю:
Code: [Select]
STATUS = 0x1c RX_DR=0 TX_DS=0 MAX_RT=1 RX_P_NO=6 TX_FULL=0
RX_ADDR_P0-1 = 0x1c1c1c1c1c 0x1c1c1c1c1c
RX_ADDR_P2-5 = 0x1c 0x1c 0x1c 0x1c
TX_ADDR = 0x1c1c1c1c1c
RX_PW_P0-6 = 0x1c 0x1c 0x1c 0x1c 0x1c 0x1c
EN_AA = 0x1c
EN_RXADDR = 0x1c
RF_CH = 0x1c
RF_SETUP = 0x1c
CONFIG = 0x1c
DYNPD/FEATURE = 0x1c 0x1c
Data Rate = 2MBPS
Model = nRF24L01
CRC Length = 16 bits
PA Power = LA_MED
Now sending length 4...Failed, response timed out.
Что это значит?

Offline UnКаЙF

  • Full Member
  • ***
  • Posts: 241
  • Karma: +9/-6
    • View Profile
Re: nRF24L01
« Reply #26 on: May 16, 2014, 12:28:57 pm »
Не. Не то. Странно, в общем. Нигде не ошибся больше, ну, там, CE и CSN  ?
« Last Edit: May 16, 2014, 12:34:15 pm by UnКаЙF »

Offline Mochalov_da

  • Newbie
  • *
  • Posts: 25
  • Karma: +0/-0
    • View Profile
Re: nRF24L01
« Reply #27 on: May 16, 2014, 01:59:54 pm »
Что то с CE... Отключаю его от платы и тест без изменений.
CE в main:
Code: [Select]
RF24 radio(SUNXI_GPB(11), SUNXI_GPB(18), "/dev/spidev0.0");CE в script.bin
Code: [Select]
[gpio_para]
gpio_used = 1
gpio_num = 63
...
gpio_pin_61 = port:PB11<1><default><default><1>
Что еще не проверил?

Offline UnКаЙF

  • Full Member
  • ***
  • Posts: 241
  • Karma: +9/-6
    • View Profile
Re: nRF24L01
« Reply #28 on: May 16, 2014, 02:20:25 pm »
CE подтяните к GND, а CSN к +3.3V через резисторы 10-47к. Пин для СSN используйте не тот, который аппаратно использует SPI-контроллер. Также, проверьте используя тестер и sys/class/gpio интерфейс работают ли выбранные вами пины на выход, т.е. 0,1 и померить.

UPD:CSN: глянул мапинг PB - вижу, что не тот же.
« Last Edit: May 16, 2014, 02:29:33 pm by UnКаЙF »

Offline aspinx

  • Newbie
  • *
  • Posts: 8
  • Karma: +0/-0
    • View Profile
Re: nRF24L01
« Reply #29 on: June 22, 2014, 08:54:38 am »
Попытался завести nRF24L01 на cubieboard2 для приема данных с arduino. В разных местах в интернетах уже написано, но захотелось описать весь процесс в одном месте, на случай если это пригодится кому то еще. Все что написано ниже делалось на archlinux (gcc 4.8.2).


Поддеркжка SPI

В целом следуем инструкции в http://www.cubieforums.com/index.php/topic,1697.msg14252.html#msg14252
1. ядро 3.4.79 из https://github.com/patrickhwood/linux-sunxi.git
2. конфиг взять из работающей системы /proc/config.gz
3. пункт 3 с SUBARCH не понадобился
4. заливаем uImage и модули ядра на кубик (в /boot/ и /lib/modules/ соответсвенно)
5. распаковываем script.bin в script.fex c помощью sunxi-tools:
Code: [Select]
bin2fex /boot/script.bin /boot/script.fex
включаем spi в script.fex (или добавляем если нет)
Code: [Select]
[spi0_para]
spi_used = 1
spi_cs_bitmap = 1
spi_cs0 = port:PI10<2><default><default><default>
spi_cs1 = port:PI14<2><default><default><default>
spi_sclk = port:PI11<2><default><default><default>
spi_mosi = port:PI12<2><default><default><default>
spi_miso = port:PI13<2><default><default><default>

[spi_devices]
spi_dev_num = 1

[spi_board0]
modalias = "spidev"
max_speed_hz = 12000000
bus_num = 0
chip_select = 0
mode = 0
full_duplex = 1
manual_cs = 0

запаковываем fex обратно в bin
Code: [Select]
fex2bin /boot/script.fex /boot/script.binи перезагружаемся.

6. у меня модуль был вкомпилен в ядро, потому modprobe не понадобился. проверяем что spi нашлось
Code: [Select]
$ dmesg |grep spi
[    1.593037] [spi-inf] Found 1 spi devices in config files
[    1.605207] [spi-inf] boards num modalias         max_spd_hz       bus_num  cs   mode
[    1.616808] [spi-inf] spi_board0 irq gpio not used
[    1.628551] [spi-inf] 0          spidev           12000000         0        0    0x0   
[    1.641295] [spi-inf] sun7i_spi_probe: spi0 dma type: normal
[    1.650532] [spi-inf] bus num = 0, spi used = 1
[    1.659586] [spi-inf] sun7i_spi_probe: spi0 cs bitmap: 0x1
[    1.673710] [spi-inf] sun7i_spi_set_mclk: spi0 source = sdram_pll_p, src_clk = 480000000, mclk 120000000
[    1.689031] sun7i-spi sun7i-spi.0: master is unqueued, this is deprecated
[    1.704758] [spi-inf] sun7i_spi_probe: reuuimlla's SoC SPI Driver loaded for Bus SPI0 with 2 Slaves at most
[    1.723882] [spi-inf] sun7i_spi_probe: spi0 driver probe succeed, base f0070000, irq 42, dma_id_rx 24, dma_id_tx 24

Code: [Select]
$ls /dev/spi*
/dev/spidev0.0

8. проверяем что в структуре spi_ioc_transfer в /usr/include/linux/spi/spidev.h есть поле __u16           interbyte_usecs; (у меня не было, без него тесты librf24 падали в coredump)
Code: [Select]
struct spi_ioc_transfer {
        __u64           tx_buf;
        __u64           rx_buf;

        __u32           len;
        __u32           speed_hz;

        __u16           interbyte_usecs; // <<===
        __u16           delay_usecs;
        __u8            bits_per_word;
        __u8            cs_change;
        __u32           pad;

9. (опционально) проверяем что модуль spi работает. собираем spidev_test (его лучше брать прямо из исходников ядра ./linux-sunxi/Documentation/spi/spidev_test.c, но так получилось что сборкой gcc 4.8.2 его пришлось немного подправить. измененная версия есть в моем форке librf24 ниже), замыкаем mosi и miso (для /dev/spidev0.0 с конфигом из script.fex выше это будут пины 46(PI12) и 48(PI13)) и убеждаемся что вывод похож на такой:
Code: [Select]
$ ./spidev_test
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)

FF FF FF FF FF FF
40 00 00 00 00 95
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
DE AD BE EF BA AD
F0 0D

Подключение nRF24l01 к кубику

Будем использовать устройство /dev/devspi0.0
Code: [Select]
пин nRF24l01 -> пин Cubieboard
1 GND -> 45 GND
2 3.3V -> 44 3.3V
3 CE -> 41, PB13
4 CSN -> 40, PB10
5 SCK -> 47, PI11
6 MOSI -> 46, PI12
7 MISO -> 48, PI13

схема пинов nrfl

общая схема пинов кубика
http://nanospic.com/wp-content/uploads/2014/03/GPIO_Tester.png
пины выходят вниз платы, поэтому перевернув плату все будет отзеркалено.
вообщем, к перевернутому кубику нужно подключать вот так:


берем библиотеку librf24 от bearpaw (я беру свой форк, с мелкими патчами для сборки на archlinux и тестом для arduino скетча который будет ниже)
1. git clone https://github.com/mplatov/librf24-sunxi.git
2. собираем make && make install
3. (опционально) проверяем что линковщик видит библиотеку:
Code: [Select]
ldconfig -v |grep librf24если не видит (как это было у меня), то делаем файл /etc/ld.so.conf.d/local.conf с содержимым
Code: [Select]
/usr/local/libи проверяем ldconfig еще раз

3. заходим в test и убеждаемся что в файле arduino_rcv.cpp имя устройства и номера пинов такие:
Code: [Select]
RF24 radio(SUNXI_GPB(13), SUNXI_GPB(10), "/dev/spidev0.0");

собираем
Code: [Select]
$ cd ./test && make

4. запускаем ./arduino_rcv и убеждаемся что в регистрах не нули, не 0xff или что то еще похожее на мусор. Должно быть как то так:
Code: [Select]
STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1 = 0xf0f0f0f0e1 0xf0f0f0f0e1
RX_ADDR_P2-5 = 0xc3 0xc4 0x00 0xc6
TX_ADDR = 0xf0f0f0f0e1
RX_PW_P0-6 = 0x20 0x20 0x00 0x00 0x00 0x00
EN_AA = 0x3f
EN_RXADDR = 0x03
RF_CH = 0x32
RF_SETUP = 0x09
CONFIG = 0x6f
DYNPD/FEATURE = 0x3f 0x04
Data Rate = 2MBPS
Model = nRF24L01+
CRC Length = 16 bits
PA Power = PA_MIN
                                                                           
Если все получилось, то оставляем ./arduino_rcv висеть запущенным в консоли и переходим к скетчу для ардуино.

Ардуино скетч.
С помощью библиотеки RF24 откроем pipe, в который каждую секунду будем писать значение увеличивающегося счетчика. Программа на кубике будет читать значения из пайпа и выводить их в консоль.

Подключение nRF24l01 к arduino (проверялось на nano, но должно подойти ко всему кроме mega, там другие пины для spi)
Code: [Select]
1 GND -> GND
2 VCC 3.3V -> 3.3V
3 CE - D9
4 CSN - D10
5 SCK - D13
6 MOSI - D11
7 MISO - D12

Библиотеку RF24 берем отсюда https://github.com/gcopeland/RF24 и устанавливаем ее в arduino studio

делаем новый скетч с таким кодом:

Code: [Select]
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(9, 10); // Create a Radio

void setup()
{
  Serial.begin(115200);
 
  radio.begin();
  radio.setDataRate(RF24_2MBPS);
  radio.setPALevel(RF24_PA_HIGH);
  radio.setChannel(50);
  radio.openWritingPipe(0xF0F0F0F0E1LL);
  radio.enableDynamicPayloads(); 
  radio.setCRCLength(RF24_CRC_16);
radio.powerUp();
}

unsigned long count = 0;
char outBuffer[32]= ""; // 32 bytes is maximum payload

void loop()
{
    // pad numbers and convert to string
    sprintf(outBuffer,"%2d", count);
 
    // transmit and increment the counter
    radio.write(outBuffer, strlen(outBuffer));
    Serial.println(count);
    count++;
 
    // pause a second
    delay(1000);
}

Запускаем. Если все работает то в консоли на кубике с запущенным arduino_rcv появятся цифры счетчика с arduino
Code: [Select]
0
1
2
3
4
5
6
7
8
9
10                     

PROFIT!!!

Особая благодарность bearpaw за работающий порт librf24!

PS: с RF24_sun7i+hardware_CS.tar.gz от UnКаЙF тоже работает, но нужно поменять пин CS на PI12, пин 46, но в моем простом тесте какой либо особой разницы я не заметил. Может быть не туда смотрел?





« Last Edit: June 28, 2014, 06:27:16 am by aspinx »