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.
Henüz yorum yapılmamış. İlk yorumu siz yapın!