<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=12859&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-09-08T22:30:02+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=12859&amp;mode</id>
<entry>
<author><name><![CDATA[j23]]></name></author>
<updated>2015-09-08T22:30:02+01:00</updated>
<published>2015-09-08T22:30:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12859&amp;p=139359#p139359</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12859&amp;p=139359#p139359"/>
<title type="html"><![CDATA[Re: Komunikacja nrf24l+ RPI i AVR]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12859&amp;p=139359#p139359"><![CDATA[
<div class="quotetitle">jaca_76 napisał(a):</div><div class="quotecontent"><br />(...)<br /></div>Całkiem niezły kod Kolego <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Kolega dobrze kombinuje... <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> 5W mocy 24h/dzień to nie aż tak wiele znowu...<br /><br />Dzięki za wstawkę kodu do RPi! <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> -gdybym tak miał możliwość nagrodzenia pigułką... <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Pozdrawiam! j23 Jarek<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4504">j23</a> — 8 wrz 2015, o 22:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jaca_76]]></name></author>
<updated>2015-09-08T21:20:48+01:00</updated>
<published>2015-09-08T21:20:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12859&amp;p=139354#p139354</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12859&amp;p=139354#p139354"/>
<title type="html"><![CDATA[Re: Komunikacja nrf24l+ RPI i AVR]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12859&amp;p=139354#p139354"><![CDATA[
Będąc precyzyjnym: udało się !<br />Wykorzystałem biblioteki Tinker ze zmianami: usunąłem z main mirf_config a za to po kolei tak jak jest bibliotece na RPi ustawiłem rejestry.<br />W załaczniku kod w pythonie na RPi<br />Kod dla AVR:<br />main.c<br /><br />[syntax=c]/*<br /> * Transmisja_RS485.c<br /> *<br /> * Created: 2014-12-26 12:19:18<br /> *  Author: Jacek<br /> */<br /><br /><br /><br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;avr/wdt.h&gt;<br />#include &quot;MKUART/mkuart.h&quot;<br />#include &lt;math.h&gt;<br />#include &quot;SSD1306/ssd1306.h&quot;<br />#include &quot;moje_dane.h&quot;<br />#include &quot;MIRF/mirf.h&quot;<br />//#include &quot;NRFL/nrfl_SPI.h&quot;<br />//#include &quot;NRFL/nRF24L01.h&quot;<br />#include &quot;MIRF/nRF24L01.h&quot;<br />#include &quot;I2C_TWI/i2c_twi.h&quot;<br />volatile int ready_flag=0;<br />long ldane;<br />double dane;<br />char printbuff&#91;6&#93;;<br />char bufor&#91;100&#93;;<br />uint8_t Distance;<br />uint8_t Thunder_dane;<br />uint8_t interrupt=0;<br />uint8_t min_distance=99;<br />uint8_t config;<br />uint8_t status;<br />uint8_t adres;<br />uint8_t nadaj_buf&#91;5&#93;={1,2,3,4,5};<br />char buffer_out1&#91;32&#93;;<br />uint8_t TX_adr&#91;5&#93;;<br />uint8_t RX_adr&#91;5&#93;;<br />void show_info(void);<br />uint8_t ADDRP0&#91;&#93;={0xe7, 0xe7, 0xe7, 0xe7, 0xe7};<br />uint8_t ADDRP1&#91;&#93;={0xc2, 0xc2, 0xc2, 0xc2, 0xc2};<br />int main(void)<br /><br />{<br /><br />    i2cSetBitrate(100);<br />    USART_Init(__UBRR);<br />    mirf_init();<br />    ssd1306_Init(SSD1306_SWITCHCAPVCC, REFRESH_MIN);<br />    sei();<br />    _delay_ms(50);<br />    ssd1306_puts(2,5,&quot;START1.&quot;,1,1,0);<br />ssd1306_display();<br />mirf_config_register(SETUP_RETR,0xFF);<br /> mirf_config_register(STATUS,(0&lt;&lt;CRCO));<br /> mirf_config_register(RF_CH,0x09);<br /> mirf_config_register(RF_SETUP,0x07);<br /> mirf_config_register(EN_AA,0xFF);<br /> mirf_config_register(FEATURE,(1&lt;&lt;EN_DPL));<br /> mirf_config_register(DYNPD,0x3f);<br /> mirf_set_RADDR(ADDRP1);<br /> mirf_set_TADDR(ADDRP1);<br /> mirf_config_register(RX_PW_P0,32);<br /> mirf_set_RADDR1(ADDRP0);<br /> mirf_config_register(EN_RXADDR,3);<br /><br />_delay_ms(50);<br />    show_info();<br />while(1){<br /><br />uart_puts(&quot;send..&quot;);<br />_delay_ms(30);<br />mirf_send(nadaj_buf,5);<br /><br /><br />}<br />}<br /><br />void show_info(){<br /><br /><br /><br />mirf_read_register(STATUS,RX_adr,1);<br />    uart_puts(&quot;STATUS &quot;);<br />    uart_putint(RX_adr&#91;0&#93;,16);<br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');// wyślij znak LF (nowa linia)<br /><br />    mirf_read_register(RX_ADDR_P0,RX_adr,5);<br />    uart_puts(&quot;RX_ADDR_P0 &quot;);<br />    for(uint8_t i = 0; i &lt; 5 ; i++ )                                          //until i is smaller than TX_ADDRES LENGTH copy data from flash to temporary TX_addres buffer<br />               {<br />    uart_putint(RX_adr&#91;i&#93;,16);<br />        uart_putc(' ');<br /><br /><br />               }<br /><br />    mirf_read_register(RX_ADDR_P1,RX_adr,5);<br />    uart_puts(&quot;RX_ADDR_P1 &quot;);<br />    for(uint8_t i = 0; i &lt; 5 ; i++ )                                          //until i is smaller than TX_ADDRES LENGTH copy data from flash to temporary TX_addres buffer<br />               {<br />    uart_putint(RX_adr&#91;i&#93;,16);<br />        uart_putc(' ');<br /><br /><br />               }<br /><br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');// wyślij znak LF (nowa linia)<br /><br />    mirf_read_register(TX_ADDR,RX_adr,5);<br />    uart_puts(&quot;TX_adr &quot;);<br />    for(uint8_t i = 0; i &lt; 5 ; i++ )                                          //until i is smaller than TX_ADDRES LENGTH copy data from flash to temporary TX_addres buffer<br />               {<br />    uart_putint(RX_adr&#91;i&#93;,16);<br />        uart_putc(' ');<br /><br />               }<br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');// wyślij znak LF (nowa linia)<br /><br />mirf_read_register(EN_AA,RX_adr,1);<br />    uart_puts(&quot;EN_AA &quot;);<br />    uart_putint(RX_adr&#91;0&#93;,16);<br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');// wyślij znak LF (nowa linia)<br /><br />mirf_read_register(EN_RXADDR,RX_adr,1);<br />    uart_puts(&quot;EN_RXADDR &quot;);<br />    uart_putint(RX_adr&#91;0&#93;,16);<br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');// wyślij znak LF (nowa linia)<br /><br />mirf_read_register(RF_CH,RX_adr,1);<br />    uart_puts(&quot;RF_CH &quot;);<br />    uart_putint(RX_adr&#91;0&#93;,16);<br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');// wyślij znak LF (nowa linia)<br /><br />mirf_read_register(RF_SETUP,RX_adr,1);<br />    uart_puts(&quot;RF_SETUP &quot;);<br />    uart_putint(RX_adr&#91;0&#93;,16);<br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');// wyślij znak LF (nowa linia)<br /><br />mirf_read_register(CONFIG,RX_adr,1);<br />    uart_puts(&quot;CONFIG &quot;);<br />    uart_putint(RX_adr&#91;0&#93;,16);<br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');// wyślij znak LF (nowa linia)<br /><br />mirf_read_register(DYNPD,RX_adr,1);<br />    uart_puts(&quot;DYNPD &quot;);<br />    uart_putint(RX_adr&#91;0&#93;,16);<br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');// wyślij znak LF (nowa linia)<br /><br />mirf_read_register(FEATURE,RX_adr,1);<br />    uart_puts(&quot;FEATURE &quot;);<br />    uart_putint(RX_adr&#91;0&#93;,16);<br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');// wyślij znak LF (nowa linia)<br />}[/syntax]<br /><br />mirf.c<br /><br />[syntax=c]/*<br />    Copyright (c) 2007 Stefan Engelke &lt;mbox@stefanengelke.de&gt;<br /><br />    Permission is hereby granted, free of charge, to any person<br />    obtaining a copy of this software and associated documentation<br />    files (the &quot;Software&quot;), to deal in the Software without<br />    restriction, including without limitation the rights to use, copy,<br />    modify, merge, publish, distribute, sublicense, and/or sell copies<br />    of the Software, and to permit persons to whom the Software is<br />    furnished to do so, subject to the following conditions:<br /><br />    The above copyright notice and this permission notice shall be<br />    included in all copies or substantial portions of the Software.<br /><br />    THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,<br />    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF<br />    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND<br />    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT<br />    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,<br />    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br />    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER<br />    DEALINGS IN THE SOFTWARE.<br /><br />    $Id$<br />*/<br /><br />#include &quot;mirf.h&quot;<br />#include &quot;nRF24L01.h&quot;<br />#include &quot;spi.h&quot;<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;../MKUART/mkuart.h&quot;<br />// Defines for setting the MiRF registers for transmitting or receiving mode<br />#define TX_POWERUP mirf_config_register(CONFIG, mirf_CONFIG | ( (1&lt;&lt;PWR_UP) | (0&lt;&lt;PRIM_RX) ) )<br />#define RX_POWERUP mirf_config_register(CONFIG, mirf_CONFIG | ( (1&lt;&lt;PWR_UP) | (1&lt;&lt;PRIM_RX) ) )<br /><br /><br />// Flag which denotes transmitting mode<br />volatile uint8_t PTX;<br /><br />void mirf_init()<br />// Initializes pins ans interrupt to communicate with the MiRF module<br />// Should be called in the early initializing phase at startup.<br />{<br />    // Define CSN and CE as Output and set them to default<br />    DDRB |= ((1&lt;&lt;CSN)|(1&lt;&lt;CE));<br />    mirf_CE_lo;<br />    mirf_CSN_hi;<br /><br />#if defined(__AVR_ATmega8__)<br />    // Initialize external interrupt 0 (PD2)<br />    MCUCR = ((1&lt;&lt;ISC11)|(0&lt;&lt;ISC10)|(1&lt;&lt;ISC01)|(0&lt;&lt;ISC00)); // Set external interupt on falling edge<br />    GICR  = ((0&lt;&lt;INT1)|(1&lt;&lt;INT0));                         // Activate INT0<br />#endif // __AVR_ATmega8__<br /><br />#if defined(__AVR_ATmega168__)<br />    // Initialize external interrupt on port PD6 (PCINT22)<br />    DDRB &amp;= ~(1&lt;&lt;PD6);<br />    PCMSK2 = (1&lt;&lt;PCINT22);<br />    PCICR  = (1&lt;&lt;PCIE2);<br />#endif // __AVR_ATmega168__<br /><br />#if defined(__AVR_ATmega644P__)<br />    // Initialize external interrupt on port PD6 (PCINT22)<br />EIMSK|=(1&lt;&lt;INT2);            //enable INT2 intterupt source in GICR register<br />EICRA|=(1&lt;&lt;ISC21);             //set intterupt active on falling edge<br />#endif // __AVR_ATmega644P__<br />    // Initialize spi module<br />    spi_init();<br />}<br />void mirf_config()<br />// Sets the important registers in the MiRF module and powers the module<br />// in receiving mode<br />{<br />    // Set RF channel<br />    mirf_config_register(RF_CH,mirf_CH);<br /><br />    // Set length of incoming payload<br />    mirf_config_register(RX_PW_P0, mirf_PAYLOAD);<br /><br />    // Start receiver<br />    PTX = 0;        // Start in receiving mode<br />    RX_POWERUP;     // Power up in receiving mode<br />    mirf_CE_hi;     // Listening for pakets<br />}<br /><br />void mirf_set_RADDR(uint8_t * adr)<br />// Sets the receiving address<br />{<br />    mirf_CE_lo;<br />    mirf_write_register(RX_ADDR_P0,adr,5);<br />    mirf_CE_hi;<br />}<br /><br />void mirf_set_RADDR1(uint8_t * adr)<br />// Sets the receiving address<br />{<br />    mirf_CE_lo;<br />    mirf_write_register(RX_ADDR_P1,adr,5);<br />    mirf_CE_hi;<br />}<br /><br />void mirf_set_TADDR(uint8_t * adr)<br />// Sets the transmitting address<br />{<br />    mirf_write_register(TX_ADDR, adr,5);<br />}<br /><br /><br />#if defined(__AVR_ATmega8__)<br />SIGNAL(SIG_INTERRUPT0)<br />#endif // __AVR_ATmega8__<br />#if defined(__AVR_ATmega168__)<br />SIGNAL(SIG_PIN_CHANGE2)<br />#endif // __AVR_ATmega168__<br />#if defined(__AVR_ATmega644P__)<br />ISR(INT2_vect)<br />#endif // __AVR_ATmega8__<br />// Interrupt handler<br />{<br />    uint8_t status;<br />    // If still in transmitting mode then finish transmission<br />    if (PTX) {<br /><br />        // Read MiRF status<br />        mirf_CSN_lo;                                // Pull down chip select<br />        status = spi_fast_shift(NOP);               // Read status register<br />        mirf_CSN_hi;                                // Pull up chip select<br /><br />        mirf_CE_lo;                             // Deactivate transreceiver<br />        RX_POWERUP;                             // Power up in receiving mode<br />        mirf_CE_hi;                             // Listening for pakets<br />        PTX = 0;                                // Set to receiving mode<br /><br />        // Reset status register for further interaction<br />        mirf_config_register(STATUS,(1&lt;&lt;TX_DS)|(1&lt;&lt;MAX_RT)); // Reset status register<br />    }<br />}<br /><br />extern uint8_t mirf_data_ready()<br />// Checks if data is available for reading<br />{<br />    if (PTX) return 0;<br />    uint8_t status;<br />    // Read MiRF status<br />    mirf_CSN_lo;                                // Pull down chip select<br />    status = spi_fast_shift(NOP);               // Read status register<br />    mirf_CSN_hi;                                // Pull up chip select<br />    return status &amp; (1&lt;&lt;RX_DR);<br />}<br /><br />extern void mirf_get_data(uint8_t * data)<br />// Reads mirf_PAYLOAD bytes into data array<br />{<br />    mirf_CSN_lo;                               // Pull down chip select<br />    spi_fast_shift( R_RX_PAYLOAD );            // Send cmd to read rx payload<br />    spi_transfer_sync(data,data,mirf_PAYLOAD); // Read payload<br />    mirf_CSN_hi;                               // Pull up chip select<br />    mirf_config_register(STATUS,(1&lt;&lt;RX_DR));   // Reset status register<br />}<br /><br />void mirf_config_register(uint8_t reg, uint8_t value)<br />// Clocks only one byte into the given MiRF register<br />{<br />    mirf_CSN_lo;<br />    spi_fast_shift(W_REGISTER | (REGISTER_MASK &amp; reg));<br />    spi_fast_shift(value);<br />    mirf_CSN_hi;<br />}<br /><br />void mirf_read_register(uint8_t reg, uint8_t * value, uint8_t len)<br />// Reads an array of bytes from the given start position in the MiRF registers.<br />{<br />    mirf_CSN_lo;<br />    spi_fast_shift(R_REGISTER | (REGISTER_MASK &amp; reg));<br />    spi_transfer_sync(value,value,len);<br />    mirf_CSN_hi;<br />}<br /><br />void mirf_write_register(uint8_t reg, uint8_t * value, uint8_t len)<br />// Writes an array of bytes into inte the MiRF registers.<br />{<br />    mirf_CSN_lo;<br />    spi_fast_shift(W_REGISTER | (REGISTER_MASK &amp; reg));<br />    spi_transmit_sync(value,len);<br />    mirf_CSN_hi;<br />}<br /><br /><br />void mirf_send(uint8_t * value, uint8_t len)<br />// Sends a data package to the default address. Be sure to send the correct<br />// amount of bytes as configured as payload on the receiver.<br />{<br />    while (PTX) {}                  // Wait until last paket is send<br /><br />    mirf_CE_lo;<br /><br />    PTX = 1;                        // Set to transmitter mode<br />    TX_POWERUP;                     // Power up<br /><br />    mirf_CSN_lo;                    // Pull down chip select<br />    spi_fast_shift( FLUSH_TX );     // Write cmd to flush tx fifo<br />    mirf_CSN_hi;                    // Pull up chip select<br /><br />    mirf_CSN_lo;                    // Pull down chip select<br />    spi_fast_shift( W_TX_PAYLOAD ); // Write cmd to write payload<br />    spi_transmit_sync(value,len);   // Write payload<br />    mirf_CSN_hi;                    // Pull up chip select<br /><br />    mirf_CE_hi;                     // Start transmission<br />}[/syntax]<br /><br />mirf.h<br /><br />[syntax=c]/*<br />    Copyright (c) 2007 Stefan Engelke &lt;mbox@stefanengelke.de&gt;<br /><br />    Permission is hereby granted, free of charge, to any person<br />    obtaining a copy of this software and associated documentation<br />    files (the &quot;Software&quot;), to deal in the Software without<br />    restriction, including without limitation the rights to use, copy,<br />    modify, merge, publish, distribute, sublicense, and/or sell copies<br />    of the Software, and to permit persons to whom the Software is<br />    furnished to do so, subject to the following conditions:<br /><br />    The above copyright notice and this permission notice shall be<br />    included in all copies or substantial portions of the Software.<br /><br />    THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,<br />    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF<br />    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND<br />    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT<br />    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,<br />    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br />    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER<br />    DEALINGS IN THE SOFTWARE.<br /><br />    $Id$<br />*/<br /><br />#ifndef _MIRF_H_<br />#define _MIRF_H_<br /><br />#include &lt;avr/io.h&gt;<br />// Mirf settings<br />#define mirf_CH         9<br />#define mirf_PAYLOAD    5<br />#define mirf_CONFIG     ( (1&lt;&lt;MASK_RX_DR) | (1&lt;&lt;EN_CRC) | (0&lt;&lt;CRCO) )<br /><br />// Pin definitions for chip select and chip enabled of the MiRF module<br />#define CE  PB1<br />#define CSN PB0<br /><br />// Definitions for selecting and enabling MiRF module<br />#define mirf_CSN_hi     PORTB |=  (1&lt;&lt;CSN);<br />#define mirf_CSN_lo     PORTB &amp;= ~(1&lt;&lt;CSN);<br />#define mirf_CE_hi      PORTB |=  (1&lt;&lt;CE);<br />#define mirf_CE_lo      PORTB &amp;= ~(1&lt;&lt;CE);<br /><br />// Public standart functions<br />extern void mirf_init();<br />extern void mirf_config();<br />extern void mirf_send(uint8_t * value, uint8_t len);<br />extern void mirf_set_RADDR(uint8_t * adr);<br />extern void mirf_set_RADDR1(uint8_t * adr);<br />extern void mirf_set_TADDR(uint8_t * adr);<br />extern uint8_t mirf_data_ready();<br />extern void mirf_get_data(uint8_t * data);<br /><br /><br />// Public extended functions<br />extern void mirf_config_register(uint8_t reg, uint8_t value);<br />extern void mirf_read_register(uint8_t reg, uint8_t * value, uint8_t len);<br />extern void mirf_write_register(uint8_t reg, uint8_t * value, uint8_t len);<br /><br />#endif /* _MIRF_H_ */[/syntax]<br /><br />nRF24L01.h<br /><br />[syntax=c]/*<br />    Copyright (c) 2007 Stefan Engelke &lt;mbox@stefanengelke.de&gt;<br /><br />    Permission is hereby granted, free of charge, to any person<br />    obtaining a copy of this software and associated documentation<br />    files (the &quot;Software&quot;), to deal in the Software without<br />    restriction, including without limitation the rights to use, copy,<br />    modify, merge, publish, distribute, sublicense, and/or sell copies<br />    of the Software, and to permit persons to whom the Software is<br />    furnished to do so, subject to the following conditions:<br /><br />    The above copyright notice and this permission notice shall be<br />    included in all copies or substantial portions of the Software.<br /><br />    THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,<br />    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF<br />    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND<br />    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT<br />    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,<br />    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br />    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER<br />    DEALINGS IN THE SOFTWARE.<br /><br />    $Id$<br />*/<br /><br />/* Memory Map */<br />#define CONFIG      0x00<br />#define EN_AA       0x01<br />#define EN_RXADDR   0x02<br />#define SETUP_AW    0x03<br />#define SETUP_RETR  0x04<br />#define RF_CH       0x05<br />#define RF_SETUP    0x06<br />#define STATUS      0x07<br />#define OBSERVE_TX  0x08<br />#define CD          0x09<br />#define RX_ADDR_P0  0x0A<br />#define RX_ADDR_P1  0x0B<br />#define RX_ADDR_P2  0x0C<br />#define RX_ADDR_P3  0x0D<br />#define RX_ADDR_P4  0x0E<br />#define RX_ADDR_P5  0x0F<br />#define TX_ADDR     0x10<br />#define RX_PW_P0    0x11<br />#define RX_PW_P1    0x12<br />#define RX_PW_P2    0x13<br />#define RX_PW_P3    0x14<br />#define RX_PW_P4    0x15<br />#define RX_PW_P5    0x16<br />#define FIFO_STATUS 0x17<br />#define DYNPD       0x1C     //DYNAMIC PAYLOAD WIDTH - DYNAMICZNA SZEROKOŚC RAMKI DANYCH<br />#define FEATURE     0x1D     //FEATURE REGISTER - REJESTR Z FICZERAMI<br />/* Bit Mnemonics */<br />#define MASK_RX_DR  6<br />#define MASK_TX_DS  5<br />#define MASK_MAX_RT 4<br />#define EN_CRC      3<br />#define CRCO        2<br />#define PWR_UP      1<br />#define PRIM_RX     0<br />#define ENAA_P5     5<br />#define ENAA_P4     4<br />#define ENAA_P3     3<br />#define ENAA_P2     2<br />#define ENAA_P1     1<br />#define ENAA_P0     0<br />#define ERX_P5      5<br />#define ERX_P4      4<br />#define ERX_P3      3<br />#define ERX_P2      2<br />#define ERX_P1      1<br />#define ERX_P0      0<br />#define AW          0<br />#define ARD         4<br />#define ARC         0<br />#define PLL_LOCK    4<br />#define RF_DR       3<br />#define RF_PWR      1<br />#define LNA_HCURR   0<br />#define RX_DR       6<br />#define TX_DS       5<br />#define MAX_RT      4<br />#define RX_P_NO     1<br />#define TX_FULL     0<br />#define PLOS_CNT    4<br />#define ARC_CNT     0<br />#define TX_REUSE    6<br />#define FIFO_FULL   5<br />#define TX_EMPTY    4<br />#define RX_FULL     1<br />#define RX_EMPTY    0<br />#define EN_DPL      2<br />/* Instruction Mnemonics */<br />#define R_REGISTER    0x00<br />#define W_REGISTER    0x20<br />#define REGISTER_MASK 0x1F<br />#define R_RX_PAYLOAD  0x61<br />#define W_TX_PAYLOAD  0xA0<br />#define FLUSH_TX      0xE1<br />#define FLUSH_RX      0xE2<br />#define REUSE_TX_PL   0xE3<br />#define NOP           0xFF[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2479">jaca_76</a> — 8 wrz 2015, o 21:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jaca_76]]></name></author>
<updated>2015-09-06T09:30:38+01:00</updated>
<published>2015-09-06T09:30:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12859&amp;p=139194#p139194</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12859&amp;p=139194#p139194"/>
<title type="html"><![CDATA[Re: Komunikacja nrf24l+ RPI i AVR]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12859&amp;p=139194#p139194"><![CDATA[
Hmm<br />Więc potrafię przesłać dane pomiędzy AVR a AVR jak i pomiędzy RPI a RPI, oczywiście jak widać potrafię oczytać i ustawiać rejestry NRFa na obydwóch urządzeniach. <br />Niestety próba wysłania danych z AVR do RPI nie działa. Adresy ustawiłem jak na działającym przykładzie dla RPi.<br />Program się nie zatrzymuje w żadnym miejscu, według mnie gdzieś jest błąd w konfiguracji lub kolejności wykonywanych ustawień . Ja nie potrafię go znaleźć .<br /><br />Sprawdziłem też co się dzieje ze rejestrem status, najpierw ma ustawienia domyślne a po chwili ustawia bit MAX_RT czyli osiągnął maksymalną wartość prób wysłania .<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2479">jaca_76</a> — 6 wrz 2015, o 09:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-09-06T08:54:52+01:00</updated>
<published>2015-09-06T08:54:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12859&amp;p=139193#p139193</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12859&amp;p=139193#p139193"/>
<title type="html"><![CDATA[Re: Komunikacja nrf24l+ RPI i AVR]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12859&amp;p=139193#p139193"><![CDATA[
<div class="quotetitle">kicajek napisał(a):</div><div class="quotecontent"><br />jest mało precyzyjnym określeniem problemu przed którym stanąłeś.<br />Piszę to niejako dla Twojego dobra, bo tylko precyzyjne określenie problemu zachęca do pomocy; dwa długaśne kody troszkę straszą.<br /></div><br />Ja tylko mogę dodać, że to bardzo mądra i cenna podpowiedź. Nic więcej dodać nic ująć.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 6 wrz 2015, o 08:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kicajek]]></name></author>
<updated>2015-09-06T07:55:03+01:00</updated>
<published>2015-09-06T07:55:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12859&amp;p=139191#p139191</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12859&amp;p=139191#p139191"/>
<title type="html"><![CDATA[Re: Komunikacja nrf24l+ RPI i AVR]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12859&amp;p=139191#p139191"><![CDATA[
Witam<br />Ja co prawda nie wiem, ale dla kolegów którzy chcieliby pomóc to: <br /><div class="quotetitle">jaca_76 napisał(a):</div><div class="quotecontent"><br />... potrafię skomunikować RPi z RPi jak i AVR z AVR ale do RPi z AVR to nie mam już pomysłów...<br /></div><br />jest mało precyzyjnym określeniem problemu przed którym stanąłeś.<br />Piszę to niejako dla Twojego dobra, bo tylko precyzyjne określenie problemu zachęca do pomocy; dwa długaśne kody troszkę straszą.<br /><br />Pozdr.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=826">kicajek</a> — 6 wrz 2015, o 07:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jaca_76]]></name></author>
<updated>2015-09-05T23:35:08+01:00</updated>
<published>2015-09-05T23:35:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12859&amp;p=139188#p139188</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12859&amp;p=139188#p139188"/>
<title type="html"><![CDATA[Komunikacja nrf24l+ RPI i AVR]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12859&amp;p=139188#p139188"><![CDATA[
Witam<br />Próbuję od kilku dni próbuje uruchomić komunikację pomiędzy Rpi a AVR za pomocą NRF24L+.<br />Obecnie używam  biblioteki z tego forum ale testowałem także z Tinker.<br />Dodam że potrafię skomunikować RPi z RPi jak i AVR z AVR ale do RPi z AVR to nie mam już pomysłów.<br />Bardzo proszę o pomoc.<br /><br />Tak wygląda RPi jako odbiornik:<br /><br />STATUS   = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0<br />RX_ADDR_P0-1     = 0x4156525452 0x4156525243<br />RX_ADDR_P2-5     = 0xc3 0xc4 0xc5 0xc6<br />TX_ADDR          = 0x4156525452<br />RX_PW_P0-6       = 0x20 0x20 0x00 0x00 0x00 0x00<br />EN_AA            = 0x3f<br />EN_RXADDR        = 0x03<br />RF_CH            = 0x09<br />RF_SETUP         = 0x07<br />CONFIG           = 0x0b<br />DYNPD/FEATURE    = 0x3f 0x04<br />Data Rate        = 1MBPS<br />Model            = nRF24l01+<br />CRC Length       = 8 bits<br />PA Power         = PA_HIGH<br /><br />A tak AVR jako nadanik:<br />RX_ADDR_P0 41 56 52 52 43 RX_ADDR_P1 43 43 52 54 52 <br />TX_adr 41 56 52 52 43 <br />EN_AA 3f<br />EN_RXADDR 3<br />RF_CH 9<br />RF_SETUP 7<br />CONFIG a<br />DYNPD 3f<br />FEATURE 4<br /><br />Kod dla AVR (main.c):<br />[syntax=c]/*<br /> * Transmisja_RS485.c<br /> *<br /> * Created: 2014-12-26 12:19:18<br /> *  Author: Jacek<br /> */<br /><br /><br /><br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;avr/wdt.h&gt;<br />#include &quot;MKUART/mkuart.h&quot;<br />#include &lt;math.h&gt;<br />#include &quot;SSD1306/ssd1306.h&quot;<br />#include &quot;moje_dane.h&quot;<br />#include &quot;NRFL/nrfl_SPI.h&quot;<br />#include &quot;NRFL/nRF24L01.h&quot;<br />#include &quot;NRFL/nRF24L01_memory_map.h&quot;<br />#include &quot;I2C_TWI/i2c_twi.h&quot;<br />volatile int ready_flag=0;<br />long ldane;<br />double dane;<br />char printbuff&#91;6&#93;;<br />char bufor&#91;100&#93;;<br />uint8_t Distance;<br />uint8_t Thunder_dane;<br />uint8_t interrupt=0;<br />uint8_t min_distance=99;<br />uint8_t config;<br />uint8_t status;<br />uint8_t adres;<br />void majne_funkcjon ( void * nRF_RX_buff , uint8_t len );<br />char buffer_out1&#91;32&#93;;<br />char TX_adr&#91;5&#93;;<br />char RX_adr&#91;5&#93;;<br />void show_info(void);<br />int main(void)<br /><br />{<br />    //SPI_Init();<br />    i2cSetBitrate(100);<br />    USART_Init(__UBRR);<br />    ssd1306_Init(SSD1306_SWITCHCAPVCC, REFRESH_MIN);<br />sei();<br />    nRF_init();<br />_delay_ms(55);<br />nRF_TX_Power_Up();<br />_delay_ms(55);<br />register_nRF_RX_Event_Callback(majne_funkcjon);<br />    status= nRF_Read_One_Byte_From_Register(CONFIG);<br />    ssd1306_put_int(75,55,status,1,1,0);<br />_delay_ms(10);<br />ssd1306_display();<br />status=0;<br />show_info();<br />    while(1)<br />    {<br /><br />        nRF_SendDataToAir( ( uint8_t * ) &quot;AAAAAAAAA&quot; );<br />         _delay_ms(300);<br /><br />}<br /><br />}<br /><br /><br />void majne_funkcjon ( void * nRF_RX_buff, uint8_t len )<br />{<br />        ssd1306_puts(5,20,&quot;Odebrano:&quot;,1,1,0);<br />        ssd1306_put_int(60,20,len,1,1,0);<br />        ssd1306_display();<br /><br />}<br /><br />void show_info(){<br />nRF_Read_Register(RX_ADDR_P0,RX_adr,5);<br />    uart_puts(&quot;RX_ADDR_P0 &quot;);<br />    for(uint8_t i = 0; i &lt; 5 ; i++ )                                          //until i is smaller than TX_ADDRES LENGTH copy data from flash to temporary TX_addres buffer<br />               {<br />    uart_putint(RX_adr&#91;i&#93;,16);<br />        uart_putc(' ');<br /><br /><br />               }<br /><br />    nRF_Read_Register(RX_ADDR_P1,RX_adr,5);<br />    uart_puts(&quot;RX_ADDR_P1 &quot;);<br />    for(uint8_t i = 0; i &lt; 5 ; i++ )                                          //until i is smaller than TX_ADDRES LENGTH copy data from flash to temporary TX_addres buffer<br />               {<br />    uart_putint(RX_adr&#91;i&#93;,16);<br />        uart_putc(' ');<br /><br /><br />               }<br /><br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');// wyślij znak LF (nowa linia)<br /><br /> nRF_Read_Register(TX_ADDR,RX_adr,5);<br />    uart_puts(&quot;TX_adr &quot;);<br />    for(uint8_t i = 0; i &lt; 5 ; i++ )                                          //until i is smaller than TX_ADDRES LENGTH copy data from flash to temporary TX_addres buffer<br />               {<br />    uart_putint(RX_adr&#91;i&#93;,16);<br />        uart_putc(' ');<br /><br />               }<br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');// wyślij znak LF (nowa linia)<br /><br />status= nRF_Read_One_Byte_From_Register(EN_AA);<br />    uart_puts(&quot;EN_AA &quot;);<br />    uart_putint(status,16);<br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');// wyślij znak LF (nowa linia)<br /><br />status= nRF_Read_One_Byte_From_Register(EN_RXADDR);<br />    uart_puts(&quot;EN_RXADDR &quot;);<br />    uart_putint(status,16);<br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');// wyślij znak LF (nowa linia)<br /><br /> status= nRF_Read_One_Byte_From_Register(RF_CH);<br />    uart_puts(&quot;RF_CH &quot;);<br />    uart_putint(status,16);<br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');// wyślij znak LF (nowa linia)<br /><br /> status= nRF_Read_One_Byte_From_Register(RF_SETUP);<br />    uart_puts(&quot;RF_SETUP &quot;);<br />    uart_putint(status,16);<br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');// wyślij znak LF (nowa linia)<br /><br /> status= nRF_Read_One_Byte_From_Register(CONFIG);<br />    uart_puts(&quot;CONFIG &quot;);<br />    uart_putint(status,16);<br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');// wyślij znak LF (nowa linia)<br /><br /> status= nRF_Read_One_Byte_From_Register(DYNPD);<br />    uart_puts(&quot;DYNPD &quot;);<br />    uart_putint(status,16);<br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');// wyślij znak LF (nowa linia)<br /><br /> status= nRF_Read_One_Byte_From_Register(FEATURE);<br />    uart_puts(&quot;FEATURE &quot;);<br />    uart_putint(status,16);<br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');// wyślij znak LF (nowa linia)<br />}[/syntax]<br /><br />nRF24L01.c<br /><br />[syntax=c]/*                  e-gadget.header<br />     * nRF24L01.c<br />     *<br />     *  Created on:<br />     *    Modyfied: 2015-04-13 21:18:47<br />     *      Author: Nefarious19<br />     *<br />     * Project name: &quot;NRF24&quot;<br />     *<br />     *      This is AVR GCC library for nRF24L01 module, ver. 1.0<br />     *      It can be only used by REGISTERED USERS of www.forum.atnel.pl,<br />     *      they must only leave this header in they C code.<br />     *<br />     *      Library code was written on the basis of:<br />     *<br />     *      https://www.sklep.atnel.pl/pl/p/AVR-Microcontrollers-C-Programming-Basics-EN-BOOK-DVD/103<br />     *      https://www.sklep.atnel.pl/pl/p/Jezyk-C-Pasja-programowania-mikrokontrolerow-8-bitowych-Wydanie-II-Ksiazka-DVD/104<br />     *<br />     *      &quot;<br />     *<br />     *      This library uses also some ideas from:<br />     *<br />     *      http://gizmosnack.blogspot.com/2013/04/tutorial-nrf24l01-and-avr.html<br />     *      http://www.tinkerer.eu/AVRLib/nRF24L01/<br />     *<br />     *<br />     */<br /><br />    #include &lt;avr/io.h&gt;<br />    #include &lt;util/delay.h&gt;<br />    #include &lt;avr/interrupt.h&gt;<br />    #include &lt;string.h&gt;<br />    #include &lt;avr/pgmspace.h&gt;<br /><br />    #include &quot;nrfl_SPI.h&quot;<br />    #include &quot;nRF24L01.h&quot;<br />    #include &quot;nRF24L01_memory_map.h&quot;<br />#include &quot;../SSD1306/ssd1306.h&quot;<br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // declarations of internal tool functions<br />    //..................................................................................................................<br />    void nRF_Read_Register( uint8_t register_name, uint8_t * buffer_for_registers_content, uint8_t length_of_content );  //reads given ammount of bytes from choosen register<br />    void nRF_Write_Register( uint8_t register_name, uint8_t * buffer_for_registers_content, uint8_t length_of_content ); //writes given ammount of bytes to choosen register<br />    void nRF_Set_Active_DataPipe_And_ACK (uint8_t DataPipe, uint8_t on_or_off, uint8_t ACK_on_or_off );                                      //This function is used to set active payload/payloads and enable/disable ACK functions<br />    void nRF_Set_PAYLOAD_Width ( uint8_t payload, uint8_t width );                                                                                                           //this function is used to set payload length. Use this function if dynamic payload length is disabled<br />    void nRF_Set_Dynamic_Payload_State_On_Data_Pipe(uint8_t data_pipe_number, uint8_t on_off );                                              //this function is used to set<br />    void nRF_Set_Data_Speed_And_Reciver_Power(uint8_t Data_rate, uint8_t power);                                         //this function is used to set transmission speed and reciver power<br />    void nRF_Set_State_And_Width_Of_CRC( uint8_t one_or_two_bytes , uint8_t on_or_off);                                  //this function is used to set CRC state and width.<br />    //__________________________________________________________________________________________________________________<br /><br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // declaration of global variables which stores values depending on the transmission states<br />    //..................................................................................................................<br />    volatile uint8_t TX_flag;   //data sent event flag<br />    volatile uint8_t RX_flag;   //data ready event flag<br />    //..................................................................................................................<br />    volatile uint8_t disable_dynamic_payload;<br />    volatile uint8_t payload_width;<br />    volatile uint8_t first_time = 0;<br />    //__________________________________________________________________________________________________________________<br /><br /><br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // declaration of the buffer which stores incoming payloads data<br />    //..................................................................................................................<br />    uint8_t nRF_RX_bufffer&#91;MAXIMUM_PAYLOAD_SIZE+1&#93;; //reciver buffer<br />    //__________________________________________________________________________________________________________________<br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // deklaracja moich zmiennych<br />    //..................................................................................................................<br />    uint64_t P_addres&#91;2&#93;={0x4156525452,0x4156525243};<br /><br />    //__________________________________________________________________________________________________________________<br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // callback function declaration<br />    //........................................................................................................................<br />    static void ( * nRF_RX_Event_Callback ) ( void * nRF_RX_buff , uint8_t len );<br />    //________________________________________________________________________________________________________________________<br /><br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function which is used to register your own callback function<br />    //........................................................................................................................<br />    void register_nRF_RX_Event_Callback ( void ( * callback )( void * nRF_RX_buff , uint8_t len ) )<br />    {<br />            nRF_RX_Event_Callback = callback; //in this line we give an addres to our callback function<br />    }<br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // recived data event function<br />    //........................................................................................................................<br />    void nRF_RX_EVENT (void)<br />    {<br />    #if USE_IRQ == 0<br />            if ( nRF_Data_Ready() )  RX_flag = 1;<br />            else RX_flag = 0;<br />    #endif<br />            if ( RX_flag )// if RX_flag == 1 then: - jeżeli zmienna RX_flag == 1 to:<br />            {<br />                    uint8_t fifo_status; //variable which stores FIFO_STATUS register value<br />                    uint8_t len;         //variable which stores length of recived payload<br />                    uint8_t i;           //index variable for loop<br />                    uint8_t * wsk;       //pointer for first byte of reciver buffer nRF_RX_buffer<br />                    RX_flag = 0;         //reset the RX_flag<br /><br />                    //do...while loop. this loop executes until RX_FIFO is empty<br />                    do<br />                    {<br />                            nRF_Config_Register(STATUS, (1&lt;&lt;RX_DR));        //Reset RX_DR IRQ flag in nRF STATUS register<br />                            wsk = nRF_RX_bufffer;                                   //wsk equals to addres of first byte nRF_RX_bufffer<br />                            CSN_LOW;                                                //chip select low<br />                            SPI_WriteByte(R_RX_PL_WID);                             //send: read length of payload command<br />                            len = SPI_WriteReadByte(NOP);                           //read length<br />                            CSN_HIGH;                                               //chip select high<br /><br />                            if ( len &gt; MAXIMUM_PAYLOAD_SIZE ) break;                                //if len is bigger than maximum payload size then break<br /><br />                            CSN_LOW;                                                //chip select low<br />                            SPI_WriteByte( R_RX_PAYLOAD ); //read payload command<br />                            for (i = 0; i &lt; len; i++)    //read data until i &lt; len<br />                            {<br />                                    *wsk++ = SPI_WriteReadByte(NOP);<br />                            }<br />                            CSN_HIGH;                    //csn goes high - csn stan wysoki<br />                            fifo_status = nRF_Read_One_Byte_From_Register(FIFO_STATUS); //read FIFO_STATUS register<br />                    }<br />                    while ( ( fifo_status &amp; (1&lt;&lt;RX_EMPTY) ) == 0 );  //if RX_EMPTY bit is LOW then loop must execute.<br />                    nRF_Clear_RX();                                                 //clear RX_FIFO<br />                    nRF_Config_Register(STATUS, (1&lt;&lt;RX_DR)); //Reset RX_DR IRQ flag in nRF STATUS register<br />                    if ( len &amp;&amp;  nRF_RX_Event_Callback ) ( * nRF_RX_Event_Callback )( nRF_RX_bufffer, len ); //if callback function is registered and len is bigger<br />                                                                                                                                                                                                      //than 0 send recived data to your callback function<br /><br /><br />            }<br />    }<br /><br /><br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // INITIALIAZE NRF function<br />    //........................................................................................................................<br /><br />    void nRF_init( void )<br />    {<br /><br />    init_nrfl_SPI(); //initialize SPI (software or hardware, you must choose it in SPI.h file)<br /><br />            #if USE_IRQ == 1<br />            Initialize_INTERRUPT_For_nRF(); //initialize INTx or PCINTx interrupt for nRF, you must do it on your Own<br />            #endif<br /><br />            NRF_DDR_PORT |= (1&lt;&lt;NRF_PIN); //nRF power control pin is output - pin sterujący zasilaniem nRFa jako wyjście<br />            nRF_Config_Register( CONFIG, nRF24L01_CONFIG);                                          //Write interrupt masks nRF_CONFIG to CONGIG register of nRF                                                          //Clear TX FIFO<br />            nRF_Set_Retransmission_Time_And_Ammount(WAIT_4000uS , RETR_15_TIMES );  //set time between retransmissions and ammount of retranssmisions<br />            nRF_Set_Channel(9);               //Set channel number<br />            nRF_Config_Register( RX_PW_P0, 32);<br />            nRF_Config_Register( RX_PW_P1, 32);<br />            nRF_Set_Data_Speed_And_Reciver_Power(TRANS_SPEED_1MB, RF_PWR_0dB ); //Set transmision speed and reciver power<br />            nRF_Set_State_And_Width_Of_CRC( ONE_BYTE , ON );  //ON == Enable CRC; OFF == disable CRC, ONE_BYTE or TWO_BYTES - width of CRC;<br />            nRF_Set_Active_DataPipe_And_ACK ( ERX_P1, ON, ACK_ON );<br />            nRF_Set_Active_DataPipe_And_ACK ( ERX_P0, ON, ACK_ON );<br />        //    nRF_Set_Dynamic_Payload_State_On_Data_Pipe( DPL_P1 , ON );  //Enable dynamic payload of choosen datapipe<br />         //   nRF_Set_Dynamic_Payload_State_On_Data_Pipe( DPL_P0 , ON );<br />            nRF_Config_Register( DYNPD, 63);<br />            nRF_SET_Reciver_Addres(RX_ADDR_P0, PSTR(&quot;AVRRC&quot;));<br />              nRF_SET_Transmitter_Adres(PSTR(&quot;AVRRC&quot;));           //set transmitter addres<br />              nRF_SET_Reciver_Addres(RX_ADDR_P1, PSTR(&quot;CCRTR&quot;));      //set reciving addres for datapipe0 !zmiana na takie same adresy1<br /><br />             //Set which datapipe state you want to change, in this case datapipe = 0 (ERX_P0), ON - means enable this datapipe, ACK_ON means to enable ACK for choosen data pipe.<br /><br />             nRF_Clear_RX();                                                                     //Clear RX FIFO<br />             nRF_Clear_TX();<br /><br />            RX_flag = 1;            //Clear RX flag<br />            TX_flag = 0;        //Clear TX flag<br /><br />            nRF_Config_Register(STATUS, (1&lt;&lt;TX_DS) | (1&lt;&lt;RX_DR) | (1&lt;&lt;MAX_RT));    //Clear interrupt bits in STATUS register<br /><br />    }<br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function used to read one byte from register given as attribute of the function<br />    //........................................................................................................................<br />    uint8_t nRF_Read_One_Byte_From_Register(uint8_t register_name)<br />    {<br />            uint8_t data;                                                                                           //temporary variable data is used to store and return value of choosen register<br />            CSN_LOW;                                                        //chip select low<br />            SPI_WriteByte( R_REGISTER | (REGISTER_MASK &amp; register_name) );  //send R_REGISTER command with number of choosen register (SEE nRF24L01_memory_map.h)<br />            data = SPI_WriteReadByte(NOP);                                  //write to &quot;data&quot;, value from choosen register<br />            CSN_HIGH;                                                       //chip select high<br />            return data;                                                    //return data<br />    }<br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function used to write data to the choosen register<br />    //........................................................................................................................<br />    void nRF_Config_Register(uint8_t register_name, uint8_t value)<br />    {<br />            CSN_LOW;                                                                                                                //make CSN low<br />            SPI_WriteByte( W_REGISTER | (REGISTER_MASK &amp; register_name) );  //send information to nRF which register you want to write<br />            SPI_WriteByte( value );                                         //send value that you want write to this register<br />            CSN_HIGH;                                                       //make CSN high<br />    }<br /><br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function used to read data from the choosen register to buffer<br />    //........................................................................................................................<br />    void nRF_Read_Register( uint8_t register_name, uint8_t * buffer_for_registers_content, uint8_t length_of_content )<br />    {<br />            CSN_LOW;                                                                                                                                                                                                        //make CSN low<br />            SPI_WriteByte( R_REGISTER | ( REGISTER_MASK &amp; register_name ) );                                                                                        //send information to nRF which register you want to read<br />            SPI_WriteReadDataBuffer( buffer_for_registers_content, buffer_for_registers_content, length_of_content );       //read from nRF given ammount of bytes to the buffer<br />            CSN_HIGH;                                                                                                                                                                                               //make CSN high<br />    }<br /><br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function used to write data from the buffer to the choosen register<br />    //........................................................................................................................<br />    void nRF_Write_Register( uint8_t register_name, uint8_t * buffer_for_registers_content, uint8_t length_of_content )<br />    {<br />            CSN_LOW;                                                                                                                                                                                                        //make CSN low<br />            SPI_WriteByte( W_REGISTER | ( REGISTER_MASK &amp; register_name ) );                                                                                        //send information to nRF which register you want to write<br />            SPI_WriteReadDataBuffer( buffer_for_registers_content, buffer_for_registers_content, length_of_content );       //write to nRF given ammount of bytes from the buffer<br />            CSN_HIGH;                                                                                                                                                                                                       //make CSN low<br />    }<br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function used to set transmitter addres.<br />    //........................................................................................................................<br />    void nRF_SET_Transmitter_Adres(const char * addres)<br />    {<br />            char TX_addres&#91;TX_ADDRES_LENGTH&#93;;                                                                                                               //declaration of TX_addres temporary buffer<br /><br />            for(uint8_t i = 0; i &lt; TX_ADDRES_LENGTH; i++ )                                          //until i is smaller than TX_ADDRES LENGTH copy data from flash to temporary TX_addres buffer<br />            {<br />                    TX_addres&#91;i&#93; = pgm_read_byte(addres++);<br />            }<br /><br />            if( TX_ADDRES_LENGTH &gt; 5 ) nRF_Write_Register(TX_ADDR, (uint8_t *) TX_addres, 5);               //if TX_ADDRES_LENGTH is bigger than 5 bytes send only 5 bytes<br />            else if( TX_ADDRES_LENGTH &lt; 3 ) nRF_Write_Register(TX_ADDR, (uint8_t *) TX_addres, 3);  //if TX_ADDRES_LENGTH is smaller than 3 bytes send 3 bytes<br />            else nRF_Write_Register(TX_ADDR, (uint8_t *) TX_addres , TX_ADDRES_LENGTH);             //else send given by attribute ammount of bytes<br />    }<br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function used to set transmitter addres.<br />    //........................................................................................................................<br />    void nRF_SET_Reciver_Addres( uint8_t data_pipe, const char * addres )<br />    {<br />            char RX_addres&#91;RX_ADDRES_LENGTH&#93;;                                                                                                               //declaration of RX_addres temporary buffer<br /><br />            if( data_pipe &gt; RX_ADDR_P5 ) data_pipe = RX_ADDR_P0;                                                                //this is a protection. When given by data_pipe variable register addres is smaller<br />            else if( data_pipe &lt; RX_ADDR_P0 ) data_pipe = RX_ADDR_P0;                                                               // or bigger than possible value, this condition is setting deffault value<br />            else if( data_pipe &gt; RX_ADDR_P5 ) data_pipe = RX_ADDR_P5;<br /><br />            if ( data_pipe &lt; RX_ADDR_P2 )                                                                                                                   // data_pipe ix equal to RX_ADDR_P0 or RX_ADDR_P1 write 5 bytes of addres to nRF<br />            {<br />                    for(uint8_t i = 0; i &lt; RX_ADDRES_LENGTH; i++ )<br />                    {<br />                    RX_addres&#91;i&#93; = pgm_read_byte(addres++);<br />                    }<br /><br />                    if( RX_ADDRES_LENGTH &gt; 5 ) nRF_Write_Register(data_pipe, (uint8_t*)RX_addres, 5);<br />                    else if( RX_ADDRES_LENGTH &lt; 3 ) nRF_Write_Register(data_pipe, (uint8_t*) RX_addres, 3);<br />                    else nRF_Write_Register(data_pipe, (uint8_t *) RX_addres, RX_ADDRES_LENGTH);<br />            }<br />            else                                                                                                                                                                    //else send only one byte of addres because first four bytes are the same as the RX_ADDR_P1 first four bytes of addres.<br />            {<br />                    RX_addres&#91;0&#93; = pgm_read_byte(addres);<br />                    nRF_Config_Register(data_pipe, RX_addres&#91;0&#93;);<br />            }<br /><br />    }<br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function used to chcecking RX_DR bit in STATUS register. When this bit is HIGH that means tha data are ready<br />    // function used in pooling mode<br />    //........................................................................................................................<br />    uint8_t nRF_Data_Ready(void)<br />    {<br />            CSN_LOW;                                                                        //make CSN low<br />            uint8_t data = SPI_WriteReadByte(NOP);          //send to nRF dummy byte and read STATUS register<br />            CSN_HIGH;                                                                       //make CSN high<br />            return (data &amp; (1&lt;&lt;RX_DR));                                     //return 0 if data not ready or 1 if data ready<br />    }<br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function used to set state and width of CRC. First attrbiute of this function is ONE_BYTE or TWO_BYTES,<br />    // second attribute is ON or OFF<br />    //........................................................................................................................<br />    void nRF_Set_State_And_Width_Of_CRC( uint8_t one_or_two_bytes , uint8_t on_or_off)<br />    {<br />            uint8_t config = nRF_Read_One_Byte_From_Register(CONFIG);                               //read data from congig register and save it to config variable<br /><br />            if ( one_or_two_bytes == ONE_BYTE ) config &amp;= ~(1&lt;&lt;CRCO);                               //if first given attribute is ONE_BYTE clear CRCO bit<br />            else if ( one_or_two_bytes == TWO_BYTES ) config |= (1&lt;&lt;CRCO);                  //else if first given attribute is TWO_BYTES set CRCO bit<br />            else config &amp;= ~(1&lt;&lt;CRCO);                                                                                              //else given attribute is diffrent set CRCO low<br /><br />            if (on_or_off == ON)   config |= (1&lt;&lt;EN_CRC);                                                   //if second attribute is equal to ON, set EN_CRC bit<br />            else if ( on_or_off == OFF )  config &amp;= ~(1&lt;&lt;EN_CRC);                                   //esle reset the EN_CRC bit<br /><br />            nRF_Config_Register(CONFIG, config);                                                                    //write config content to CONFIG register<br />    }<br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function used to switch nRF into TX mode<br />    //........................................................................................................................<br />    void nRF_TX_Power_Up(void)<br />    {<br />            CE_LOW;                                                                                                                                 //make CE low<br />            uint8_t config;                                                                                                                 //declaration of temporary variable<br />            config = nRF_Read_One_Byte_From_Register(CONFIG);                                               //save copy of config regster in config variable<br /><br />            config &amp;= ~(1&lt;&lt;PRIM_RX);                                                                                                //reset PRIM_RX bit<br />            config |= (1&lt;&lt;PWR_UP);                                                                                                  //set PWR_UP bit<br /><br />            nRF_Config_Register( CONFIG , config);                                                                  //write config variable to CONGIG register<br />            CE_HIGH;                                                                                                                                //make CE high<br />    }<br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function used to switch nRF into RX mode<br />    //........................................................................................................................<br />    void nRF_RX_Power_Up(void)<br />    {<br />            CE_LOW;                                                                                                                                 //make CE_LOW<br />            uint8_t config;                                                                                                                 //declaration of config variable<br />            config = nRF_Read_One_Byte_From_Register(CONFIG);                                               //save copy of CONFIG register to config variable<br />            nRF_Config_Register(CONFIG , config | (1&lt;&lt;PWR_UP) | (1&lt;&lt;PRIM_RX) );             //set PWR_UP and PRIM_RX bits in config variable ande save it in nRF CONFIG register<br />            CE_HIGH;                                                                                                                                //make CE_HIGH<br />    }<br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function used to switch nRF into POWER DOWN mode<br />    //........................................................................................................................<br />    void nRF_Power_Down(void)<br />    {<br />            CE_LOW;                                                                                                                                 //make CE_LOW<br />            uint8_t config;                                                                                                                 //declaration of config variable<br />            config = nRF_Read_One_Byte_From_Register(CONFIG);                                               //save copy of CONFIG register to config variable<br />            config &amp;= ~((1&lt;&lt;PWR_UP) | (1&lt;&lt;PRIM_RX));                                                                //reset PWR_UP and PRIM_RX bits<br />            nRF_Config_Register(CONFIG , config );                                                                  //save congig variable in CONFIG register<br />            nRF_Clear_RX();                                                                                                                 //clear RX fifo<br />            nRF_Clear_TX();                                                                                                                 //clear TX fifo<br />    }<br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function used to set transmission channel<br />    //........................................................................................................................<br />    void nRF_Set_Channel( uint8_t channel )<br />    {<br />            nRF_Config_Register( RF_CH ,  0x7F &amp; channel );                                                 //save to nRF RF_CH register channel number (0x7f == 0b01111111 is the mask)<br />    }<br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function used to clear TX fifo<br />    //........................................................................................................................<br />    void nRF_Clear_TX (void)<br />    {<br />            CSN_LOW;                                                        //make CSN low<br />            SPI_WriteByte( FLUSH_TX );                      //send to nRF FLUSH_TX command what means CLEAR TX FIFO<br />            CSN_HIGH;                                                       //make CSN high<br />    }<br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function used to clear RX fifo<br />    //........................................................................................................................<br />    void nRF_Clear_RX (void)<br />    {<br />            CSN_LOW;                                                        //make CSN low<br />            SPI_WriteByte( FLUSH_RX );                      //send to nRF FLUSH_RX command what means CLEAR RX FIFO<br />            CSN_HIGH;                                                       //make CSN high<br />    }<br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function used to set states of datapipes<br />    // first attribute is DataPipe, you must put here name of datapipe tha you want to enable, this name is ERX_Px where x is number of data pipe (see nRF_Init function)<br />    // second attribute is or_on_off, here you put ON or OFF macro. When you put here ON, the choosen data pipe will be turned ON, if put here OFF, datapipe will be turned off<br />    // third and last parameter is ACK_on_or_off, you must put here macros: ACK_ON or ACK_OFF. This parameter turns ACK_ON or turns ACK_OFF<br />    //........................................................................................................................<br />    void nRF_Set_Active_DataPipe_And_ACK (uint8_t DataPipe, uint8_t on_or_off, uint8_t ACK_on_or_off )<br />    {<br />            uint8_t data = nRF_Read_One_Byte_From_Register(EN_RXADDR);              //read data from EN_RXADDR register save it in data variable<br /><br />            if(on_or_off == ON) data |= (DataPipe);                                                 //if second attribute is ON, set bit ERX_Px (given by DataPipe parameter)<br />            else if (on_or_off == OFF) data &amp;= ~(DataPipe);                                 //else reset this bit<br /><br />            nRF_Config_Register( EN_RXADDR, data );                                                 //save data variable to EN_RXADDR register<br /><br />            data = nRF_Read_One_Byte_From_Register(EN_AA);                                 //read data from EN_AA register and save it in data variable<br /><br />            if(ACK_on_or_off == ACK_ON) data |= (DataPipe);                                 //if third parameter is ACK_ON, enable auto ackonwledgements by setting ENAA_Px bit (this same value as ERX_Px)<br />            else if (ACK_on_or_off == ACK_OFF) data &amp;= ~(DataPipe);                 //else turn off auto acknowledgments<br /><br />            nRF_Config_Register( EN_AA, data );                                                    //save the variable data to EN__AA register<br />    }<br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function used to send data to another nRF's<br />    // attribute to this function is the pointer to the first byte of transsmision buffer<br />    //........................................................................................................................<br />    void nRF_SendDataToAir( uint8_t * data )<br />    {<br /><br /><br />            #if USE_IRQ == 0<br /><br />            CSN_LOW;                                                                                                //make CSN low<br />            uint8_t data1 = SPI_WriteReadByte(NOP);                                 //send to nRF dummy byte and read STATUS register<br />            CSN_HIGH;                                                                                               //make CSN high<br /><br />            if ( ( data1 &amp; (1&lt;&lt;MAX_RT) ) )                                                  //if maximum ammount of retransmissions is achived,<br />            {<br />                    CE_LOW;                                                                                                                 //make CE low<br />                    nRF_Clear_TX();                                                                                                 //clear TX FIFO<br />                    nRF_Config_Register(STATUS, data1 | (1&lt;&lt;MAX_RT) | (1&lt;&lt;TX_DS) ); //reset TX_DS and MAX_RT intterrupt flags in STATUS register<br />                    return;                                                         //return<br />            }<br />                                                                                                                                                    //else if was send or funcion is used for the first time<br />            else if ( ( data1 &amp; (1&lt;&lt;TX_DS)) || (first_time == 0) ) TX_flag = 0;     //TX flag = 0<br /><br />            else TX_flag = 1;<br /><br />            first_time = 1;                                                                                 //first_time equals to 1<br />            nRF_Config_Register(STATUS, data1 | (1&lt;&lt;TX_DS));                //clear TX_DS int flag<br /><br />            #endif<br /><br />            if(TX_flag == 1) return;                                                                //if still is in transmitting mode or function isn't used for the first time, return<br /><br /><br />            TX_flag = 1;                                                                                    //set TX mode flag to one<br /><br />            uint8_t * wsk = data;                                                                   //wsk pointer is equal to the addres of first byte transmission buffer<br />            uint8_t length;                                                                                 //declare length variable<br />            if(disable_dynamic_payload == 1) length = payload_width;//if nRF_Set_PAYLOAD_Width() was used use the length variable is equal to width parameter of tha function<br />            else length = strlen((char*) data);                                             //else length is equal to the size of transmission buffer<br /><br />            if ( length &gt;= MAXIMUM_PAYLOAD_SIZE ) length = 32;<br /><br />            nRF_TX_Power_Up();                                                                              //turn on transmission mode<br /><br />            nRF_Clear_TX();                                                                                 //clear TX fifo<br /><br />            CSN_LOW;                                                                                                //make CSN low<br />            SPI_WriteByte(W_TX_PAYLOAD);                                                    //send to nRF W_TX_PAYLOAD command what means &quot;Write data to TX FIFO&quot;<br />            for (uint8_t i = 0; i &lt; length; i++ )                                   //until &quot;i&quot; is smaller than &quot;length&quot; send bytes to nRF<br />            {<br />                    SPI_WriteByte(*wsk++);<br />            }<br />            CSN_HIGH;                                                                                               //CSN high<br />            CE_HIGH;                                                                                                //start transmision!<br />    }<br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function used to set payload width<br />    // first attribute of this function is number or RX payload (RX_PW_Px), second one is the width(1-32 bytes)<br />    // use this function only if the dyanmic payloads are turned off<br />    //........................................................................................................................<br />    void nRF_Set_PAYLOAD_Width ( uint8_t payload, uint8_t width )<br />    {<br />            nRF_Config_Register( payload, ( 0x1F &amp; width ) );               //config RX_PW_Px with number of bytes<br />            disable_dynamic_payload = 1;                                                    //set the disable_dynamic_payload flag<br />            payload_width = width;                                                                  //global variable payload_width is equal to width given by attribute<br />    }<br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function used to number of retransmissions and time beetwen each retransmission<br />    // first attribute is WAIT_XXXX_uS and the second is RETR_X_TIMES (see nRF_memory_map.h)<br />    //........................................................................................................................<br />    void nRF_Set_Retransmission_Time_And_Ammount (uint8_t time, uint8_t ammount)<br />    {<br />            nRF_Config_Register( SETUP_RETR, ( time | ammount ) );          //write to SETUP_RETR register number of retransmisions and time beetwen them<br />    }<br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function used to set transmission speed and receiver power<br />    // first attribute is TRANS_SPEED_x and the second is RF_PWR_x (see nRF_memory_map.h)<br />    //........................................................................................................................<br />    void nRF_Set_Data_Speed_And_Reciver_Power(uint8_t Data_rate, uint8_t power)<br />    {<br />            nRF_Config_Register( RF_SETUP, ( (Data_rate | power)|0x01));          //write to RF_SETUP register transmision speed and and receiver power DODAŁEM  |0x01<br />    }<br /><br />    //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // function used to set dynamic payloads<br />    // first attribute is DPL_Px (number of receiver payload) and the second is ON or OFF(see nRF_memory_map.h)<br />    //........................................................................................................................<br />    void nRF_Set_Dynamic_Payload_State_On_Data_Pipe(uint8_t data_pipe_number, uint8_t on_off )<br />    {<br />            nRF_Config_Register( DYNPD, data_pipe_number );                                 //save DPL_Px value to DYNPD register<br />            uint8_t feature = nRF_Read_One_Byte_From_Register(FEATURE);             //make copy of FEATURE register<br /><br />            if (on_off == ON)       feature |= (1&lt;&lt;EN_DPL);         //if second attribute is equal to ON<br />                                                                                                                    //set bit EN_DPL<br />            if (on_off == OFF)      feature &amp;= ~(1&lt;&lt;EN_DPL);        //if second attribute is equal to OFF<br />                                                                                                                    //reset bit EN_DPL<br />            nRF_Config_Register(FEATURE, feature);                  //save feature variable to FEATURE register<br />    }<br /><br /><br />    #if USE_IRQ == 1<br />    //'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''//<br />    //         IRQ INTERRUPT HANDLER section                                                           //<br />    //.............................................................................//<br /><br />    //in this function you must put your initialization of external intterup (INTx or PCINTx)<br />    //if you don't use interrupts there is no matter what code is here<br /><br />    void Initialize_INTERRUPT_For_nRF(void)<br />    {<br />    EIMSK|=(1&lt;&lt;INT2);            //enable INT2 intterupt source in GICR register<br />     EICRA|=(1&lt;&lt;ISC21);             //set intterupt active on falling edge<br />    }<br /><br />    //'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // Here is external intterupt handler, if you are using interupts change the name of the vector interrupt ore live the same if you are using the same<br />    //...................................................................................................................................................<br />    ISR(INT2_vect)<br />    {<br />            CSN_LOW;                                                                                        //Chip select LOW<br />            register uint8_t status = SPI_WriteReadByte(NOP);       //read STATUS register value<br />            CSN_HIGH;                                                                                       //chip select high<br /><br />            if ( (status &amp; (1&lt;&lt;RX_DR)) )                                            //id data recived<br />            {<br />                    status |= (1&lt;&lt;RX_DR);                                                   //reset intterupt bit on status variable<br />                    nRF_Config_Register(STATUS, status);                    //save status variable in STATUS register<br />                    RX_flag = 1;                                                                    //RX flag equals to 1<br />            }<br /><br />            if ( status &amp; (1&lt;&lt;TX_DS) )                                                      //if data was send<br />            {<br />                    status |= (1&lt;&lt;TX_DS);                                                   //clear TX_DS bit in status variable<br />                    nRF_Config_Register( STATUS, status );                  //save status variable in STATUS register<br />                    TX_flag = 0;                                                                    //TX_flag = 0<br />                    nRF_RX_Power_Up();                                                              //enable receiving mode<br />            }<br /><br />            if ( status &amp; (1&lt;&lt;MAX_RT) )                                                     //id max of retransmissions was achived<br />            {<br />                    status |= (1&lt;&lt;MAX_RT) | (1&lt;&lt;TX_DS);                             //clear MAX_RT and TX_DS bits in status variable<br />                    TX_flag = 0;                                                                    //clear TX_flag<br />                    nRF_RX_Power_Up();                                                              //turn on RX mode<br />                    nRF_Clear_TX();                                                                 //clear TX fifo<br />                    nRF_Config_Register( STATUS, status );                  //save variable status to the STATUS register<br />            }<br />    }<br /><br />    #endif<br /><br />    //'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br />    // moja funkcja openWritingPipe<br />    //...................................................................................................................................................<br />//Note that the NRF24L01(+)<br />// expects it LSB first.<br />void  openWritingPipe(const char * addres)<br />{<br />    char TX_addres&#91;TX_ADDRES_LENGTH&#93;;                                                                                                               //declaration of TX_addres temporary buffer<br /><br />    for(uint8_t i = 0; i &lt; TX_ADDRES_LENGTH; i++ )                                          //until i is smaller than TX_ADDRES LENGTH copy data from flash to temporary TX_addres buffer<br />    {<br />            TX_addres&#91;i&#93; = pgm_read_byte(addres++);<br />    }<br />nRF_Write_Register(RX_ADDR_P0, (uint8_t *) TX_addres, 5);<br />nRF_Write_Register(TX_ADDR, (uint8_t *) TX_addres, 5);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2479">jaca_76</a> — 5 wrz 2015, o 23:35</p><hr />
]]></content>
</entry>
</feed>