че та конкурент с обещанной
nRF24L01+ библиотекой где то запропал...
бохх с им. хотя я его понимаю - лихим наскоком эта либа не пишется.
а я поборол свою лень и попробую выложить наработанное, по мере возможностей стараясь описывать и комментировать фрагменты. сразу скажу - это не библиотека в общепринятом понимании, а скорее набор слов ( можно сказать - "вокабулярий"

), который сформировался в процессе освоения
nRF24L01+ и изучения его работы, и предназначенный для экспериментов с этим девайсом.
не все слова ( и их наименования ) могут показаться удачными - они просто отражают ( зафиксировали) ход моих мыслей в процессе познания

итак
подключение
Код:
marker =nRF24L01+=
\ Pins
\ m328p
\ PORTD 4 portpin: nRF24_CE
\ PORTD 5 portpin: nRF24_CSN
\ PORTD 3 portpin: nRF24_IRQ \ == INT1
\ m32A
PORTC 2 portpin: nRF24_CE \ Chip Enable Activates RX or TX mode
PORTC 3 portpin: nRF24_CSN \ SPI Chip Select
PORTD 3 portpin: nRF24_IRQ \ == INT1
\
за подробностями отсылаю к файлу
bitnames.frt который обязателен и входит в комплект поставки. прерывания пока не использовал.
первое телодвижение - регистры и команды.
изучаю даташит, все тривиально
Код:
\ ============================================================================
\
\ nRF24l01+ Register Map
$00 constant nRF24_CONFIG \ Configuration Register
$01 constant nRF24_EN_AA \ Enable ‘Auto Acknowledgment’
$02 constant nRF24_EN_RXADDR \ Enabled RX Addresses
$03 constant nRF24_SETUP_AW \ Setup of Address Widths (common for all data pipes)
$04 constant nRF24_SETUP_RETR \ Setup of Automatic Retransmission
$05 constant nRF24_RF_CH \ RF Channel
$06 constant nRF24_RF_SETUP \ RF Setup Register
$07 constant nRF24_STATUS \ Status Register (In parallel to the SPI command
\ word applied on the MOSIpin, the STATUSregister is shifted serially out on the MISOpin)
$08 constant nRF24_OBSERVE_TX \ Transmit observe register
$09 constant nRF24_CD \ Carrier Detect. See page 74
\ Data pipes
$0A constant nRF24_RX_ADDR_P0 \ 0xE7E7E7E7E7
$0B constant nRF24_RX_ADDR_P1 \ 0xC2C2C2C2C2
$0C constant nRF24_RX_ADDR_P2 \ 0xC3
$0D constant nRF24_RX_ADDR_P3 \ 0xC4
$0E constant nRF24_RX_ADDR_P4 \ 0xC5
$0F constant nRF24_RX_ADDR_P5 \ 0xC6
$10 constant nRF24_TX_ADDR \ Transmit address.
\ Used for a PTX device only. (LSByte is written first)
\ Set RX_ADDR_P0 equal to this address to handle automatic acknowledge
\ if this is a PTX device with Enhanced ShockBurst™ enabled. See page 65.
\ Number of bytes in RX payload in data pipe (1 to 32 bytes).
\ 0=Pipe not used
$11 constant nRF24_RX_PW_P0
$12 constant nRF24_RX_PW_P1
$13 constant nRF24_RX_PW_P2
$14 constant nRF24_RX_PW_P3
$15 constant nRF24_RX_PW_P4
$16 constant nRF24_RX_PW_P5
$17 constant nRF24_FIFO_STATUS \ FIFO Status Register
$1C constant nRF24_DYNPD \ Enable dynamic payload length
$1D constant nRF24_FEATURE \ Feature Register
\ ========================================================================
\
\ nRF24L01+ commands
$00 constant nRF24_REG@ \
$20 constant nRF24_REG! \
$61 constant nRF24_RX_PLOAD@ \
$a0 constant nRF24_TX_PLOAD! \
$e1 constant nRF24_FLUSH_TX \
$e2 constant nRF24_FLUSH_RX \
$e3 constant nRF24_REUSE_TX_PL \
$ff constant nRF24_NOP \
$60 constant RX_PL_WID@ \
$a1 constant ACK_PAYLOAD! \ ( pipe --- )
$b0 constant TX_PAYLOAD_NOACK! \
\ ========================================================================
все биты в регистрах описывать в виде констант не стал - жаба (неjava) не позволила, жрут память.
но вот некоторые битовые поля понадобились
Код:
\ ========================================================================
\
\ some nRF24l01+ registers fields & constants
: bit ( n --- m ) $7 and 1 swap lshift ;
nRF24_STATUS $70 bitmask: nrf24_flags
nRF24_CONFIG 1 bit bitmask: radio-pw
nRF24_CONFIG 0 bit bitmask: radio-rx
nRF24_RF_CH $7f bitmask: radio-ch
nRF24_RF_SETUP 5 bit 3 bit or
bitmask: air-rate
nRF24_SETUP_RETR $0f bitmask: arc
nRF24_SETUP_RETR $f0 bitmask: ard
nRF24_OBSERVE_TX $f0 bitmask: plos_cnt
nRF24_OBSERVE_TX $0f bitmask: arc_cnt
nRF24_RX_PW_P0 $3f bitmask: rx_pw \ Number of bytes in RX payload in data pipe
\
\ ========================================================================
вспомогательное слово
bit принимает на входе номер бита, возвращает маску бита
Код:
> 5 bit dup .x .b
20 00100000 ok
>
слово
bitmask: тоже из
bitnames.frtслова определенные с его помощью оставляют на вершине стека адрес регистра и битовую маску под ним, например
Код:
> nrf24_flags .x
7 ok
> .b
01110000 ok
> air-rate .x .b
6 00101000 ok
>
ну вот, пора переходить к непосредственному общению - обязательно требуется
spi.frtбазовые операции обмена с модулем - чтение регистра состояния, чтение\запись одного байта из\в регистр
nRF24L01+, посылка команды, инициализация
Код:
\ ========================================================================
\ base nRF24l01+ transactions over spi
: nrf24? ( -- n ) \ read nRF24L01+ STATUS
nRF24_NOP
nRF24_CSN low
c!@spi
nRF24_CSN high
;
: nrf24@ ( ra -- c ) \ ra - адрес регистра nRF24, 1байт
nRF24_REG@ or
nRF24_CSN low
spi! spi@
nRF24_CSN high
;
: nrf24! ( c ra -- )
nRF24_REG! or
nRF24_CSN low
spi! spi!
nRF24_CSN high
;
: nrf24-cmd! ( cmd --- )
nRF24_CSN low spi!
nRF24_CSN high
;
: nRF24_init
nRF24_CSN over over pin_output high
nRF24_CE over over pin_output low
+spi 0 spi-mode!
nrf24_flags nrf24!
;
\
и уже с их помощью
Код:
\
\ установка, сброс, проверка
\ отдельных битов в регистре r,
\ m - маска
: #bit+ ( m r --- ) dup >r nrf24@ or r> nrf24! ;
: #bit- ( m r --- ) >r invert r@ nrf24@ and r> nrf24! ;
: #tst? ( m r --- f ) nrf24@ and ;
\ установка группы бит с в битовом поле m в регистре r
: #set+ ( c m r --- )
dup >r
nrf24@
over invert and
>r and
r> or r>
nrf24!
;
самое время для тех, кто не боится сломать мозг "стековым жонглированием" взяться за карандаш и проверить работу определения на бумажке

