Hi.
Hope you are well.
I want to send data from nRF51822 to nRF24L01+. I used the esb library to configure the nRF51 and I just change the settings as I want ( some settings such as RF channel, CRC, Data Rate &...).
I use a STM32f103c8t6 micro-controller to configure nRF24l01+. I know that I am connecting with nRF24 via SPI because I am able to read the registers that I configure. all the necessary configurations that should be the same in both chips, are the same but the do not get connected. in the following I will attach the main source code for both of the modules I am using.
I will be happy to get some help.
here is the main code that I wrote for nRF24 configuartion
/** NRF24L01 Congiguration
******************************************************************************
* File Name : main.c
* Description : Main program body
******************************************************************************
*
* COPYRIGHT(c) 2020 STMicroelectronics
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of STMicroelectronics nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f1xx_hal.h"
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
/* Private variables ---------------------------------------------------------*/
SPI_HandleTypeDef hspi2;
UART_HandleTypeDef huart2;
UART_HandleTypeDef huart3;
DMA_HandleTypeDef hdma_usart2_tx;
DMA_HandleTypeDef hdma_memtomem_dma1_channel1;
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
// opcode commands
const uint8_t R_REGISTER[]={0x00};
const uint8_t W_REGISTER[]={0x20};
const uint8_t R_RX_PAYLOAD[]={0x61};
const uint8_t W_TX_PAYLOAD[]={0xA0};
const uint8_t FLUSH_TX[]={0xE1};
const uint8_t FLUSH_RX[]={0xE2};
const uint8_t REUSE_TX_PL[]={0xE3};
const uint8_t R_RX_PL_WID[]={0x60};
const uint8_t W_ACK_PAYLOAD[]={0xA8};
const uint8_t W_TX_PAYLOAD_NOACK[]={0xB0};
const uint8_t NOP[]={0xFF};
// Register ADDRESSES
const uint8_t READ_CONFIG[]={0x00};
const uint8_t WRITE_CONFIG[]={0x20};
const uint8_t READ_EN_AA[]={0x01};
const uint8_t WRITE_EN_AA[]={0x21};
const uint8_t READ_EN_RXADDR[]={0x02};
const uint8_t WRITE_EN_RXADDR[]={0x22};
const uint8_t READ_SETUP_AW[]={0x03};
const uint8_t WRITE_SETUP_AW[]={0x23};
const uint8_t READ_SETUP_RETR[]={0x04};
const uint8_t WRITE_SETUP_RETR[]={0x24};
const uint8_t READ_RF_CH[]={0x05};
const uint8_t WRITE_RF_CH[]={0x25};
const uint8_t READ_RF_SETUP[]={0x06};
const uint8_t WRITE_RF_SETUP[]={0x26};
const uint8_t READ_STATUS[]={0x07};
const uint8_t WRITE_STATUS[]={0x27};
const uint8_t READ_OBSERVE_TX[]={0x08};
const uint8_t READ_PRD[]={0x09};
const uint8_t READ_RX_ADDR_P0[]={0x0A};
const uint8_t WRITE_RX_ADDR_P0[]={0x2A};
const uint8_t READ_RX_ADDR_P1[]={0x0B};
const uint8_t WRITE_RX_ADDR_P1[]={0x2B};
const uint8_t READ_RX_ADDR_P2[]={0x0C};
const uint8_t WRITE_RX_ADDR_P2[]={0x2C};
const uint8_t READ_RX_ADDR_P3[]={0x0D};
const uint8_t WRITE_RX_ADDR_P3[]={0x2D};
const uint8_t READ_RX_ADDR_P4[]={0x0E};
const uint8_t WRITE_RX_ADDR_P4[]={0x2E};
const uint8_t READ_RX_ADDR_P5[]={0x0F};
const uint8_t WRITE_RX_ADDR_P5[]={0x2F};
const uint8_t READ_TX_ADDR[]={0x10};
const uint8_t WRITE_TX_ADDR[]={0x30};
const uint8_t READ_RX_PW_P0[]={0x11};
const uint8_t WRITE_RX_PW_P0[]={0x31};
const uint8_t READ_RX_PW_P1[]={0x12};
const uint8_t WRITE_RX_PW_P1[]={0x32};
const uint8_t READ_RX_PW_P2[]={0x13};
const uint8_t WRITE_RX_PW_P2[]={0x33};
const uint8_t READ_RX_PW_P3[]={0x14};
const uint8_t WRITE_RX_PW_P3[]={0x34};
const uint8_t READ_RX_PW_P4[]={0x15};
const uint8_t WRITE_RX_PW_P4[]={0x35};
const uint8_t READ_RX_PW_P5[]={0x16};
const uint8_t WRITE_RX_PW_P5[]={0x36};
const uint8_t READ_FIFO_STATUS[]={0x17};
const uint8_t READ_DYNPD[]={0x1C};
const uint8_t WRITE_DYNPD[]={0x3C};
const uint8_t READ_FEATURE[]={0x1D};
const uint8_t WRITE_FEATURE[]={0x3D};
uint8_t Rxbuffer[]={0x00};
uint8_t num[]={0};
uint8_t buff[2]={0,0};
uint8_t zero[2]={0,0};
uint8_t header[3]={255,255,50};
const int RX_Mode=1;
const int TX_Mode=2;
uint8_t STATUS[]={0};
uint8_t CONFIG[]={0x0F}; // Rx mode = 0x0F ; Tx mode = 0x0E
uint8_t EN_AA[]={0x3F}; //
uint8_t EN_RXADDR[]={0x3F};
uint8_t SETUP_AW[]={0x02};
uint8_t SETUP_RETR[]={0x2F};
uint8_t RF_CH[]={0x0F};
uint8_t RF_SETUP[]={0x9F};
uint8_t DYNPD[]={0x3F};
uint8_t FEATURE[]={0x07};
uint8_t RX_PW_P0[]={0x20};
uint8_t RX_PW_P1[]={0x20};
uint8_t RX_PW_P2[]={0x20};
uint8_t RX_PW_P3[]={0x20};
uint8_t RX_PW_P4[]={0x20};
uint8_t RX_PW_P5[]={0x20};
uint8_t STAT[]={0x7E};
//uint8_t RX_ADDR_P0[]={0xE7,0xE7,0xE7,0xE7,0xE7};
//
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void Error_Handler(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_SPI2_Init(void);
static void MX_USART3_UART_Init(void);
static void MX_USART2_UART_Init(void);
/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
void Send_command(uint8_t *opcode);
void Write_Register(uint8_t *ADDR, uint8_t *Data);
void Read_Register(uint8_t *ADDR, uint16_t num);
void NRF_Deinit(void);
void NRF_Init(void);
void Radio_up(void);
void Radio_down(void);
/* USER CODE END PFP */
/* USER CODE BEGIN 0 */
/******************************************************************************
CS --> GPIOA-8
CE --> GPIOA-9
IRQ --> GPIOB-12
MISO --> GPIOB-14
MOSI --> GPIOB-15
SCK --> GPIOB-13
SWDIO --> GPIOA-13
SWDCLK --> GPIOA-14
LED1 --> GPIOA-15
LED2 --> GPIOB-3
LED3 --> GPIOB-4
LED4 --> GPIOB-5
LED5 --> GPIOB-6
LED6 --> GPIOB-7
LED7 --> GPIOA-5
LED8 --> GPIOA-6
LED9 --> GPIOA-7
LED10 --> GPIOB-0
LED11 --> GPIOB-1
LED12 --> GPIOB-2
UART3RX --> GPIOB-11
UART3TX --> GPIOB-12
UART2RX --> GPIOA-3
UART2TX --> GPIOA-2
*******************************************************************************/
/* USER CODE END 0 */
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_SPI2_Init();
MX_USART3_UART_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
// HAL_MspInit();
HAL_UART_MspInit(&huart2);
HAL_SPI_MspInit(&hspi2);
HAL_UART_MspInit(&huart3);
NRF_Init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
// Radio_up();
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
Read_Register((uint8_t*)READ_FIFO_STATUS,1);
HAL_UART_Transmit(&huart2,Rxbuffer,1,10);
Send_command((uint8_t*)R_RX_PAYLOAD);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
HAL_SPI_Receive(&hspi2,Rxbuffer,4,10);
HAL_UART_Transmit(&huart2,Rxbuffer,4,10);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
Write_Register((uint8_t*) WRITE_STATUS,(uint8_t*) STAT);
}
/* USER CODE END 3 */
}
/** System Clock Configuration
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
/* SPI2 init function */
static void MX_SPI2_Init(void)
{
hspi2.Instance = SPI2;
hspi2.Init.Mode = SPI_MODE_MASTER;
hspi2.Init.Direction = SPI_DIRECTION_2LINES;
hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi2.Init.NSS = SPI_NSS_SOFT;
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi2.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi2) != HAL_OK)
{
Error_Handler();
}
}
/* USART2 init function */
static void MX_USART2_UART_Init(void)
{
huart2.Instance = USART2;
huart2.Init.BaudRate = 921600;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
}
/* USART3 init function */
static void MX_USART3_UART_Init(void)
{
huart3.Instance = USART3;
huart3.Init.BaudRate = 921600;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart3) != HAL_OK)
{
Error_Handler();
}
}
/**
* Enable DMA controller clock
* Configure DMA for memory to memory transfers
* hdma_memtomem_dma1_channel1
*/
static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
__HAL_RCC_DMA1_CLK_ENABLE();
/* Configure DMA request hdma_memtomem_dma1_channel1 on DMA1_Channel1 */
hdma_memtomem_dma1_channel1.Instance = DMA1_Channel1;
hdma_memtomem_dma1_channel1.Init.Direction = DMA_MEMORY_TO_MEMORY;
hdma_memtomem_dma1_channel1.Init.PeriphInc = DMA_PINC_ENABLE;
hdma_memtomem_dma1_channel1.Init.MemInc = DMA_MINC_ENABLE;
hdma_memtomem_dma1_channel1.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_memtomem_dma1_channel1.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_memtomem_dma1_channel1.Init.Mode = DMA_NORMAL;
hdma_memtomem_dma1_channel1.Init.Priority = DMA_PRIORITY_HIGH;
if (HAL_DMA_Init(&hdma_memtomem_dma1_channel1) != HAL_OK)
{
Error_Handler();
}
/* DMA interrupt init */
/* DMA1_Channel1_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
/* DMA1_Channel7_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);
}
/** Configure pins as
* Analog
* Input
* Output
* EVENT_OUT
* EXTI
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8
|GPIO_PIN_9|GPIO_PIN_15, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);
/*Configure GPIO pins : PA5 PA6 PA7 PA15 */
GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pins : PB0 PB1 PB2 PB3
PB4 PB5 PB6 PB7 */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pin : PB12 */
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pins : PA8 PA9 */
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}
/* USER CODE BEGIN 4 */
/*Write register function*/
void Write_Register(uint8_t *ADDR, uint8_t *Data)
{
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi2,ADDR,STATUS,1,10);
HAL_SPI_Transmit(&hspi2,Data,1,10);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
}
/*Read register function*/
void Read_Register(uint8_t *ADDR, uint16_t num)
{
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi2,ADDR,STATUS,1,10);
HAL_SPI_Receive(&hspi2,Rxbuffer,num,10);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
}
/*Send commands to NRF24L01+ function*/
void Send_command(uint8_t *opcode)
{
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi2,opcode,STATUS,1,10);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
}
void Radio_up(void)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);
}
void Radio_down(void)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
}
/*initialize NRF24L01+ function*/
void NRF_Init(void)
{
NRF_Deinit();
Radio_down();
Write_Register((uint8_t*)WRITE_CONFIG,(uint8_t*)CONFIG);
Write_Register((uint8_t*)WRITE_EN_AA,(uint8_t*)EN_AA);
Write_Register((uint8_t*)WRITE_EN_RXADDR,(uint8_t*)EN_RXADDR);
Write_Register((uint8_t*)WRITE_SETUP_AW,(uint8_t*)SETUP_AW);
Write_Register((uint8_t*)WRITE_SETUP_RETR,(uint8_t*)SETUP_RETR);
Write_Register((uint8_t*)WRITE_RF_CH,(uint8_t*)RF_CH);
Write_Register((uint8_t*)WRITE_RF_SETUP,(uint8_t*)RF_SETUP);
Write_Register((uint8_t*)WRITE_RX_PW_P0,(uint8_t*)RX_PW_P0);
Write_Register((uint8_t*)WRITE_RX_PW_P1,(uint8_t*)RX_PW_P1);
Write_Register((uint8_t*)WRITE_RX_PW_P2,(uint8_t*)RX_PW_P2);
Write_Register((uint8_t*)WRITE_RX_PW_P3,(uint8_t*)RX_PW_P3);
Write_Register((uint8_t*)WRITE_RX_PW_P4,(uint8_t*)RX_PW_P4);
Write_Register((uint8_t*)WRITE_RX_PW_P5,(uint8_t*)RX_PW_P5);
Write_Register((uint8_t*)WRITE_DYNPD,(uint8_t*)DYNPD);
Write_Register((uint8_t*)WRITE_FEATURE,(uint8_t*)FEATURE);
Radio_up();
}
void NRF_Deinit(void)
{
Radio_down();
Write_Register((uint8_t*)WRITE_CONFIG,0x00);
Write_Register((uint8_t*)WRITE_EN_RXADDR,0x00);
Write_Register((uint8_t*)WRITE_SETUP_RETR,0x00);
Write_Register((uint8_t*)WRITE_RF_CH,(uint8_t*)0x02);
Write_Register((uint8_t*)WRITE_EN_AA,0x00);
Write_Register((uint8_t*)WRITE_RF_SETUP,(uint8_t*)0x0E);
Write_Register((uint8_t*)WRITE_DYNPD,0x00);
Write_Register((uint8_t*)WRITE_FEATURE,0x00);
Radio_up();
Send_command((uint8_t*)FLUSH_TX);
Send_command((uint8_t*)FLUSH_RX);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_12)
{
// HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8, GPIO_PIN_RESET);
// HAL_SPI_TransmitReceive(&hspi2,zero,Rxbuffer,3,10);
// HAL_SPI_TransmitReceive(&hspi2,zero,buff,24,10);
// HAL_UART_Transmit(&huart2,header,3,10);
// HAL_UART_Transmit(&huart2,buff,24,10);
// HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
}
}
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @param None
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler */
/* User can add his own implementation to report the HAL error return state */
while(1)
{
}
/* USER CODE END Error_Handler */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
here is the main.c file from esb library with my little changes
/**ESB_PTX main.c
* Copyright (c) 2014 - 2017, Nordic Semiconductor ASA
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form, except as embedded into a Nordic
* Semiconductor ASA integrated circuit in a product or a software update for
* such product, must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* 4. This software, with or without modification, must only be used with a
* Nordic Semiconductor ASA integrated circuit.
*
* 5. Any software provided in binary form under this license must not be reverse
* engineered, decompiled, modified and/or disassembled.
*
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include "sdk_common.h"
#include "nrf.h"
#include "nrf_esb.h"
#include "nrf_error.h"
#include "nrf_esb_error_codes.h"
#include "nrf_delay.h"
#include "nrf_gpio.h"
#include "boards.h"
#include "nrf_delay.h"
#include "app_util.h"
#define NRF_LOG_MODULE_NAME "APP"
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
static nrf_esb_payload_t tx_payload = NRF_ESB_CREATE_PAYLOAD(0, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00);
static nrf_esb_payload_t rx_payload;
/*lint -save -esym(40, BUTTON_1) -esym(40, BUTTON_2) -esym(40, BUTTON_3) -esym(40, BUTTON_4) -esym(40, LED_1) -esym(40, LED_2) -esym(40, LED_3) -esym(40, LED_4) */
void nrf_esb_event_handler(nrf_esb_evt_t const * p_event)
{
switch (p_event->evt_id)
{
case NRF_ESB_EVENT_TX_SUCCESS:
NRF_LOG_DEBUG("TX SUCCESS EVENT\r\n");
break;
case NRF_ESB_EVENT_TX_FAILED:
NRF_LOG_DEBUG("TX FAILED EVENT\r\n");
(void) nrf_esb_flush_tx();
(void) nrf_esb_start_tx();
break;
case NRF_ESB_EVENT_RX_RECEIVED:
NRF_LOG_DEBUG("RX RECEIVED EVENT\r\n");
while (nrf_esb_read_rx_payload(&rx_payload) == NRF_SUCCESS)
{
if (rx_payload.length > 0)
{
NRF_LOG_DEBUG("RX RECEIVED PAYLOAD\r\n");
}
}
break;
}
NRF_GPIO->OUTCLR = 0xFUL << 12;
NRF_GPIO->OUTSET = (p_event->tx_attempts & 0x0F) << 12;
}
void clocks_start( void )
{
NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;
NRF_CLOCK->TASKS_HFCLKSTART = 1;
while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0);
}
void gpio_init( void )
{
nrf_gpio_range_cfg_output(8, 15);
bsp_board_leds_init();
}
uint32_t esb_init( void )
{
uint32_t err_code;
uint8_t base_addr_0[4] = {0xE7, 0xE7, 0xE7, 0xE7};
uint8_t base_addr_1[4] = {0xC2, 0xC2, 0xC2, 0xC2};
uint8_t addr_prefix[8] = {0xE7, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8 };
nrf_esb_config_t nrf_esb_config = NRF_ESB_DEFAULT_CONFIG;
nrf_esb_config.protocol = NRF_ESB_PROTOCOL_ESB_DPL;
nrf_esb_config.retransmit_delay = 750;
nrf_esb_config.bitrate = NRF_ESB_BITRATE_2MBPS;
nrf_esb_config.event_handler = nrf_esb_event_handler;
nrf_esb_config.mode = NRF_ESB_MODE_PTX;
nrf_esb_config.selective_auto_ack = false;
nrf_esb_set_rf_channel((uint32_t) 0);
err_code = nrf_esb_init(&nrf_esb_config);
VERIFY_SUCCESS(err_code);
err_code = nrf_esb_set_base_address_0(base_addr_0);
VERIFY_SUCCESS(err_code);
err_code = nrf_esb_set_base_address_1(base_addr_1);
VERIFY_SUCCESS(err_code);
err_code = nrf_esb_set_prefixes(addr_prefix, 8);
VERIFY_SUCCESS(err_code);
return err_code;
}
int main(void)
{
ret_code_t err_code;
gpio_init();
err_code = NRF_LOG_INIT(NULL);
APP_ERROR_CHECK(err_code);
clocks_start();
err_code = esb_init();
APP_ERROR_CHECK(err_code);
bsp_board_leds_init();
NRF_LOG_DEBUG("Enhanced ShockBurst Transmitter Example running.\r\n");
while (true)
{
NRF_LOG_DEBUG("Transmitting packet %02x\r\n", tx_payload.data[1]);
tx_payload.noack = false;
if (nrf_esb_write_payload(&tx_payload) == NRF_SUCCESS)
{
// Toggle one of the LEDs.
nrf_gpio_pin_write(LED_1, !(tx_payload.data[1]%8>0 && tx_payload.data[1]%8<=4));
nrf_gpio_pin_write(LED_2, !(tx_payload.data[1]%8>1 && tx_payload.data[1]%8<=5));
nrf_gpio_pin_write(LED_3, !(tx_payload.data[1]%8>2 && tx_payload.data[1]%8<=6));
nrf_gpio_pin_write(LED_4, !(tx_payload.data[1]%8>3));
tx_payload.data[1]++;
}
else
{
NRF_LOG_WARNING("Sending packet failed\r\n");
}
nrf_delay_us(50000);
}
}
/*lint -restore */
here is the nrf_esb.h
/**
* Copyright (c) 2016 - 2017, Nordic Semiconductor ASA
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form, except as embedded into a Nordic
* Semiconductor ASA integrated circuit in a product or a software update for
* such product, must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* 4. This software, with or without modification, must only be used with a
* Nordic Semiconductor ASA integrated circuit.
*
* 5. Any software provided in binary form under this license must not be reverse
* engineered, decompiled, modified and/or disassembled.
*
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef __NRF_ESB_H
#define __NRF_ESB_H
#include <stdbool.h>
#include <stdint.h>
#include "nrf.h"
#include "app_util.h"
#ifdef __cplusplus
extern "C" {
#endif
/** @defgroup nrf_esb Enhanced ShockBurst
* @{
* @ingroup proprietary_api
*
* @brief Enhanced ShockBurst (ESB) is a basic protocol that supports two-way data
* packet communication including packet buffering, packet acknowledgment,
* and automatic retransmission of lost packets.
*/
#define DEBUGPIN1 12
#define DEBUGPIN2 13
#define DEBUGPIN3 14
#define DEBUGPIN4 15
#ifdef NRF_ESB_DEBUG
#define DEBUG_PIN_SET(a) (NRF_GPIO->OUTSET = (1 << (a)))
#define DEBUG_PIN_CLR(a) (NRF_GPIO->OUTCLR = (1 << (a)))
#else
#define DEBUG_PIN_SET(a)
#define DEBUG_PIN_CLR(a)
#endif
// Hardcoded parameters - change if necessary
#ifndef NRF_ESB_MAX_PAYLOAD_LENGTH
#define NRF_ESB_MAX_PAYLOAD_LENGTH 32 /**< The maximum size of the payload. Valid values are 1 to 252. */
#endif
#define NRF_ESB_TX_FIFO_SIZE 8 /**< The size of the transmission first-in, first-out buffer. */
#define NRF_ESB_RX_FIFO_SIZE 8 /**< The size of the reception first-in, first-out buffer. */
// 252 is the largest possible payload size according to the nRF5 architecture.
STATIC_ASSERT(NRF_ESB_MAX_PAYLOAD_LENGTH <= 252);
#define NRF_ESB_SYS_TIMER NRF_TIMER2 /**< The timer that is used by the module. */
#define NRF_ESB_SYS_TIMER_IRQ_Handler TIMER2_IRQHandler /**< The handler that is used by @ref NRF_ESB_SYS_TIMER. */
#define NRF_ESB_PPI_TIMER_START 10 /**< The PPI channel used for timer start. */
#define NRF_ESB_PPI_TIMER_STOP 11 /**< The PPI channel used for timer stop. */
#define NRF_ESB_PPI_RX_TIMEOUT 12 /**< The PPI channel used for RX time-out. */
#define NRF_ESB_PPI_TX_START 13 /**< The PPI channel used for starting TX. */
// Interrupt flags
#define NRF_ESB_INT_TX_SUCCESS_MSK 0x01 /**< The flag used to indicate a success since the last event. */
#define NRF_ESB_INT_TX_FAILED_MSK 0x02 /**< The flag used to indicate a failure since the last event. */
#define NRF_ESB_INT_RX_DR_MSK 0x04 /**< The flag used to indicate that a packet was received since the last event. */
#define NRF_ESB_PID_RESET_VALUE 0xFF /**< Invalid PID value that is guaranteed to not collide with any valid PID value. */
#define NRF_ESB_PID_MAX 3 /**< The maximum value for PID. */
#define NRF_ESB_CRC_RESET_VALUE 0xFFFF /**< The CRC reset value. */
#define ESB_EVT_IRQ SWI0_IRQn /**< The ESB event IRQ number when running on an nRF5x device. */
#define ESB_EVT_IRQHandler SWI0_IRQHandler /**< The handler for @ref ESB_EVT_IRQ when running on an nRF5x device. */
/** Default address configuration for ESB. Roughly equal to the nRF24Lxx default (except for the number of pipes, because more pipes are supported). */
#define NRF_ESB_ADDR_DEFAULT \
{ \
.base_addr_p0 = {0xE7, 0xE7, 0xE7, 0xE7 }, \
.base_addr_p1 = {0xC2, 0xC2, 0xC2, 0xC2 }, \
.pipe_prefixes = { 0xE7, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8 }, \
.addr_length = 4, \
.num_pipes = 1, \
.rf_channel = 0x0F, \
.rx_pipes_enabled = 0xFF \
}
/** Default radio parameters. Roughly equal to the nRF24Lxx default parameters (except for CRC, which is set to 16 bit, and protocol, which is set to DPL). */
#define NRF_ESB_DEFAULT_CONFIG {.protocol = NRF_ESB_PROTOCOL_ESB_DPL, \
.mode = NRF_ESB_MODE_PTX, \
.event_handler = 0, \
.bitrate = NRF_ESB_BITRATE_2MBPS, \
.crc = NRF_ESB_CRC_16BIT, \
.tx_output_power = NRF_ESB_TX_POWER_0DBM, \
.retransmit_delay = 250, \
.retransmit_count = 3, \
.tx_mode = NRF_ESB_TXMODE_AUTO, \
.radio_irq_priority = 1, \
.event_irq_priority = 2, \
.payload_length = 32, \
.selective_auto_ack = false \
}
/** Default legacy radio parameters, identical to the nRF24Lxx defaults. */
#define NRF_ESB_LEGACY_CONFIG {.protocol = NRF_ESB_PROTOCOL_ESB, \
.mode = NRF_ESB_MODE_PTX, \
.event_handler = 0, \
.bitrate = NRF_ESB_BITRATE_2MBPS, \
.crc = NRF_ESB_CRC_8BIT, \
.tx_output_power = NRF_ESB_TX_POWER_0DBM, \
.retransmit_delay = 600, \
.retransmit_count = 3, \
.tx_mode = NRF_ESB_TXMODE_AUTO, \
.radio_irq_priority = 1, \
.event_irq_priority = 2, \
.payload_length = 32, \
.selective_auto_ack = false \
}
/**Macro to create an initializer for a TX data packet.
*
* @details This macro generates an initializer. Using the initializer is more efficient
* than setting the individual parameters dynamically.
*
* @param[in] _pipe The pipe to use for the data packet.
* @param[in] ... Comma separated list of character data to put in the TX buffer.
* Supported values consist of 1 to 63 characters.
*
* @return Initializer that sets up the pipe, length, and byte array for content of the TX data.
*/
#define NRF_ESB_CREATE_PAYLOAD(_pipe, ...) \
{.pipe = _pipe, .length = NUM_VA_ARGS(__VA_ARGS__), .data = {__VA_ARGS__}}; \
STATIC_ASSERT(NUM_VA_ARGS(__VA_ARGS__) > 0 && NUM_VA_ARGS(__VA_ARGS__) <= 63)
/**@brief Enhanced ShockBurst protocols. */
typedef enum {
NRF_ESB_PROTOCOL_ESB, /*< Enhanced ShockBurst with fixed payload length. */
NRF_ESB_PROTOCOL_ESB_DPL /*< Enhanced ShockBurst with dynamic payload length. */
} nrf_esb_protocol_t;
/**@brief Enhanced ShockBurst modes. */
typedef enum {
NRF_ESB_MODE_PTX, /*< Primary transmitter mode. */
NRF_ESB_MODE_PRX /*< Primary receiver mode. */
} nrf_esb_mode_t;
/**@brief Enhanced ShockBurst bitrate modes. */
typedef enum {
NRF_ESB_BITRATE_2MBPS = RADIO_MODE_MODE_Nrf_2Mbit, /**< 2 Mb radio mode. */
NRF_ESB_BITRATE_1MBPS = RADIO_MODE_MODE_Nrf_1Mbit, /**< 1 Mb radio mode. */
NRF_ESB_BITRATE_250KBPS = RADIO_MODE_MODE_Nrf_250Kbit, /**< 250 Kb radio mode. */
NRF_ESB_BITRATE_1MBPS_BLE = RADIO_MODE_MODE_Ble_1Mbit /**< 1 Mb radio mode using @e Bluetooth low energy radio parameters. */
} nrf_esb_bitrate_t;
/**@brief Enhanced ShockBurst CRC modes. */
typedef enum {
NRF_ESB_CRC_16BIT = RADIO_CRCCNF_LEN_Two, /**< Use two-byte CRC. */
NRF_ESB_CRC_8BIT = RADIO_CRCCNF_LEN_One, /**< Use one-byte CRC. */
NRF_ESB_CRC_OFF = RADIO_CRCCNF_LEN_Disabled /**< Disable CRC. */
} nrf_esb_crc_t;
/**@brief Enhanced ShockBurst radio transmission power modes. */
typedef enum {
NRF_ESB_TX_POWER_4DBM = RADIO_TXPOWER_TXPOWER_Pos4dBm, /**< 4 dBm radio transmit power. */
NRF_ESB_TX_POWER_0DBM = RADIO_TXPOWER_TXPOWER_0dBm, /**< 0 dBm radio transmit power. */
NRF_ESB_TX_POWER_NEG4DBM = RADIO_TXPOWER_TXPOWER_Neg4dBm, /**< -4 dBm radio transmit power. */
NRF_ESB_TX_POWER_NEG8DBM = RADIO_TXPOWER_TXPOWER_Neg8dBm, /**< -8 dBm radio transmit power. */
NRF_ESB_TX_POWER_NEG12DBM = RADIO_TXPOWER_TXPOWER_Neg12dBm, /**< -12 dBm radio transmit power. */
NRF_ESB_TX_POWER_NEG16DBM = RADIO_TXPOWER_TXPOWER_Neg16dBm, /**< -16 dBm radio transmit power. */
NRF_ESB_TX_POWER_NEG20DBM = RADIO_TXPOWER_TXPOWER_Neg20dBm, /**< -20 dBm radio transmit power. */
NRF_ESB_TX_POWER_NEG30DBM = RADIO_TXPOWER_TXPOWER_Neg30dBm /**< -30 dBm radio transmit power. */
} nrf_esb_tx_power_t;
/**@brief Enhanced ShockBurst transmission modes. */
typedef enum {
NRF_ESB_TXMODE_AUTO, /*< Automatic TX mode: When the TX FIFO contains packets and the radio is idle, packets are sent automatically. */
NRF_ESB_TXMODE_MANUAL, /*< Manual TX mode: Packets are not sent until @ref nrf_esb_start_tx is called. This mode can be used to ensure consistent packet timing. */
NRF_ESB_TXMODE_MANUAL_START /*< Manual start TX mode: Packets are not sent until @ref nrf_esb_start_tx is called. Then, transmission continues automatically until the TX FIFO is empty. */
} nrf_esb_tx_mode_t;
/**@brief Enhanced ShockBurst event IDs used to indicate the type of the event. */
typedef enum
{
NRF_ESB_EVENT_TX_SUCCESS, /**< Event triggered on TX success. */
NRF_ESB_EVENT_TX_FAILED, /**< Event triggered on TX failure. */
NRF_ESB_EVENT_RX_RECEIVED /**< Event triggered on RX received. */
} nrf_esb_evt_id_t;
/**@brief Enhanced ShockBurst payload.
*
* @details The payload is used both for transmissions and for acknowledging a
* received packet with a payload.
*/
typedef struct
{
uint8_t length; /**< Length of the packet (maximum value is NRF_ESB_MAX_PAYLOAD_LENGTH). */
uint8_t pipe; /**< Pipe used for this payload. */
int8_t rssi; /**< RSSI for the received packet. */
uint8_t noack; /**< Flag indicating that this packet will not be acknowledged. */
uint8_t pid; /**< PID assigned during communication. */
uint8_t data[NRF_ESB_MAX_PAYLOAD_LENGTH]; /**< The payload data. */
} nrf_esb_payload_t;
/**@brief Enhanced ShockBurst event. */
typedef struct
{
nrf_esb_evt_id_t evt_id; /**< Enhanced ShockBurst event ID. */
uint32_t tx_attempts; /**< Number of TX retransmission attempts. */
} nrf_esb_evt_t;
/**@brief Definition of the event handler for the module. */
typedef void (* nrf_esb_event_handler_t)(nrf_esb_evt_t const * p_event);
/**@brief Main configuration structure for the module. */
typedef struct
{
nrf_esb_protocol_t protocol; /**< Enhanced ShockBurst protocol. */
nrf_esb_mode_t mode; /**< Enhanced ShockBurst mode. */
nrf_esb_event_handler_t event_handler; /**< Enhanced ShockBurst event handler. */
// General RF parameters
nrf_esb_bitrate_t bitrate; /**< Enhanced ShockBurst bitrate mode. */
nrf_esb_crc_t crc; /**< Enhanced ShockBurst CRC modes. */
nrf_esb_tx_power_t tx_output_power; /**< Enhanced ShockBurst radio transmission power mode.*/
uint16_t retransmit_delay; /**< The delay between each retransmission of unacknowledged packets. */
uint16_t retransmit_count; /**< The number of retransmissions attempts before transmission fail. */
// Control settings
nrf_esb_tx_mode_t tx_mode; /**< Enhanced ShockBurst transmission mode. */
uint8_t radio_irq_priority; /**< nRF radio interrupt priority. */
uint8_t event_irq_priority; /**< ESB event interrupt priority. */
uint8_t payload_length; /**< Length of the payload (maximum length depends on the platforms that are used on each side). */
bool selective_auto_ack; /**< Enable or disable selective auto acknowledgment. */
} nrf_esb_config_t;
/**@brief Function for initializing the Enhanced ShockBurst module.
*
* @param p_config Parameters for initializing the module.
*
* @retval NRF_SUCCESS If initialization was successful.
* @retval NRF_ERROR_NULL If the @p p_config argument was NULL.
* @retval NRF_ERROR_BUSY If the function failed because the radio is busy.
*/
uint32_t nrf_esb_init(nrf_esb_config_t const * p_config);
/**@brief Function for suspending the Enhanced ShockBurst module.
*
* Calling this function stops ongoing communications without changing the queues.
*
* @retval NRF_SUCCESS If Enhanced ShockBurst was suspended.
* @retval NRF_ERROR_BUSY If the function failed because the radio is busy.
*/
uint32_t nrf_esb_suspend(void);
/**@brief Function for disabling the Enhanced ShockBurst module.
*
* Calling this function disables the Enhanced ShockBurst module immediately.
* Doing so might stop ongoing communications.
*
* @note All queues are flushed by this function.
*
* @retval NRF_SUCCESS If Enhanced ShockBurst was disabled.
*/
uint32_t nrf_esb_disable(void);
/**@brief Function for checking if the Enhanced ShockBurst module is idle.
*
* @retval true If the module is idle.
* @retval false If the module is busy.
*/
bool nrf_esb_is_idle(void);
/**@brief Function for writing a payload for transmission or acknowledgment.
*
* This function writes a payload that is added to the queue. When the module is in PTX mode, the
* payload is queued for a regular transmission. When the module is in PRX mode, the payload
* is queued for when a packet is received that requires an acknowledgment with payload.
*
* @param[in] p_payload Pointer to the structure that contains information and state of the payload.
*
* @retval NRF_SUCCESS If the payload was successfully queued for writing.
* @retval NRF_ERROR_NULL If the required parameter was NULL.
* @retval NRF_INVALID_STATE If the module is not initialized.
* @retval NRF_ERROR_NOT_SUPPORTED If @p p_payload->noack was false, but selective acknowledgment is not enabled.
* @retval NRF_ERROR_NO_MEM If the TX FIFO is full.
* @retval NRF_ERROR_INVALID_LENGTH If the payload length was invalid (zero or larger than the allowed maximum).
*/
uint32_t nrf_esb_write_payload(nrf_esb_payload_t const * p_payload);
/**@brief Function for reading an RX payload.
*
* @param[in,out] p_payload Pointer to the structure that contains information and state of the payload.
*
* @retval NRF_SUCCESS If the data was read successfully.
* @retval NRF_ERROR_NULL If the required parameter was NULL.
* @retval NRF_INVALID_STATE If the module is not initialized.
*/
uint32_t nrf_esb_read_rx_payload(nrf_esb_payload_t * p_payload);
/**@brief Function for starting transmission.
*
* @retval NRF_SUCCESS If the TX started successfully.
* @retval NRF_ERROR_BUFFER_EMPTY If the TX does not start because the FIFO buffer is empty.
* @retval NRF_ERROR_BUSY If the function failed because the radio is busy.
*/
uint32_t nrf_esb_start_tx(void);
/**@brief Function for starting to transmit data from the FIFO buffer.
*
* @retval NRF_SUCCESS If the transmission was started successfully.
* @retval NRF_ERROR_BUSY If the function failed because the radio is busy.
*/
uint32_t nrf_esb_start_rx(void);
/** @brief Function for stopping data reception.
*
* @retval NRF_SUCCESS If data reception was stopped successfully.
* @retval NRF_ESB_ERROR_NOT_IN_RX_MODE If the function failed because the module is not in RX mode.
*/
uint32_t nrf_esb_stop_rx(void);
/**@brief Function for removing remaining items from the TX buffer.
*
* This function clears the TX FIFO buffer.
*
* @retval NRF_SUCCESS If pending items in the TX buffer were successfully cleared.
* @retval NRF_INVALID_STATE If the module is not initialized.
*/
uint32_t nrf_esb_flush_tx(void);
/**@brief Function for removing the first item from the TX buffer.
*
* @retval NRF_SUCCESS If the operation completed successfully.
* @retval NRF_INVALID_STATE If the module is not initialized.
* @retval NRF_ERROR_BUFFER_EMPTY If there are no items in the queue to remove.
*/
uint32_t nrf_esb_pop_tx(void);
/**@brief Function for removing remaining items from the RX buffer.
*
* @retval NRF_SUCCESS If the pending items in the RX buffer were successfully cleared.
* @retval NRF_INVALID_STATE If the module is not initialized.
*/
uint32_t nrf_esb_flush_rx(void);
/**@brief Function for setting the length of the address.
*
* @param[in] length Length of the ESB address (in bytes).
*
* @retval NRF_SUCCESS If the address length was set successfully.
* @retval NRF_ERROR_INVALID_PARAM If the address length was invalid.
* @retval NRF_ERROR_BUSY If the function failed because the radio is busy.
*/
uint32_t nrf_esb_set_address_length(uint8_t length);
/**@brief Function for setting the base address for pipe 0.
*
* @param[in] p_addr Pointer to the address data.
*
* @retval NRF_SUCCESS If the base address was set successfully.
* @retval NRF_ERROR_BUSY If the function failed because the radio is busy.
* @retval NRF_ERROR_NULL If the required parameter was NULL.
*/
uint32_t nrf_esb_set_base_address_0(uint8_t const * p_addr);
/**@brief Function for setting the base address for pipe 1 to pipe 7.
*
* @param[in] p_addr Pointer to the address data.
*
* @retval NRF_SUCCESS If the base address was set successfully.
* @retval NRF_ERROR_BUSY If the function failed because the radio is busy.
* @retval NRF_ERROR_NULL If the required parameter was NULL.
*/
uint32_t nrf_esb_set_base_address_1(uint8_t const * p_addr);
/**@brief Function for setting the number of pipes and the pipe prefix addresses.
*
* This function configures the number of available pipes, enables the pipes,
* and sets their prefix addresses.
*
* @param[in] p_prefixes Pointer to a char array that contains the prefix for each pipe.
* @param[in] num_pipes Number of pipes.
*
* @retval NRF_SUCCESS If the prefix addresses were set successfully.
* @retval NRF_ERROR_BUSY If the function failed because the radio is busy.
* @retval NRF_ERROR_NULL If a required parameter was NULL.
* @retval NRF_ERROR_INVALID_PARAM If an invalid number of pipes was given.
*/
uint32_t nrf_esb_set_prefixes(uint8_t const * p_prefixes, uint8_t num_pipes);
/**@brief Function for enabling pipes.
*
* The @p enable_mask parameter must contain the same number of pipes as has been configured
* with @ref nrf_esb_set_prefixes.
*
* @param enable_mask Bitfield mask to enable or disable pipes. Setting a bit to
* 0 disables the pipe. Setting a bit to 1 enables the pipe.
*
* @retval NRF_SUCCESS If the pipes were enabled and disabled successfully.
* @retval NRF_ERROR_BUSY If the function failed because the radio is busy.
*/
uint32_t nrf_esb_enable_pipes(uint8_t enable_mask);
/**@brief Function for updating the prefix for a pipe.
*
* @param pipe Pipe for which to set the prefix.
* @param prefix Prefix to set for the pipe.
*
* @retval NRF_SUCCESS If the operation completed successfully.
* @retval NRF_ERROR_BUSY If the function failed because the radio is busy.
* @retval NRF_ERROR_INVALID_PARAM If the given pipe number was invalid.
*/
uint32_t nrf_esb_update_prefix(uint8_t pipe, uint8_t prefix);
/** @brief Function for setting the channel to use for the radio.
*
* The module must be in an idle state to call this function. As a PTX, the
* application must wait for an idle state and as a PRX, the application must stop RX
* before changing the channel. After changing the channel, operation can be resumed.
*
* @param[in] channel Channel to use for radio.
*
* @retval NRF_SUCCESS If the operation completed successfully.
* @retval NRF_INVALID_STATE If the module is not initialized.
* @retval NRF_ERROR_BUSY If the module was not in idle state.
* @retval NRF_ERROR_INVALID_PARAM If the channel is invalid (larger than 125).
*/
uint32_t nrf_esb_set_rf_channel(uint32_t channel);
/**@brief Function for getting the current radio channel.
*
* @param[in, out] p_channel Pointer to the channel data.
*
* @retval NRF_SUCCESS If the operation completed successfully.
* @retval NRF_ERROR_NULL If the required parameter was NULL.
*/
uint32_t nrf_esb_rf_channel_get(uint32_t * p_channel);
/**@brief Function for setting the radio output power.
*
* @param[in] tx_output_power Output power.
*
* @retval NRF_SUCCESS If the operation completed successfully.
* @retval NRF_ERROR_BUSY If the function failed because the radio is busy.
*/
uint32_t nrf_esb_set_tx_power(nrf_esb_tx_power_t tx_output_power);
/** @} */
#ifdef __cplusplus
}
#endif
#endif // NRF_ESB