// Includes ------------------------------------------------------------------//
#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_spi.h>
#include <stdbool.h>
#include <nRF24L01_2.h>
#include <nRF24L01.h>
//#include "stm32f10x_exti.h"
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
uint8_t nRF24_2_RX_addr[nRF24_2_RX_ADDR_WIDTH] = {0xF1,0xF2,0xF3,0xF0,0xF0};//{0xF1,0xF2,0xF3,0xF0,0xF0};
uint8_t nRF24_2_TX_addr[nRF24_2_TX_ADDR_WIDTH] = {0xF1,0xF2,0xF3,0xF0,0xF0};//{0xF0,0xF0,0xF3,0xF2,0xF1}
uint8_t nRF24_1_RX_addr[nRF24_1_RX_ADDR_WIDTH] = {0xC8,0xC8,0xC8,0xC8,0xC8};//{0xF1,0xF2,0xF3,0xF0,0xF0};
uint8_t nRF24_1_TX_addr[nRF24_1_TX_ADDR_WIDTH] = {0xC8,0xC8,0xC8,0xC8,0xC8};//{0xF0,0xF0,0xF3,0xF2,0xF1}
/* Private function prototypes -----------------------------------------------*/
void DELAYus(int DELAY);
uint64_t millis();
/* Private functions ---------------------------------------------------------*/
// SPI initialization with given prescaler
void nRF24_1_SPI_Init(uint16_t prescaler)
{
SPI_InitTypeDef SPI;
SPI.SPI_Mode = SPI_Mode_Master;
SPI.SPI_BaudRatePrescaler = prescaler;
SPI.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI.SPI_CPOL = SPI_CPOL_Low;
SPI.SPI_CPHA = SPI_CPHA_1Edge;
SPI.SPI_CRCPolynomial = 7;
SPI.SPI_DataSize = SPI_DataSize_8b;
SPI.SPI_FirstBit = SPI_FirstBit_MSB;
SPI.SPI_NSS = SPI_NSS_Soft;
SPI_Init(SPI_1_PORT,&SPI);
// NSS must be set to '1' due to NSS_Soft settings (otherwise it will be Multimaster mode).
SPI_NSSInternalSoftwareConfig(SPI_1_PORT,SPI_NSSInternalSoft_Set);
}
void nRF24_2_SPI_Init(uint16_t prescaler)
{
SPI_InitTypeDef SPI;
SPI.SPI_Mode = SPI_Mode_Master;
SPI.SPI_BaudRatePrescaler = prescaler;
SPI.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI.SPI_CPOL = SPI_CPOL_Low;
SPI.SPI_CPHA = SPI_CPHA_1Edge;
SPI.SPI_CRCPolynomial = 7;
SPI.SPI_DataSize = SPI_DataSize_8b;
SPI.SPI_FirstBit = SPI_FirstBit_MSB;
SPI.SPI_NSS = SPI_NSS_Soft;
SPI_Init(SPI_2_PORT,&SPI);
// NSS must be set to '1' due to NSS_Soft settings (otherwise it will be Multimaster mode).
SPI_NSSInternalSoftwareConfig(SPI_2_PORT,SPI_NSSInternalSoft_Set);
}
// GPIO and SPI initialization
void nRF24_1_init()
{
// SPI2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
GPIO_InitTypeDef PORT;
// Configure SPI pins
PORT.GPIO_Speed = GPIO_Speed_50MHz;
PORT.GPIO_Pin = SPI_1_SCK_PIN | SPI_1_MISO_PIN | SPI_1_MOSI_PIN;
PORT.GPIO_Mode = GPIO_Mode_AF_PP;//GPIO_Mode_AF_PP;
GPIO_Init(SPI_1_GPIO_PORT,&PORT);
// Configure CS pin as output with Push-Pull
PORT.GPIO_Pin = SPI_1_CS_PIN;
PORT.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(SPI_1_GPIO_PORT,&PORT);
// Configure CE pin as output with Push-Pull
PORT.GPIO_Pin = nRF24_1_CE_PIN;
PORT.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(nRF24_1_CE_PORT,&PORT);
nRF24_1_SPI_Init(SPI_BaudRatePrescaler_32); // Which SPI speed do we need?, not less 16
SPI_Cmd(SPI_1_PORT,ENABLE);
CSN_1_H();
CE_1_L();
}
void nRF24_2_init()
{
// SPI2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
GPIO_InitTypeDef PORT;
// Configure SPI pins
PORT.GPIO_Speed = GPIO_Speed_50MHz;
PORT.GPIO_Pin = SPI_2_SCK_PIN | SPI_2_MISO_PIN | SPI_2_MOSI_PIN;
PORT.GPIO_Mode = GPIO_Mode_AF_PP;//GPIO_Mode_AF_PP;
GPIO_Init(SPI_2_GPIO_PORT,&PORT);
// Configure CS pin as output with Push-Pull
PORT.GPIO_Pin = SPI_2_CS_PIN;
PORT.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(SPI_2_GPIO_PORT,&PORT);
// Configure CE pin as output with Push-Pull
PORT.GPIO_Pin = nRF24_2_CE_PIN;
PORT.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(nRF24_2_CE_PORT,&PORT);
nRF24_2_SPI_Init(SPI_BaudRatePrescaler_32); // Which SPI speed do we need?, not less 16
SPI_Cmd(SPI_2_PORT,ENABLE);
CSN_2_H();
CE_2_L();
}
void PINS()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_7;//Enable NRF2
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//Enable NRF1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
// Send/Receive data to nRF24L01 via SPI
// input:
// data - byte to send
// output: received byte from nRF24L01
uint8_t nRF24_2_ReadWrite(uint8_t data)
{
while (SPI_I2S_GetFlagStatus(SPI_2_PORT,SPI_I2S_FLAG_TXE) == RESET); // Wait while DR register is not empty
SPI_I2S_SendData(SPI_2_PORT,data); // Send byte to SPI
while (SPI_I2S_GetFlagStatus(SPI_2_PORT,SPI_I2S_FLAG_RXNE) == RESET); // Wait to receive byte
return SPI_I2S_ReceiveData(SPI_2_PORT); // Read byte from SPI bus
}
uint8_t nRF24_1_ReadWrite(uint8_t data)
{
while (SPI_I2S_GetFlagStatus(SPI_1_PORT,SPI_I2S_FLAG_TXE) == RESET); // Wait while DR register is not empty
SPI_I2S_SendData(SPI_1_PORT,data); // Send byte to SPI
while (SPI_I2S_GetFlagStatus(SPI_1_PORT,SPI_I2S_FLAG_RXNE) == RESET); // Wait to receive byte
return SPI_I2S_ReceiveData(SPI_1_PORT); // Read byte from SPI bus
}
// Write new value to register
uint8_t nRF24_2_Write(uint8_t reg, uint8_t value)
{
uint8_t status;
CSN_2_L();
status = nRF24_2_ReadWrite(nRF24_MASK_TX_DS | (nRF24_REGISTER_MASK & reg)); // Select register
nRF24_2_ReadWrite(value); // Write value to register
CSN_2_H();
return status;
}
uint8_t nRF24_1_Write(uint8_t reg, uint8_t value)
{
uint8_t status;
CSN_1_L();
status = nRF24_1_ReadWrite(nRF24_MASK_TX_DS | (nRF24_REGISTER_MASK & reg)); // Select register
nRF24_1_ReadWrite(value); // Write value to register
CSN_1_H();
return status;
}
// Read nRF24L01 register
uint8_t nRF24_2_ReadRegister(uint8_t reg)
{
uint8_t value;
CSN_2_L();
nRF24_2_ReadWrite(nRF24_R_REGISTER | (nRF24_REGISTER_MASK & reg));
value = nRF24_2_ReadWrite(0xff);//value = nRF24_ReadWrite(0xFF);
CSN_2_H();
return value;
}
// Read nRF24L01 register
uint8_t nRF24_1_ReadRegister(uint8_t reg)
{
uint8_t value;
CSN_1_L();
nRF24_1_ReadWrite(nRF24_R_REGISTER | (nRF24_REGISTER_MASK & reg));
value = nRF24_1_ReadWrite(0xff);//value = nRF24_ReadWrite(0xFF);
CSN_1_H();
return value;
}
// Get data from nRF24L01 into buffer
uint8_t nRF24_2_ReadDataBuf(uint8_t reg, uint8_t *pBuf, uint8_t count)
{
uint8_t status,i;
CSN_2_L();
status = nRF24_2_ReadWrite(nRF24_R_REGISTER | (nRF24_REGISTER_MASK & reg));
for (i = 0; i < count; i++) pBuf[i] = nRF24_2_ReadWrite(0xFF);//pBuf[i] = nRF24_ReadWrite(0xFF);
CSN_2_H();
return status;
}
// Get data from nRF24L01 into buffer
uint8_t nRF24_1_ReadDataBuf(uint8_t reg, uint8_t *pBuf, uint8_t count)
{
uint8_t status,i;
CSN_1_L();
status = nRF24_1_ReadWrite(nRF24_R_REGISTER | (nRF24_REGISTER_MASK & reg));
for (i = 0; i < count; i++) pBuf[i] = nRF24_1_ReadWrite(0xFF);//pBuf[i] = nRF24_ReadWrite(0xFF);
CSN_1_H();
return status;
}
// Send buffer to nRF24L01
uint8_t nRF24_2_WriteDataBuf(uint8_t reg, uint8_t *pBuf, uint8_t count)
{
uint8_t status,i;
CSN_2_L();
status = nRF24_2_ReadWrite(nRF24_MASK_TX_DS | (nRF24_REGISTER_MASK & reg));
for (i = 0; i < count; i++) nRF24_2_ReadWrite(*pBuf++);
CSN_2_H();
return status;
}
// Send buffer to nRF24L01
uint8_t nRF24_1_WriteDataBuf(uint8_t reg, uint8_t *pBuf, uint8_t count)
{
uint8_t status,i;
CSN_1_L();
status = nRF24_1_ReadWrite(nRF24_MASK_TX_DS | (nRF24_REGISTER_MASK & reg));
for (i = 0; i < count; i++) nRF24_1_ReadWrite(*pBuf++);
CSN_1_H();