image

Ana içeriğe git
Konu: NRF24L01+ (190 Kez okunmuş)

NRF24L01+

merhabalar
ben 2 pic i nrf24l01 ile haberleştirmeye çalışıyorum  ama malesef kütüphaneyi nasıl kullanacağım konusunda tam emin değilim(derleyici olarak ccs c kullanıyorum). yazılımsal spi mı? yoksa donanımsal mı kullanmak zorundayım? yazılımsal kullanırsam kütüphane clc sinyalini kendisi mi üretiyor?
mıso ve mosı pinlerinin ce ve csn den farklı portlarda  mı olması gerekiyor? (biyerde okumuştum)
bu konuyla ilgili daha önce çalışan arkadaşlar varsa yardımlarınızı bekliyorum şimdiden teşekkür ederim.
Kod: [Seç]
/*
#include <18F4620.h>
#FUSES H4,NOFCMEN,NOIESO,NOPUT,NOBROWNOUT,NOWDT,CCP2B3,NOPBADEN,LPT1OSC,NOMCLR,NOSTVREN,NOLVP,NOXINST,NODEBUG,NOPROTECT,NOWRTC,NOWRTB,NOWRTC,NOWRTD
#use delay(clock=40MHz,crystal=10MHz)
#define LCD_DB4   PIN_b4
#define LCD_DB5   PIN_b5
#define LCD_DB6   PIN_b6
#define LCD_DB7   PIN_b7
#define LCD_RS    PIN_a1
#define LCD_RW    PIN_a0
#define LCD_E     PIN_a2
#include <LCD420_Flex.c>
*/
//nRF24L01+ için yazılımsal SPI kütüphanesi
/*
#define IRQ_pin   pin_b0
#define CE_pin    pin_c0
#define SS_pin    pin_a5 // CSN-SS pin
#define MOSI_pin  pin_c5
#define MISO_pin  pin_c4
#define SCK_pin   pin_c3
*/

#define R_REGISTER_cmd                 0x00
#define W_REGISTER_cmd                 0x20
#define R_RX_PL_WID_cmd                0x60
#define R_RX_PAYLOAD_cmd               0x61
#define W_TX_PAYLOAD_cmd               0xA0
#define W_ACK_PAYLOAD_cmd              0xA8
#define W_TX_PAYLOAD_NO_ACK_cmd        0xB0
#define FLUSH_TX_cmd                   0xE1
#define FLUSH_RX_cmd                   0xE2
#define REUSE_TX_PL_cmd                0xE3

#define NOP_cmd                        0xFF


#define CONFIG_reg                     0x00
#define EN_AA_reg                      0x01
#define EN_RXADDR_reg                  0x02
#define SETUP_AW_reg                   0x03
#define SETUP_RETR_reg                 0x04
#define RF_CH_reg                      0x05
#define RF_SETUP_reg                   0x06
#define STATUS_reg                     0x07
#define OBSERVE_TX_reg                 0x08
#define RPD_reg                        0x09
#define RX_ADDR_P0_reg                 0x0A
#define RX_ADDR_P1_reg                 0x0B
#define RX_ADDR_P2_reg                 0x0C
#define RX_ADDR_P3_reg                 0x0D
#define RX_ADDR_P4_reg                 0x0E 
#define RX_ADDR_P5_reg                 0x0F
#define TX_ADDR_reg                    0x10
#define RX_PW_P0_reg                   0x11
#define RX_PW_P1_reg                   0x12
#define RX_PW_P2_reg                   0x13
#define RX_PW_P3_reg                   0x14
#define RX_PW_P4_reg                   0x15
#define RX_PW_P5_reg                   0x16
#define FIFO_STATUS_reg                0x17
#define DYNPD_reg                      0x1C
#define FEATURE_reg                    0x1D

