İsim  
Şifre 

STM32F Serisi ile NRF24L01 iletişim uygulaması

👤 Yazar: ozcan 📅 Tarih: 16.04.2026 17:18 👁️ Görüntüleme: 22

STM32F103C8 ile NRF24L01 arasında bağlantıyı ve başka bir NRF24L01 ile iletişim kuracağız.STM32F103C8 (Blue Pill) ve NRF24L01 modülleri arasındaki iletişim, genellikle SPI protokolü üzerinden yürütülür. Bu kurulumda dikkat edilmesi gereken en kritik nokta, NRF24L01'in 3.3V ile çalışmasıdır; 5V verilmesi modüle kalıcı zarar verebilir.




1. Donanım Bağlantısı (Pinout)

------------------------------

NRF24L01 Pin | STM32 Pin (SPI1) | Açıklama

VCC           | 3.3V             | Güç (Kesinlikle 3.3V)

GND          | GND             | Toprak

CE             | PB7              | Chip Enable (RX/TX Modu)

CSN          | PB6              | SPI Chip Select

SCK          | PB3              | SPI Clock

MOSI        | PB5              | Master Out Slave In

MISO        | PB4              | Master In Slave Out


2. STM32CubeIDE Yapılandırması

------------------------------

- SPI1: "Full-Duplex Master"

- Frame Format: Motorola

- Data Size: 8 Bits

- First Bit: MSB First

- CPOL/CPHA: Low / 1 Edge (Mode 0)

- GPIO: CE ve CSN pinlerini Output olarak tanımlayın.


3. Yazılım Mantığı

------------------

Başlatma (Initialization):

- Kanal: Aynı frekans kanalı (örn: Channel 76).

- Veri Hızı: 250kbps, 1Mbps veya 2Mbps.

- Adres Genişliği: Genellikle 5 byte.


Kütüphane olarak HardwareLevel tarafından hazırlanan kütüphaneyi kullanacağız. Gerekli dosyaları projemize ekleyelim. Core/Src içine NRF24.c ,Core/Inc içinede NRF24.h , NRF24_conf.h , NRF24_reg_addresses.h dosyalarını ekleyelim.

Main.h dosyamıza aşağıdaki gerekli değişiklikleri yapalım.

/* USER CODE BEGIN Includes */
#include 
#include "NRF24.h"
#include "NRF24_reg_addresses.h"

#define PLD_SIZE 32

//#define tx

/* USER CODE END Includes */
/* USER CODE BEGIN 0 */

#ifdef tx
uint8_t data_T[PLD_SIZE] = { "Merhaba !" };
uint8_t ack_T[PLD_SIZE];
#else
uint8_t data_R[PLD_SIZE];
uint8_t ack_T[PLD_SIZE] = { "Received" };
#endif

/* USER CODE END 0 */
/ /* USER CODE BEGIN 2 */
	csn_high();
	nrf24_init();
	nrf24_tx_pwr(_0dbm);
	nrf24_data_rate(_1mbps);
	nrf24_set_channel(76);
	nrf24_set_crc(en_crc, _1byte);
	nrf24_pipe_pld_size(0, PLD_SIZE);
	nrf24_dpl(1);//dinamik payload
	uint8_t addr[5] = { 0x10, 0x21, 0x32, 0x43, 0x54 };
	nrf24_open_tx_pipe(addr);
	nrf24_open_rx_pipe(0, addr);

#ifdef tx
	nrf24_stop_listen();
#else
	nrf24_listen();
#endif

  /* USER CODE END 2 */	

While döngüsü içinnede :

#ifdef tx
		nrf24_transmit(data_T, sizeof(data_T));
	HAL_Delay(1);
#else
	nrf24_listen();

	if (nrf24_data_available()) {

	    // Gelen veriyi al
	    nrf24_receive(data_R, sizeof(data_R));

	    // Eğer veri tamamen boşsa UART'a gönderme
	    uint8_t bos = 1;
	    for (uint8_t i = 0; i < sizeof(data_R); i++) {
	        if (data_R[i] != 0) {
	            bos = 0;
	            break;
	        }
	    }

	    if (!bos) {
	        char tmp[40];
	        sprintf(tmp, "-%s-\r\n", data_R);
	        HAL_UART_Transmit(&huart1, (uint8_t*)tmp, strlen(tmp), 100);
	    }

	    // Buffer'ı temizle
	    memset(data_R, 0, sizeof(data_R));
	}

	HAL_Delay(5);

#endif

Son olarak NRF24_config.h yi açıp aşağıdaki gibi spi portunu ,ce ,csn pinlerinin ayarlarını yapalım.

#ifndef _NRF_24_CONF_H_
#define _NRF_24_CONF_H_

#define hspiX hspi1
#define spi_w_timeout 1000
#define spi_r_timeout 1000
#define spi_rw_timeout 1000

#define csn_gpio_port GPIOB
#define csn_gpio_pin GPIO_PIN_6

#define ce_gpio_port GPIOB
#define ce_gpio_pin GPIO_PIN_7

#endif


Önemli İpuçları:

- Güç Sorunları: VCC ve GND arasına 10uF - 100uF kondansatör eklemek kararlılığı artırır.

- Adresleme: Alıcı ve verici adreslerinin eşleştiğinden emin olun.




💬 Yorumlar

Henüz yorum yapılmamış. İlk yorumu siz yapın!

Bir Yorum Bırakın

Güvenlik Kontrolü:

Yenidir.com
Sayfa Başı
Yenidir CMS V0.1