Nuvoton MS51TC0AE ile NRF24L01 modülünün kullanılması

Başlatan tenri, 05 Mayıs 2025, 14:31:50

tenri

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)




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);
  }
}
#################################################################

triyak


tenri

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.

bahdiyarusta

Nuvoton işlemci için Özdisan yazılım konusunda destek veriyor diye biliyorum. Meil atabilirsiniz.

tenri

Ş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.

triyak

İ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.