#define nrf_HIGH                       1
#define nrf_LOW                        0
//unsigned char x = 0;
int1 burst=0;


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
unsigned char nRF24L01_read()
{
unsigned char s = 0;

unsigned char msg = 0;
for(s = 0; s < 8; s++)
{
msg <<= 1;
output_bit(SCK_pin, nrf_HIGH);
if(input(MISO_pin) != 0)
{
msg |= 1;
}
output_bit(SCK_pin, nrf_LOW);
}
return msg;
}


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void nRF24L01_write(unsigned char d)
{
unsigned char s = 0;
for(s = 0; s < 8; s++)
{

if((d & 0x80) != 0)
{output_bit(MOSI_pin, nrf_HIGH);}

else
{output_bit(MOSI_pin, nrf_LOW);}

d <<= 1;
output_bit(SCK_pin, nrf_HIGH);
output_bit(SCK_pin, nrf_LOW);
}
}


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void register_write(unsigned char reg, unsigned char value)
{
output_bit(SS_pin, nrf_LOW);
nRF24L01_write((reg | W_REGISTER_cmd));
nRF24L01_write(value);
output_bit(SS_pin, nrf_HIGH);
}


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void write_command(unsigned char cmd)
{
output_bit(SS_pin, nrf_LOW);
nRF24L01_write(cmd);
output_bit(SS_pin, nrf_HIGH);
}


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
unsigned char register_read(unsigned char reg)
{
unsigned char value = 0;

output_bit(SS_pin, nrf_LOW);
nRF24L01_write((reg | R_REGISTER_cmd));
value = nRF24L01_read();
output_bit(SS_pin, nrf_HIGH);
return value;
}


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void set_TX_RX_address(unsigned char *addr, unsigned char bytes, unsigned char reg)
{
unsigned char n = 0;
output_bit(SS_pin, nrf_LOW);
nRF24L01_write((reg | W_REGISTER_cmd));
for(n = 0; n < bytes; n++)
{
nRF24L01_write(addr[n]);
}
output_bit(SS_pin, nrf_HIGH);
}


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void flush_TX_RX()
{
register_write(STATUS_reg, 0x70);
write_command(FLUSH_TX_cmd);
write_command(FLUSH_RX_cmd);
}


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void send_data(unsigned char bytes, unsigned char *value)
{
unsigned char s = 0;
output_bit(SS_pin, nrf_LOW);
nRF24L01_write(W_TX_PAYLOAD_cmd);

for(s = 0; s < bytes; s++)
{nRF24L01_write(value[s]);}
output_bit(SS_pin, nrf_HIGH);

output_bit(CE_pin, nrf_HIGH);
delay_us(20);
output_bit(CE_pin, nrf_LOW);
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void receive_data(unsigned char bytes, unsigned char *value)
{
unsigned char s = 0;

output_bit(SS_pin, nrf_LOW);
nRF24L01_write(R_RX_PAYLOAD_cmd);
delay_us(2);

for (s = 0; s < bytes; s++)
{
value[s] = nRF24L01_read();
}
delay_us(2);
output_bit(SS_pin, nrf_HIGH);
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void nRF24L01_TX_init()
{
unsigned char address[5] = {0x64, 0xFE, 0x42, 0xAC, 0xB3};
output_bit(CE_pin, nrf_LOW);

register_write(CONFIG_reg, 0x0E);           //TX_DS is reflected to IRQ pin, enable 2 byte CRC, Power-Up, Transmitter
delay_ms(2);                         //Wait for power up
register_write(EN_AA_reg, 0x3F);            //Enable auto-ack on all pipes
register_write(EN_RXADDR_reg, 0x3F);        //Enabled RX addresses (All active)
register_write(SETUP_AW_reg, 0x03);         //5 byte address width
register_write(SETUP_RETR_reg, 0xFF);       //4000us auto retransmit delay, retry 15 times before give up
register_write(RF_CH_reg, 0x17);            //2.423Ghz RF Channel. 0x17 equals 23 on decimal
register_write(RF_SETUP_reg, 0x26);         //0 Dbm, 2Mbps, no CONT_WAWE, no PLL_LOCK
set_TX_RX_address(address, 5, TX_ADDR_reg);
flush_TX_RX();
output_bit(CE_pin, nrf_HIGH);
delay_ms(2);
//PIC içinde kalan bilgilerin temizlenmesi için sfırlanıyor. Sadece MISO ve IRQ giriş olacak ve IRQ pull-up şeklinde.
output_bit(CE_pin, nrf_LOW);
output_bit(SS_pin, nrf_LOW);
output_bit(SCK_pin, nrf_LOW);
output_bit(MOSI_pin, nrf_LOW);
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void nRF24L01_RX_init()
{
unsigned char address[5] = {0x64, 0xFE, 0x42, 0xAC, 0xB3};
output_bit(CE_pin, nrf_LOW);

register_write(CONFIG_reg, 0x0F);           //RX_DR is reflected to IRQ pin, enable 2 byte CRC, Power-Up, Receiver
delay_ms(2);                         //Wait for power up
register_write(EN_AA_reg, 0x3F);            //Enable auto-ack on all pipes
register_write(EN_RXADDR_reg, 0x3F);        //Enabled RX addresses (All active)
register_write(SETUP_AW_reg, 0x03);         //5 byte address width
register_write(SETUP_RETR_reg, 0xFF);       //4000us auto retransmit delay, retry 15 times before give up
register_write(RF_CH_reg, 0x17);            //2.423Ghz RF Channel. 0x17 equals 23 on decimal
register_write(RF_SETUP_reg, 0x26);         //0 Dbm, 2Mbps, no CONT_WAWE, no PLL_LOCK
set_TX_RX_address(address, 5, RX_ADDR_P0_reg);
register_write(RX_PW_P0_reg, 16);         //32 bytes payload width
register_write(RX_PW_P1_reg, 16);         //32 bytes payload width
register_write(RX_PW_P2_reg, 16);         //32 bytes payload width
register_write(RX_PW_P3_reg, 16);         //32 bytes payload width
register_write(RX_PW_P4_reg, 16);         //32 bytes payload width
register_write(RX_PW_P5_reg, 16);         //32 bytes payload width
flush_TX_RX();
output_bit(CE_pin, nrf_HIGH);
delay_ms(2);
//PIC içinde kalan bilgilerin temizlenmesi için sfırlanıyor. Sadece MISO ve IRQ giriş olacak ve IRQ pull-up şeklinde.
output_bit(CE_pin, nrf_LOW);
output_bit(SS_pin, nrf_LOW);
output_bit(SCK_pin, nrf_LOW);
output_bit(MOSI_pin, nrf_LOW);
}

void start_listening()
{
nRF24L01_RX_init();         //Re-init module
output_high(CE_pin);     
delay_us(250);            //Keep CE high, after 130us module starts listening
}

void stop_listening()
{
//nRF24L01_RX_init();         //Re-init module
output_low(CE_pin);     
flush_TX_RX();
}

Ynt: NRF24L01+

Yanıt #1
@gevv
hocam yardımcı olur musunuz?

Ynt: NRF24L01+

Yanıt #2
donanımsal SPI kullanacaksın fakat bu modülün kendine has yetkilendirmeleri var data katoloğuu türkceye cevirerek okudukca ne olduğu anlarsan bir kere modüllü alıcı mı vericimi kullanacağını belirlemek icn yetki girişi var ben biraz inceledim ama daha önce bunu hiç kullanmadım.
BU DİYARLARA MERAK SALMIŞ , TAHSİLİNE DEVAM EDEN BİR GENÇ.

Ynt: NRF24L01+

Yanıt #3
ama aksine bu kütüphane de yazılımsal spı kullanılıyor sebebini anlamadım . evet alıcı mı verici mi olarak kullanılacağını belirten  fonksiyonlar var .
nRF24L01_TX_init();  bu fonksiyon mesela nrf yi verici olarak çalıştırıyor.
nRF24L01_RX_init();  buda verici modunda ...
ama bu modülün pic için config edilmesi grerkiyor. o kısmını çözemedim

Ynt: NRF24L01+

Yanıt #4
bak güzel kardeşim SPI PROTOKOLÜ SABİT BİRŞEYDİR.  senin yazılımsal dediğin şey ise donanım SPI porotkolünü kullanarak NRF ye göre özelleştirilmiş Yazılımsal SPI kütüphanesinidir. tamamen NRF kontrol etmek için yazılmıştır. temelinde SPI yatar ha bir de size kolaylık olsun diye işte istediğiniz portlara alma imkanı vermiştir kütüphaneyi hazırlayan kişi.

Donanımsal SPI yi biliyorsan eğer kütüphaneyi acıp inceleyince donanımsal spı nin yanında NRF icin bir kaç komut daha kullanıldığını görebilirsin. senin kafanı bulandıran şey burası işte.

BU DİYARLARA MERAK SALMIŞ , TAHSİLİNE DEVAM EDEN BİR GENÇ.