//NRF2401片选信号
#define CE_L GPIO_ResetBits(GPIOD, GPIO_Pin_2)
#define CE_H GPIO_SetBits(GPIOD, GPIO_Pin_2)
//SPI片选信号
#define CSN_L GPIO_ResetBits(GPIOD, GPIO_Pin_5)
#define CSN_H GPIO_SetBits(GPIOD, GPIO_Pin_5)
//SPI时钟
#define SCK_L GPIO_ResetBits(GPIOD , GPIO_Pin_3)
#define SCK_H GPIO_SetBits(GPIOD , GPIO_Pin_3)
//SPI输出
#define MOSI_L GPIO_ResetBits(GPIOD , GPIO_Pin_6)
#define MOSI_H GPIO_SetBits(GPIOD , GPIO_Pin_6)
//SPI输入
#define READ_MISO GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_4)
//IRQ中断脚
#define IRQ_L GPIO_ResetBits(GPIOD,GPIO_Pin_7)
#define IRQ_H GPIO_SetBits(GPIOD,GPIO_Pin_7)
#define READ_IRQ GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7)
//NRF24L01发送接收数据宽度定义
#define TX_ADR_WIDTH 5 //5字节的地址宽度
#define RX_ADR_WIDTH 5 //5字节的地址宽度
#define TX_PLOAD_WIDTH 32 //20字节的用户数据宽度
#define RX_PLOAD_WIDTH 32 //20字节的用户数据宽度
void Init_NRF24L01(void); //NRF24l01初始化
u8 SPI_ReadWriteByte(u8 TxData) ; //模拟SPI通讯函数
void RX_Mode(void); //配置为接收模式
void TX_Mode(void); //配置为发送模式
u8 NRF24L01_Write_Buf(u8 regaddr, u8 *pBuf, u8 datalen); //写数据区
u8 NRF24L01_Read_Buf(u8 regaddr, u8 *pBuf, u8 datalen); //读数据区
u8 NRF24L01_Read_Reg(u8 regaddr); //读寄存器
u8 NRF24L01_Write_Reg(u8 regaddr, u8 data); //写寄存器
u8 NRF24L01_Check(void); //检查NRF24L01是否在位
u8 NRF24L01_TxPacket(u8 *txbuf); //发送一个包的数据
u8 NRF24L01_RxPacket(u8 *rxbuf); //接收一个包的数据
void Delay(vu32 nCount);
#endif
接收端的main函数:
/******************** (C) COPYRIGHT 2017 **************************
* 文件名 :main.c
* 描述 :NRF24L01+ 的 接收 测试程序
* 实验平台:STM32F103VET6
* 库版本 :ST3.5.0
* 编写日期:2017-04-17
* 修改日期:2017-04-17
* 作者 :
* 2017-04-17
* (1)NRF24L01+ 接收数据 测试正常!
**********************************************************************************/
#include "usart1.h"
#include "led.h"
#include "tim2.h"
#include "NRF24L01.h"
#include "SysTick.h"
/*
* 函数名:main
* 描述 : "主机"的主函数
* 输入 :无
* 输出 : 无
*/
int main(void)
{
uint8_t tmp_buf[6];
SysTick_Init();
USART1_Config(115200); /* 初始化USART1 */
LED_GPIO_Config(); /* 运行LED初始化 */
TIM2_Config(); /* 定时器TIM2初始化 */
Init_NRF24L01();
printf("STM32F103VET6 NRF24L01 RECV Test!rn");
printf("2017-04-17rn");
if(NRF24L01_Check())
{
printf("NRF24L01 is Not work!rn");
}
RX_Mode(); //只收不发
while(1)
{
if(NRF24L01_RxPacket(tmp_buf)==0) //接收到数据
{
printf("rn RECV Data is:%srn",tmp_buf);
LED1(ON);
Delay_ms(100);
}
LED1(OFF);
}
}
/******************* (C) COPYRIGHT 2017 *****END OF FILE************/
发送端的main函数:
/******************** (C) COPYRIGHT 2017 **************************
* 文件名 :main.c
* 描述 :NRF24L01+ 发送数据测试程序
* 实验平台:STM32F103VET6
* 库版本 :ST3.5.0
* 编写日期:2017-04-17
* 修改日期:2017-04-17
* 作者 :
* 2017-04-17
* (1)NRF24L01+ 发送数据 测试正常!
**********************************************************************************/
#include "usart1.h"
#include "led.h"
#include "tim2.h"
#include "NRF24L01.h"
#include "SysTick.h"
/*
* 函数名:main
* 描述 : "主机"的主函数
* 输入 :无
* 输出 : 无
*/
int main(void)
{
uint8_t tmp_buf[6] = {0x31,0x32,0x33,0x34,0x35,0x36};
SysTick_Init();
USART1_Config(115200); /* 初始化USART1 */
LED_GPIO_Config(); /* 运行LED初始化 */
TIM2_Config(); /* 定时器TIM2初始化 */
Init_NRF24L01();
printf("STM32F103VET6 NRF24L01 SEND Test!rn");
printf("2017-04-17rn");
if(NRF24L01_Check())
{
printf("NRF24L01 is Not work!rn");
}
TX_Mode(); //只发不收
while(1)
{
if(NRF24L01_TxPacket(tmp_buf)==TX_OK) // 判断是否发送完成
{
printf("Send Data:%srn",tmp_buf);
LED1(ON);
Delay_ms(500);
LED1(OFF);
}
else //发送失败
{
printf("请确定接收端是否正常!rn");
Delay_ms(500);
}
}
}
/******************* (C) COPYRIGHT 2017 *****END OF FILE************/
测试的方法:
(1)需要两个开发板来测试,一个用于接收,另一个用于发送。
(2)主要看接收是否正常,正常的话,LED灯会亮一下,并且串口打印收到的数据。
(3)至于通信的协议与数据格式,可以自定义,当然,接收与发送功能可以集一身。
经过测试,正常。
//NRF2401片选信号
#define CE_L GPIO_ResetBits(GPIOD, GPIO_Pin_2)
#define CE_H GPIO_SetBits(GPIOD, GPIO_Pin_2)
//SPI片选信号
#define CSN_L GPIO_ResetBits(GPIOD, GPIO_Pin_5)
#define CSN_H GPIO_SetBits(GPIOD, GPIO_Pin_5)
//SPI时钟
#define SCK_L GPIO_ResetBits(GPIOD , GPIO_Pin_3)
#define SCK_H GPIO_SetBits(GPIOD , GPIO_Pin_3)
//SPI输出
#define MOSI_L GPIO_ResetBits(GPIOD , GPIO_Pin_6)
#define MOSI_H GPIO_SetBits(GPIOD , GPIO_Pin_6)
//SPI输入
#define READ_MISO GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_4)
//IRQ中断脚
#define IRQ_L GPIO_ResetBits(GPIOD,GPIO_Pin_7)
#define IRQ_H GPIO_SetBits(GPIOD,GPIO_Pin_7)
#define READ_IRQ GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7)
//NRF24L01发送接收数据宽度定义
#define TX_ADR_WIDTH 5 //5字节的地址宽度
#define RX_ADR_WIDTH 5 //5字节的地址宽度
#define TX_PLOAD_WIDTH 32 //20字节的用户数据宽度
#define RX_PLOAD_WIDTH 32 //20字节的用户数据宽度
void Init_NRF24L01(void); //NRF24l01初始化
u8 SPI_ReadWriteByte(u8 TxData) ; //模拟SPI通讯函数
void RX_Mode(void); //配置为接收模式
void TX_Mode(void); //配置为发送模式
u8 NRF24L01_Write_Buf(u8 regaddr, u8 *pBuf, u8 datalen); //写数据区
u8 NRF24L01_Read_Buf(u8 regaddr, u8 *pBuf, u8 datalen); //读数据区
u8 NRF24L01_Read_Reg(u8 regaddr); //读寄存器
u8 NRF24L01_Write_Reg(u8 regaddr, u8 data); //写寄存器
u8 NRF24L01_Check(void); //检查NRF24L01是否在位
u8 NRF24L01_TxPacket(u8 *txbuf); //发送一个包的数据
u8 NRF24L01_RxPacket(u8 *rxbuf); //接收一个包的数据
void Delay(vu32 nCount);
#endif
接收端的main函数:
/******************** (C) COPYRIGHT 2017 **************************
* 文件名 :main.c
* 描述 :NRF24L01+ 的 接收 测试程序
* 实验平台:STM32F103VET6
* 库版本 :ST3.5.0
* 编写日期:2017-04-17
* 修改日期:2017-04-17
* 作者 :
* 2017-04-17
* (1)NRF24L01+ 接收数据 测试正常!
**********************************************************************************/
#include "usart1.h"
#include "led.h"
#include "tim2.h"
#include "NRF24L01.h"
#include "SysTick.h"
/*
* 函数名:main
* 描述 : "主机"的主函数
* 输入 :无
* 输出 : 无
*/
int main(void)
{
uint8_t tmp_buf[6];
SysTick_Init();
USART1_Config(115200); /* 初始化USART1 */
LED_GPIO_Config(); /* 运行LED初始化 */
TIM2_Config(); /* 定时器TIM2初始化 */
Init_NRF24L01();
printf("STM32F103VET6 NRF24L01 RECV Test!rn");
printf("2017-04-17rn");
if(NRF24L01_Check())
{
printf("NRF24L01 is Not work!rn");
}
RX_Mode(); //只收不发
while(1)
{
if(NRF24L01_RxPacket(tmp_buf)==0) //接收到数据
{
printf("rn RECV Data is:%srn",tmp_buf);
LED1(ON);
Delay_ms(100);
}
LED1(OFF);
}
}
/******************* (C) COPYRIGHT 2017 *****END OF FILE************/
发送端的main函数:
/******************** (C) COPYRIGHT 2017 **************************
* 文件名 :main.c
* 描述 :NRF24L01+ 发送数据测试程序
* 实验平台:STM32F103VET6
* 库版本 :ST3.5.0
* 编写日期:2017-04-17
* 修改日期:2017-04-17
* 作者 :
* 2017-04-17
* (1)NRF24L01+ 发送数据 测试正常!
**********************************************************************************/
#include "usart1.h"
#include "led.h"
#include "tim2.h"
#include "NRF24L01.h"
#include "SysTick.h"
/*
* 函数名:main
* 描述 : "主机"的主函数
* 输入 :无
* 输出 : 无
*/
int main(void)
{
uint8_t tmp_buf[6] = {0x31,0x32,0x33,0x34,0x35,0x36};
SysTick_Init();
USART1_Config(115200); /* 初始化USART1 */
LED_GPIO_Config(); /* 运行LED初始化 */
TIM2_Config(); /* 定时器TIM2初始化 */
Init_NRF24L01();
printf("STM32F103VET6 NRF24L01 SEND Test!rn");
printf("2017-04-17rn");
if(NRF24L01_Check())
{
printf("NRF24L01 is Not work!rn");
}
TX_Mode(); //只发不收
while(1)
{
if(NRF24L01_TxPacket(tmp_buf)==TX_OK) // 判断是否发送完成
{
printf("Send Data:%srn",tmp_buf);
LED1(ON);
Delay_ms(500);
LED1(OFF);
}
else //发送失败
{
printf("请确定接收端是否正常!rn");
Delay_ms(500);
}
}
}
/******************* (C) COPYRIGHT 2017 *****END OF FILE************/
测试的方法:
(1)需要两个开发板来测试,一个用于接收,另一个用于发送。
(2)主要看接收是否正常,正常的话,LED灯会亮一下,并且串口打印收到的数据。
(3)至于通信的协议与数据格式,可以自定义,当然,接收与发送功能可以集一身。
经过测试,正常。
举报