, остальным предлагаю поверить - это работает!
кстати, последнее определение можно реализовать и по-другому
Код:
\ установка группы бит с в битовом поле m в регистре r
: #set+ ( c m r --- )
over invert over nrf24@ and
>r -rot and
r> or swap nrf24!
;
ну и еще другими способами, форт - штука очень гибкая.
дальше фрагмент без комментариев - текст читается легко (я думаю)
Код:
\ =====================================================================
\
\
: radio-pw? ( -- f ) radio-pw #tst? ; \ power on?
: radio-off ( -- ) radio-pw #bit- ; \ power off
: radio-on ( -- ) radio-pw #bit+ pause 5 ms ; \ power up set bit
: radio-ch! ( n -- ) radio-ch #set+ ;
: radio-ch@ ( -- n ) radio-ch #tst? ;
: radio-rx? ( -- f ) radio-rx #tst? ; \ test if receiver
: radio-rx+ \ RX mode
radio-rx #bit+ \ PRIM_RX set 1
nRF24_CE high
[ &130 us/ ] \ RX setting
literal ?delay
;
: radio-tx+ \ TX mode
nRF24_CE low
radio-rx #bit- \ clear PRIM_RX
; \ standby-I
: cd? ( -- f ) [ 0 bit ] literal nRF24_CD #tst? ; \ RPD
\
\ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\
\ Air data rate
\
$0 constant 1Mbps
$08 constant 2Mbps
$20 constant 250Kbps
: rf-rate! ( m -- ) air-rate #set+ ;
: rf-rate@ ( -- m ) air-rate #tst? ;
\
\ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\
\ Automatic Retransmission
\
: retx-delay! ( n --- ) 4 lshift ard #set+ ;
: retx-delay@ ( --- n ) ard #tst? 4 rshift ;
: retx-count! ( n --- ) arc #set+ ;
: retx-count@ ( --- n ) arc #tst? ;
\
\ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\
тут я пока прервусь до следующего раза...
moving forth