January 20, 2021, 05:31:37 pm

News:

Have you visited the Allwinner Chipset wiki? - http://linux-sunxi.org/


nRF24L01

Started by bearpaw, April 24, 2014, 04:39:55 pm

Previous topic - Next topic

UnКаЙF

May 10, 2014, 03:29:32 pm #15 Last Edit: May 10, 2014, 04:13:50 pm by UnКаЙF
С умом - вставить в цикл что-то вроде sched_yield(). Только вот оно не везде работает. Ну или usleep, там. А использование прерываний вместо просто даже опроса пина через gpio только усложнит жисть  ;)

UnКаЙF

May 11, 2014, 11:14:35 am #16 Last Edit: July 05, 2014, 05:34:43 am by UnКаЙF
Вот. Несколько избыточно, но аппаратный CS должен работать.
UPD: Перезалил вариант библиотеки использующий только аппаратный CS SPI-контроллера.

UnКаЙF

Один из моих модулей иногда ловит ошибки по SPI на 12MHz скорости. Снизил у себя до 8 MHz в RF24::begin();

bearpaw

Quote from: UnКаЙF on May 12, 2014, 12:54:45 pm
Один из моих модулей иногда ловит ошибки по SPI на 12MHz скорости. Снизил у себя до 8 MHz в RF24::begin();


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

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


UnКаЙF

У мя вот такие: http://www.ebay.com/itm/2PCS-Arduino-NRF24L01-2-4GHz-Wireless-Transceiver-Module-New-/170819064718?pt=LH_DefaultDomain_0&hash=item27c59c138e
Возможно китайский клон, а возможно ёмкость монтажа моей макетки влияет.

bearpaw

Quote from: UnКаЙF 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
Возможно китайский клон, а возможно ёмкость монтажа моей макетки влияет.


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

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

UnКаЙF


bearpaw

Quote from: UnКаЙF on May 15, 2014, 05:21:00 am
Макетка:


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

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


UnКаЙF

Голь на выдумки хитра. Использовал разъем от переходника ноутбучного винта.

bearpaw

Кстати, вот создал репозиторий с библиотекой на гитхабе...
https://github.com/bearpawmaxim/librf24-sunxi

Mochalov_da

А вот и я 8)
Сделал:
Quotethis->mode = 0 | SPI_LOOP;

Теперь получаю:

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.

Что это значит?

UnКаЙF

May 16, 2014, 12:28:57 pm #26 Last Edit: May 16, 2014, 12:34:15 pm by UnКаЙF
Не. Не то. Странно, в общем. Нигде не ошибся больше, ну, там, CE и CSN  ?

Mochalov_da

Что то с CE... Отключаю его от платы и тест без изменений.
CE в main:
RF24 radio(SUNXI_GPB(11), SUNXI_GPB(18), "/dev/spidev0.0");
CE в script.bin

[gpio_para]
gpio_used = 1
gpio_num = 63
...
gpio_pin_61 = port:PB11<1><default><default><1>

Что еще не проверил?

UnКаЙF

May 16, 2014, 02:20:25 pm #28 Last Edit: May 16, 2014, 02:29:33 pm by UnКаЙF
CE подтяните к GND, а CSN к +3.3V через резисторы 10-47к. Пин для СSN используйте не тот, который аппаратно использует SPI-контроллер. Также, проверьте используя тестер и sys/class/gpio интерфейс работают ли выбранные вами пины на выход, т.е. 0,1 и померить.

UPD:CSN: глянул мапинг PB - вижу, что не тот же.

aspinx

June 22, 2014, 08:54:38 am #29 Last Edit: June 28, 2014, 06:27:16 am by aspinx
Попытался завести 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:
bin2fex /boot/script.bin /boot/script.fex

включаем spi в script.fex (или добавляем если нет)

[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
fex2bin /boot/script.fex /boot/script.bin
и перезагружаемся.

6. у меня модуль был вкомпилен в ядро, потому modprobe не понадобился. проверяем что spi нашлось

$ 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



$ls /dev/spi*
/dev/spidev0.0


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

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)) и убеждаемся что вывод похож на такой:

$ ./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

пин 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. (опционально) проверяем что линковщик видит библиотеку:
ldconfig -v |grep librf24
если не видит (как это было у меня), то делаем файл /etc/ld.so.conf.d/local.conf с содержимым
/usr/local/lib
и проверяем ldconfig еще раз

3. заходим в test и убеждаемся что в файле arduino_rcv.cpp имя устройства и номера пинов такие:

RF24 radio(SUNXI_GPB(13), SUNXI_GPB(10), "/dev/spidev0.0");


собираем

$ cd ./test && make


4. запускаем ./arduino_rcv и убеждаемся что в регистрах не нули, не 0xff или что то еще похожее на мусор. Должно быть как то так:

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)

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

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


#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

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, но в моем простом тесте какой либо особой разницы я не заметил. Может быть не туда смотрел?