Arkadaşlar herkese merhabalar,
NRF24L01 modülünü nuvoton ms51tc0ae işlemcisinin SPI fonksiyonu ile kontrol etmeye çalışıyorum. MS51TC0AE işlemcisinin sürdüğü modülü verici olarak çalıştırmak istiyorum. Alıcı tarafını da idarelik olarak arduino uno kartına bağladığım NRF24L01 modülünün olmasını istiyorum. Gerekli kodları yazdım, NRF24L01 vericisinin ayarlamalarını yapıyorum. Ayarlamalar aşağıdaki sinyal görselinde görülmektedir. Ayrıca data olarak da 0x05 verisini ayarlamaları yaptıktan sonra 1sn de bir hatta basıyorum. (0xE1 olarak görülen 8bitlik veri FLUXH reset için hatta basılıyor)
(https://i.ibb.co/dsy46gSp/1.png) (https://ibb.co/dsy46gSp)
(https://i.ibb.co/0ymHPQZD/2.png) (https://ibb.co/0ymHPQZD)
Ancak Arduino alıcı tarafında hiçbir veriyi alamıyorum. Aşağıda paylaştığım kodun kontrollerini yapıyorum. Datasheete göre de gözden kaçırdığım bir durum yok ama haberleşmemelerine anlam veremedim.
NOT: Modüllerin ikisi de doğru bir şekilde çalışıyor.
#################################################################
#NUVOTON VERICI KODU#
#####################
void main(void)
{
MODIFY_HIRC(HIRC_24);
FsysSelect(FSYS_HIRC);
SCK = 0;
CE = 0;
CSN = 1;
P00_PUSHPULL_MODE;
P12_PUSHPULL_MODE;
P13_PUSHPULL_MODE;
P17_PUSHPULL_MODE;
SPCR = 0x50; // Master mod, Fosc/4
SPSR = 0x01; // SPI2X = 1 (hizli mod)
P14_QUASI_MODE;
delayMS(1000);
CE_Select();
delayUS(50); // minimum 10 µs yeterli
CE_UnSelect();
NRF24_Init();
delayMS(100);
P14=0;
while(1)
{
NRF24_Transmit(0x05);
delayMS(500);
}
}
void delayUS(uint16_t delay_US) //HIRC_24 Kullanilirsa: 10us = 10 degerini gir, 100us = 120 degerini gir, 250us = 220 degerini gir. 1ms = 1000 degerini gir.
{
for(i=0;i<delay_US;i++)
{
nop;
nop;
nop;
nop;
}
}
void delayMS(uint16_t delay_MS) //HIRC_24 Kullanilirsa: MS için 1000ms = 1000 degerini gir, 500ms = 500 degerini gir, 250ms = 250 degerini gir
{
Timer0_Delay(24000000,1000,delay_MS);
}
void CSN_Select(void)
{
CSN = 0;
}
void CSN_UnSelect(void)
{
CSN = 1;
}
void CE_Select(void)
{
CE = 1;
}
void CE_UnSelect(void)
{
CE = 0;
}
void SPI_send_byte(uint8_t SPI_Data)
{
for (sayac = 0; sayac < 8; sayac++)
{
MOSI = ((SPI_Data >> 7) & (0x01));
SCK = 1;
delayUS(10); // Daha uzun delay
SCK = 0;
delayUS(10);
SPI_Data <<= 1;
}
}
void nrf24_WriteReg(uint8_t Reg, uint8_t Data)
{
CSN_Select();
bufferReg = (W_REGISTER | (Reg & 0x1F));
bufferData = Data;
SPI_send_byte(bufferReg);
SPI_send_byte(bufferData);
CSN_UnSelect();
}
void NRF24_AdressTX(uint8_t reg, uint8_t *dataa)
{
CSN_Select();
SPI_send_byte(0x20 | reg); // Write register komutu (0x20 + transmitter adresi)
SPI_send_byte(dataa[0]); // Veriyi sirayla gönder
SPI_send_byte(dataa[1]); // Veriyi sirayla gönder
SPI_send_byte(dataa[2]); // Veriyi sirayla gönder
SPI_send_byte(dataa[3]); // Veriyi sirayla gönder
SPI_send_byte(dataa[4]); // Veriyi sirayla gönder
CSN_UnSelect();
}
void NRF24_Init()
{
nrf24_WriteReg(CONFIG, 0x0A);
delayMS(1);
nrf24_WriteReg(EN_AA, 0x00); //NO AUTO ACK
nrf24_WriteReg(EN_RXADDR, 0x01); //DATA PIPE YOK
nrf24_WriteReg(SETUP_AW, 0x03); //5 BYTE TRANSFER
nrf24_WriteReg(SETUP_RETR, 0x00); //TEKRAR GÖNDERIM YOK
nrf24_WriteReg(RF_CH, 0x00); //0.KANAL AYARLANDI
nrf24_WriteReg(RF_SETUP, 0x06); //POWER = 0dB , RATE = 1Mbps
NRF24_AdressTX(TX_ADDR, TxAddr);
}
void NRF24_Transmit(uint8_t dataa)
{
CE_UnSelect();
CSN_Select();
SPI_send_byte(FLUSH_TX);
CSN_UnSelect();
delayUS(1);
CSN_Select();
SPI_send_byte(W_TX_PAYLOAD); // 0xA0 komutu
SPI_send_byte(dataa); // gönderilecek veri
CSN_UnSelect();
// CE'yi 1 yaparak gönderimi tetikle
CE_Select();
delayUS(20);
CE_UnSelect();
}
#############################################################
###################################
#######ARDUINO ALICI KODU#########
##################################
#include <SPI.h>
#include <RF24.h>
// CE ve CSN pinleri
RF24 radio(9, 10);
// MS51 tarafında kullanılan 5-byte adres
const byte address[5] = {0xE1, 0xE2, 0xE3, 0xE4, 0xE5};
void setup() {
Serial.begin(9600);
radio.begin();
radio.setAutoAck(false); // MS51'de de ACK kapalı
radio.setRetries(0, 0); // Retry yok
radio.setAddressWidth(5); // 5 byte adres
radio.setChannel(0); // Kanal 0 (MS51 ile aynı)
radio.setDataRate(RF24_1MBPS); // 1 Mbps hız
radio.setPALevel(RF24_PA_LOW); // Güç seviyesi (yakın için LOW yeterli)
radio.openReadingPipe(0, address); // Pipe 0'a adres atanıyor
radio.startListening(); // Alıcı moduna geç
}
void loop() {
if (radio.available()) {
byte data;
radio.read(&data, sizeof(data));
Serial.print("Gelen veri: ");
Serial.println(data, HEX);
}
}
#################################################################
nuvoton tarafında gönderim adresini göremedim?
Aslında kodun bir kısmını buraya yükledim. Definitions.h içerisinde tanımlamalarım mevcut.
uint8_t TxAddr[] = {0xE1,0xE2,0xE3,0xE4,0xE5};
NRF24_AdressTX(TX_ADDR, TxAddr); bu şekilde adres tanımlamasını yapıyorum.
Nuvoton işlemci için Özdisan yazılım konusunda destek veriyor diye biliyorum. Meil atabilirsiniz.
Şuan SPI veri yazma ve okuma konusunda bir problemim yok. NRF24L01 için gerekli ayarlamaları yapıp SPI hattına basıyorum ancak herhangi bir tepki vermiyor.
İnternette arduino ile çok sayıda örnek var. önce iki tarafta da arduino kullanıp haberleşme sağlayın. Bu esnada da spı hattı dinleyip kaydedin. Daha sonra verici tarafı nuvoton ile değiştirip haberleşme sağlayın. En güzel bu şekilde ilerleme sağlarsınız.
Biliyorsunuz bu nrf24ler ilk çalıştırmada da çoooook nazlıdır. Arduino ve hazır kod ile de tek seferde çalışmama ihtimali çok yüksek.