January 20, 2021, 06:33:19 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

bearpaw

April 24, 2014, 04:39:55 pm Last Edit: May 16, 2014, 01:30:26 pm by bearpaw
Всем салют!
Решил вот открыть тему для всех желающих поработать с трансивером nRF24L01(+) на наших cubieboard1/2/3.

Имеется рабочая, портированная под cubiebord'ы библиотека RF24 в git'e: https://github.com/bearpawmaxim/librf24-sunxi

Библиотека "мультиплатформенна", т.е. может работать как на sun4i (a10), так и на sun7i (a20).

Для сборки библиотеки для a10 пишем
make librf24-sun4i
, для a20, соответственно
make librf24-sun7i

Далее, либо устанавливаем либу коммандой
sudo make install
, либо идем в папку и запускаем комманду make для сборки тестов.

Раджа

А вот эти все параметры в хидер типа config.h нельзя перенести?
Заткнись и смотри аниме!

bearpaw

Quote from: Раджа on April 25, 2014, 12:46:38 am
А вот эти все параметры в хидер типа config.h нельзя перенести?


Какие все параметры?  :)

Раджа

Quote, где SUNXI_GPB(16) - задание пина CE,
        SUNXI_GPB(17) - задание пина CSN
        "/dev/spidev2.0" - задание spi-девайса, доступного в папке /dev


Вот это вот всё.
Заткнись и смотри аниме!

bearpaw

Quote from: Раджа on April 25, 2014, 03:27:58 am
Quote, где SUNXI_GPB(16) - задание пина CE,
        SUNXI_GPB(17) - задание пина CSN
        "/dev/spidev2.0" - задание spi-девайса, доступного в папке /dev


Вот это вот всё.


ИМХО, ради трёх параметров городить отдельный хидер нецелесообразно

UnКаЙF

May 07, 2014, 02:03:43 pm #5 Last Edit: May 07, 2014, 02:46:56 pm by UnКаЙF
To Mochalov_da:
Поправьте у себя в библиотеке файл spi.cpp:
вместо
this->mode = 0;
добавить
this->mode = 0 | SPI_LOOP;
Пробуйте..
ИМХО: решать проблему кардинально - дофига в ядре править.
(Внимание ! Только при использовании spi-sunxi.c драйвера. Не spi-sun7i.c !)

bearpaw

Quote from: UnКаЙF on May 07, 2014, 02:03:43 pm
To Mochalov_da:
Поправьте у себя в библиотеке файл spi.cpp:
вместо
this->mode = 0;
добавить
this->mode = 0 | SPI_LOOP;
Пробуйте..
ИМХО: решать проблему кардинально - дофига в ядре править.


Нет уж, при выставлении свойства SPI_LOOP матерится про invalid argument.
А так то трансивер уже работает.

Сейчас думаю относительно протокола общения со слейв-девайсами - несколькими датчиками температуры/давления/влажности.

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


UnКаЙF

May 07, 2014, 02:40:28 pm #7 Last Edit: May 07, 2014, 02:43:59 pm by UnКаЙF
Да. В spi-sun7i.c этот бит запрещен, а в spi-sunxi.c - нет. Думал, может, можно вставить волшебный #ifdef в библиотеку, для определения текущей модели SoC, но так просто оно не далось. Нужно делать вызов в runtime для определения версии драйвера, - короче усложнять.

По протоколам для nrf24 - интересно, - есть ли что-то общепринятое для организации сети ?
Каждый раз своё городить неохота.

bearpaw

Quote from: UnКаЙF on May 07, 2014, 02:40:28 pm
Да. В spi-sun7i.c этот бит запрещен, а в spi-sunxi.c - нет. Думал, может, можно вставить волшебный #ifdef в библиотеку, для определения текущей модели SoC, но так просто оно не далось. Нужно делать вызов в runtime для определения версии драйвера, - короче усложнять.

По протоколам для nrf24 - интересно, - есть ли что-то общепринятое для организации сети ?
Каждый раз своё городить неохота.


Я думаю, что определение железа в build time реализовать можно и нужно. Обязательно этим займусь.

По протоколам. Пока удалось нарыть некую RF24Network, которая, в свою очередь, использует RF24.
https://github.com/maniacbug/RF24Network

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


UnКаЙF

Так. Запустил тест с библиотекой:
STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1 = 0xf0f0f0f0e1 0xf0f0f0f0d2
RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6
TX_ADDR = 0xf0f0f0f0e1
RX_PW_P0-6 = 0x20 0x20 0x00 0x00 0x00 0x00
EN_AA = 0x3f
EN_RXADDR = 0x03
RF_CH = 0x4c
RF_SETUP = 0x27
CONFIG = 0x0f
DYNPD/FEATURE = 0x3f 0x04
Data Rate = 250KBPS
Model = nRF24L01+
CRC Length = 16 bits
PA Power = PA_HIGH
Now sending length 4...Failed, response timed out.

Пока подключил только один модуль. Буду думать как запустить тесты в 2 разных потоках с доступом к двум модулям по одному SPI.  ;D

bearpaw

Quote from: UnКаЙF on May 09, 2014, 03:19:18 pm
Так. Запустил тест с библиотекой:
STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1 = 0xf0f0f0f0e1 0xf0f0f0f0d2
RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6
TX_ADDR = 0xf0f0f0f0e1
RX_PW_P0-6 = 0x20 0x20 0x00 0x00 0x00 0x00
EN_AA = 0x3f
EN_RXADDR = 0x03
RF_CH = 0x4c
RF_SETUP = 0x27
CONFIG = 0x0f
DYNPD/FEATURE = 0x3f 0x04
Data Rate = 250KBPS
Model = nRF24L01+
CRC Length = 16 bits
PA Power = PA_HIGH
Now sending length 4...Failed, response timed out.

Пока подключил только один модуль. Буду думать как запустить тесты в 2 разных потоках с доступом к двум модулям по одному SPI.  ;D



Возьмите новую версию библиотеки. Немного причесал код (на сколько хватило времени)

UnКаЙF

Спасибо.  :)
По первым очучениям - тест слишком жрет процессор. Слишком частый  поллинг.

bearpaw

Quote from: UnКаЙF on May 09, 2014, 03:56:32 pm
Спасибо.  :)
По первым очучениям - тест слишком жрет процессор. Слишком частый  поллинг.


Да ну, "слишком" такой тест от двуядерного cpu особо много не отожрет... :)
А по хорошему, надо настраивать пин irq модуля и юзать его.

Кстати, не пробовал ли кто использовать eint-capable пины A20? Интересует, появляется-ли файл eint в sysfs?

UnКаЙF

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

bearpaw

Quote from: UnКаЙF on May 09, 2014, 11:38:10 pm
Судя по тому что читал, толку от юзерспейсных прерываний немного. Асинхронно обработчик не может быть вызван, т.е. прога всё равно не узнает о прерывании. пока не получит свой квант времени. Уж лучше поллить, но с умом. Всё имхо.


А что значит "поллить, но с умом" ? :)
Избранная мною обертка над RF24 (RF24Network) просит вызывать ф-цию приема/передачи раз в секунду. Так что, ИМХО, такая ситуация с прерыванием мне не критична.