RF24.C Driver
#include "rf24.h"
#include "main.h"
extern SPI_HandleTypeDef hspi2;
uint8_t status;
uint8_t tx_address1[5] = { 0xBB, 0xBB, 0xBB, 0xBB, 0xBB };
uint8_t rx_address1[5] = {0xBB, 0xBB, 0xBB, 0xBB, 0xBB};
void NRF24_CSN_Select(void) {
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, GPIO_PIN_RESET);
}
void NRF24_CSN_Unselect(void) {
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, GPIO_PIN_SET);
}
void NRF24_CE_Enable(void) {
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_SET);
}
void NRF24_CE_Disable(void) {
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_RESET);
}
void NRF24_WriteRegister(uint8_t reg, uint8_t data) {
NRF24_CSN_Select();
uint8_t buf[2] = { (0x20 | reg), data };
HAL_SPI_Transmit(&hspi2, buf, 2, 100);
NRF24_CSN_Unselect();
}
void NRF24_WriteRegisterMulti(uint8_t reg, uint8_t* data, uint8_t length) {
NRF24_CSN_Select();
uint8_t cmd = 0x20 | (reg & 0x1F);
HAL_SPI_Transmit(&hspi2, &cmd, 1, 100);
HAL_SPI_Transmit(&hspi2, data, length, 100);
NRF24_CSN_Unselect();
}
void NRF24_ReadPayload(uint8_t *data, uint8_t size) {
NRF24_CSN_Select();
uint8_t cmd = 0x61; // R_RX_PAYLOAD
HAL_SPI_Transmit(&hspi2, &cmd, 1, 100);
HAL_SPI_Receive(&hspi2, data, size, 100);
NRF24_CSN_Unselect();
}
void NRF24_WritePayload(uint8_t *data, uint8_t size) {
NRF24_CSN_Select();
uint8_t cmd = 0xA0; // W_TX_PAYLOAD
HAL_SPI_Transmit(&hspi2, &cmd, 1, 100);
HAL_SPI_Transmit(&hspi2, data, size, 100);
NRF24_CSN_Unselect();
}
void NRF24_FlushRX(void) {
NRF24_CSN_Select();
uint8_t cmd = 0xE2;
HAL_SPI_Transmit(&hspi2, &cmd, 1, 100);
NRF24_CSN_Unselect();
}
void NRF24_Init(void) {
NRF24_CE_Disable();
NRF24_CSN_Select();
HAL_Delay(5);
NRF24_WriteRegister(CONFIG, 0x0B); // RX mode, CRC enabled
NRF24_WriteRegister(EN_AA, 0x00); // Auto ACK kapalı
NRF24_WriteRegister(EN_RXADDR, 0x01); // Pipe 0 aktif
NRF24_WriteRegister(SETUP_AW, 0x03); // 5 byte adres
NRF24_WriteRegister(SETUP_RETR, 0x00); // Retry yok
NRF24_WriteRegister(RF_CH, 76); // Kanal 76
NRF24_WriteRegister(RF_SETUP, 0x06); // 1 Mbps, 0 dBm
NRF24_WriteRegister(RX_PW_P0, NRF_PAYLOAD_SIZE);
NRF24_WriteRegisterMulti(TX_ADDR, tx_address1, 5);
NRF24_WriteRegisterMulti(RX_ADDR_P0, rx_address1, 5);
NRF24_FlushRX();
NRF24_CE_Disable();
NRF24_CSN_Unselect();
}
void NRF24_SetRXMode(void) {
NRF24_CE_Disable();
NRF24_WriteRegister(CONFIG, 0x0B); // RX mode + CRC + PWR_UP
HAL_Delay(2);
NRF24_CE_Enable(); // RX için CE HIGH olmalı
}
void NRF24_SetTXMode(void) {
NRF24_WriteRegister(CONFIG, 0x0A); // TX mode
HAL_Delay(2);
}
void NRF24_Transmit(uint8_t *data, uint8_t size) {
NRF24_SetTXMode();
NRF24_WritePayload(data, size);
NRF24_CE_Enable();
HAL_Delay(1);
NRF24_CE_Disable();
NRF24_SetRXMode();
}
uint8_t NRF24_ReadRegister(uint8_t reg) {
uint8_t value;
NRF24_CSN_Select();
uint8_t cmd = reg & 0x1F;
HAL_SPI_Transmit(&hspi2, &cmd, 1, 100);
HAL_SPI_Receive(&hspi2, &value, 1, 100);
NRF24_CSN_Unselect();
return value;
}
void NRF24_ReadRegisteraddr(uint8_t reg, uint8_t* deger) {
NRF24_CSN_Select();
uint8_t dummy[5] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
uint8_t cmd = reg & 0x1F;
HAL_SPI_Transmit(&hspi2, &cmd, 1, 100);
HAL_SPI_TransmitReceive(&hspi2, dummy, deger, 5, 100);
NRF24_CSN_Unselect();
}
uint8_t NRF24_GetStatus(void) {
uint8_t status;
uint8_t cmd = 0xFF;
NRF24_CSN_Select();
HAL_SPI_TransmitReceive(&hspi2, &cmd, &status, 1, 100);
NRF24_CSN_Unselect();
return status;
}
uint8_t NRF24_Receive(uint8_t *data) {
status = NRF24_GetStatus();
if (status & 0x40) { // RX_DR bit kontrolü
NRF24_ReadPayload(data, NRF_PAYLOAD_SIZE);
NRF24_WriteRegister(STATUS, 0x40); // RX_DR bayrağını temizle
return 1; // Veri geldi
}
return 0; // Veri yok
}
void nrfsendCmd (uint8_t cmd)
{
// CS pinini seç (LOW yap)
NRF24_CSN_Select();
HAL_SPI_Transmit(&hspi2, &cmd, 1, 100);
// CS pinini bırak (HIGH yap)
NRF24_CSN_Unselect();
}
void NRF24_ResetModule(void) {
NRF24_CE_Disable();
HAL_Delay(10);
NRF24_WriteRegister(STATUS, 0x70); // tüm IRQ bayraklarını temizle
nrfsendCmd(FLUSH_TX);
nrfsendCmd(FLUSH_RX);
NRF24_WriteRegister(CONFIG, 0x0B); // RX mode, CRC enabled, PWR_UP
NRF24_CE_Enable();
HAL_Delay(10);
}