STM32+NRF24L01无线(转)

源:STM32+NRF24L01无线

硬件SPI和模拟SPI源码:

nrf24发送(模拟SPI)BHS-STM32.rar

nrf24接收(模拟SPI)BHS-STM32.rar

nrf24发送(硬件SPI)BHS-STM32.rar

nrf24接收(硬件SPI)BHS-STM32.rar

NRF24L01资料

NRF24.rar

部分代码:

#define TX_PLOAD_WIDTH  20   // 20 uints TX payload 

u8 TxBuf[32]={0}; 

#define  CE_POUT   PB1
#define  CSN_POUT  PB0 

#define CE_H()   {CE_POUT=1;}
#define CE_L()   {CE_POUT=0;}
#define CSN_H()  {CSN_POUT=1;}
#define CSN_L()  {CSN_POUT=0;} 

///*********************************************NRF24L01*************************************
#define TX_ADR_WIDTH    5    // 5 uints TX address width
#define RX_ADR_WIDTH    5    // 5 uints RX address width 

#define RX_PLOAD_WIDTH  20   // 20 uints TX payload
u8  TX_ADDRESS[TX_ADR_WIDTH]= {0xE7,0xE7,0xE7,0xE7,0xE7}; //本地地址
u8  RX_ADDRESS[RX_ADR_WIDTH]= {0xE7,0xE7,0xE7,0xE7,0xE7}; //接收地址
///***************************************NRF24L01寄存器指令*******************************************************
#define READ_REG        0x00   // 读寄存器指令
#define WRITE_REG       0x20  // 写寄存器指令
#define RD_RX_PLOAD     0x61   // 读取接收数据指令
#define WR_TX_PLOAD     0xA0   // 写待发数据指令
#define FLUSH_TX        0xE1  // 冲洗发送 FIFO指令
#define FLUSH_RX        0xE2   // 冲洗接收 FIFO指令
#define REUSE_TX_PL     0xE3   // 定义重复装载数据指令
#define NOP             0xFF   // 保留
///*************************************SPI(nRF24L01)寄存器地址****************************************************
#define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA           0x01  // 自动应答功能设置
#define EN_RXADDR       0x02  // 可用信道设置
#define SETUP_AW        0x03  // 收发地址宽度设置
#define SETUP_RETR      0x04  // 自动重发功能设置
#define RF_CH           0x05  // 工作频率设置
#define RF_SETUP        0x06  // 发射速率、功耗功能设置
#define NRFRegSTATUS    0x07  // 状态寄存器
#define OBSERVE_TX      0x08  // 发送监测功能
#define CD              0x09  // 地址检测
#define RX_ADDR_P0      0x0A  // 频道0接收数据地址
#define RX_ADDR_P1      0x0B  // 频道1接收数据地址
#define RX_ADDR_P2      0x0C  // 频道2接收数据地址
#define RX_ADDR_P3      0x0D  // 频道3接收数据地址
#define RX_ADDR_P4      0x0E  // 频道4接收数据地址
#define RX_ADDR_P5      0x0F  // 频道5接收数据地址
#define TX_ADDR         0x10  // 发送地址寄存器
#define RX_PW_P0        0x11  // 接收频道0接收数据长度
#define RX_PW_P1        0x12  // 接收频道1接收数据长度
#define RX_PW_P2        0x13  // 接收频道2接收数据长度
#define RX_PW_P3        0x14  // 接收频道3接收数据长度
#define RX_PW_P4        0x15  // 接收频道4接收数据长度
#define RX_PW_P5        0x16  // 接收频道5接收数据长度
#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
///************************************************************************************** 

u8 SPI_WR_Reg(u8 reg, u8 value);
u8 SPI_Read_Buf(u8 reg, u8 *pBuf, u8 Len);
u8 SPI_Write_Buf(u8 reg, u8 *pBuf, u8 Len);
u8 nRF24L01_RxPacket(unsigned char* rx_buf);
void nRF24L01_TxPacket(unsigned char * tx_buf);
u8 SPI_RD_Reg(u8 reg); 

#define NRF24SPI_Send_Byte   SPI_Send_Byte 

///******************************************************************************************
///*延时函数,非精确延时
///******************************************************************************************/
void Delay_us(u32 n)
{
u32 i; 

while(n--)
{
     i=2;
     while(i--);
  }
} 

///****************************************************************************************
///*NRF24L01初始化
///***************************************************************************************/
void init_NRF24L01(void)
{
 u8 buf[5]={0}; 

  Delay_us(100); 

  CE_L();    // chip enable
  CSN_H();   // Spi disable  

  SPI_Read_Buf(TX_ADDR, buf, TX_ADR_WIDTH);//debug 测试原来的本地地址:复位值是:0xE7 0xE7 0xE7 0xE7 0xE7 

// SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址
// SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址 

//
// SPI_WR_Reg(WRITE_REG + EN_AA, 0x01);      //  频道0自动 ACK应答允许
// SPI_WR_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21
// SPI_WR_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 设置自动重发时间和次数:500us + 86us, 10 retrans...
// SPI_WR_Reg(WRITE_REG + RF_CH, 22);        //   设置信道工作为2.4GHZ,收发必须一致
// SPI_WR_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
// SPI_WR_Reg(WRITE_REG + RF_SETUP, 0x07);    //设置发射速率为1MHZ,发射功率为最大值0dB
//
//  SPI_RD_Reg(WRITE_REG + EN_AA);
//  SPI_RD_Reg(WRITE_REG + EN_RXADDR);
//  SPI_RD_Reg(WRITE_REG + RF_CH);
//  SPI_RD_Reg(WRITE_REG + RX_PW_P0);
//  SPI_RD_Reg(WRITE_REG + RF_SETUP);
} 

///****************************************************************************************************
///*函数:uchar SPI_Read(u8 reg)
///*功能:NRF24L01的SPI时序
///****************************************************************************************************/
u8 SPI_RD_Reg(u8 reg)
{
u8 reg_val; 

CSN_L();                // CSN low, initialize SPI communication...
NRF24SPI_Send_Byte(reg);            // Select register to read from..
reg_val = NRF24SPI_Send_Byte(0);    // ..then read registervalue
CSN_H();                // CSN high, terminate SPI communication 

return(reg_val);        // return register value
} 

//****************************************************************************************************/
//*功能:NRF24L01读写寄存器函数
//****************************************************************************************************/
u8 SPI_WR_Reg(u8 reg, u8 value)
{
u8 status; 

CSN_L();                   // CSN low, init SPI transaction
status = NRF24SPI_Send_Byte(reg);// select register
NRF24SPI_Send_Byte(value);             // ..and write value to it..
CSN_H();                   // CSN high again 

return(status);            // return nRF24L01 status u8
}
///****************************************************************************************************/
//*函数:uint SPI_Read_Buf(u8 reg, u8 *pBuf, u8 Len)
//*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数
//****************************************************************************************************/
u8 SPI_Read_Buf(u8 reg, u8 *pBuf, u8 Len)
{
uint status,i; 

CSN_L();                     // Set CSN low, init SPI tranaction
status = NRF24SPI_Send_Byte(reg);        // Select register to write to and read status u8 

  for(i=0;i<Len;i++)
  {
     pBuf = NRF24SPI_Send_Byte(0);
  } 

CSN_H();                            

return(status);                    // return nRF24L01 status u8
}
//*********************************************************************************************************
//*函数:uint SPI_Write_Buf(u8 reg, u8 *pBuf, u8 Len)
//*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
//*********************************************************************************************************/
u8 SPI_Write_Buf(u8 reg, u8 *pBuf, u8 Len)
{
uint status,i; 

CSN_L();            //SPI使能
status = NRF24SPI_Send_Byte(reg);
for(i=0; i<Len; i++) //
{
   NRF24SPI_Send_Byte(*pBuf);
 pBuf ++;
}
CSN_H();           //关闭SPI
return(status);    //
} 

//****************************************************************************************************/
//*函数:void SetRX_Mode(void)
//*功能:数据接收配置
//****************************************************************************************************/
void RX_Mode(void)
{u8 buf[5]={0};
CE_L(); 

SPI_Read_Buf(TX_ADDR, buf, TX_ADR_WIDTH);//debug 测试原来的本地地址:复位值是:0xE7 0xE7 0xE7 0xE7 0xE7
//SPI_WR_Reg(WRITE_REG + CONFIG, 0x03);//SPI_WR_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收 

//SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址 

SPI_WR_Reg(WRITE_REG + EN_AA, 0);//0x01);      //  频道0自动 ACK应答允许
SPI_WR_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21
SPI_WR_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 设置自动重发时间和次数:500us + 86us, 10 retrans...
SPI_WR_Reg(WRITE_REG + RF_CH, 40);        //   设置信道工作为2.4GHZ,收发必须一致
SPI_WR_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
SPI_WR_Reg(WRITE_REG + RF_SETUP, 0x0F);    //设置发射速率为1MHZ,发射功率为最大值0dB 

SPI_WR_Reg(WRITE_REG + CONFIG, 0x03);//0x0F);
CE_H();
Delay_us(200);
} 

void TX_Mode(void)
{
 CE_L();
//SPI_WR_Reg(WRITE_REG + CONFIG, 0x02);   //0x0E  // IRQ收发完成中断响应,16位CRC,主发送 

SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址 

SPI_WR_Reg(WRITE_REG + EN_AA, 0);//0x01);      //  频道0自动 ACK应答允许
SPI_WR_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21
SPI_WR_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 设置自动重发时间和次数:500us + 86us, 10 retrans...
SPI_WR_Reg(WRITE_REG + RF_CH, 40);        //   设置信道工作为2.4GHZ,收发必须一致
// SPI_WR_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
SPI_WR_Reg(WRITE_REG + RF_SETUP, 0x0F);    //设置发射速率为1MHZ,发射功率为最大值0dB 

SPI_WR_Reg(WRITE_REG + CONFIG, 0x02);//0x0E);
 CE_H();
}
//***********************************************************************************************************
//*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
//*功能:发送 tx_buf中数据
//**********************************************************************************************************/
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
CE_L(); //StandBy I模式
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);   // 装载数据
// SPI_WR_Reg(WRITE_REG + CONFIG, 0x0e);     // IRQ收发完成中断响应,16位CRC,主发送
CE_H();  //置高CE,激发数据发送
//Delay_us(10);
} 

//******************************************************************************************************/
//*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
//*功能:数据读取后放如rx_buf接收缓冲区中
//******************************************************************************************************/
u8 nRF24L01_RxPacket(unsigned char* rx_buf)
{u8 flag=0;
 u8 status; 

status=SPI_RD_Reg(NRFRegSTATUS); // 读取状态寄存其来判断数据接收状况 

if(status & 0x40) // 判断是否接收到数据
{
   //CE_L();  //SPI使能
 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
 flag =1; //读取数据完成标志
}
SPI_WR_Reg(WRITE_REG+NRFRegSTATUS, status);   //接收到数据后RX_DR,TX_DS,MAX_RT都置高为1,通过写1来清楚中断标志
return flag;
}
///************************************主函数************************************************************
void NRF_Send(void)
{static uint32 counter=0;
 static u8 flag=0;   

   //TX_Mode(); 

   IntervalTimems(500);
   if(flag==0)
   {
      flag=1;
      memcpy(TxBuf, "1234567890abcdefghij", 20);
      nRF24L01_TxPacket(TxBuf);
   }
   else
   {
      flag=0;
      memcpy(TxBuf, "abcdefghij1234567890", 20);
      nRF24L01_TxPacket(TxBuf);
   }
   //GPIO_Write(GPIOC, (u16)~GPIO_ReadOutputData(GPIOC));
} 
时间: 2024-10-28 23:45:02

STM32+NRF24L01无线(转)的相关文章

[stm32] NRF24L01+USART搞定有线和无线通信

前言 一般进行远程监控时,2.4G无线通信是充当远程数据传输的一种方法.这时就需要在现场部分具备无线数据发送装置,而在上位机部分由于一般只有串口,所以将采集到的数据送到电脑里又要在上位机端设计一个数据接收的适配器.这里基于stm32分别设计了现场部分和适配器部分,这里只是基本通信功能实现的讲解,一些复杂的技术比如加密.可靠等要根据具体的应用来设计~ 总体说明 这里采用stm32作为MCU,采用nRF24L01作为2.4G通信模块.其中适配器中仅仅采用了USART和NRF24L01两个主要部分,负

[51单片机] SPI nRF24L01无线 [可以放在2个单片机里实现通信]

main.c 1 #include<reg51.h> 2 #include"2401.h" 3 4 #define uint unsigned int 5 #define uchar unsigned char 6 7 sbit KEY8=P3^7; //发送按键 8 sbit beep=P2^3;//喇叭 9 sbit LED6=P1^6; ////接收到数据后的功能实现灯 10 11 void delay_ms(uint z) //延时函数 12 { 13 uint x

【Espruino】NO.15 nRF24L01+无线收发器

http://blog.csdn.net/qwert1213131/article/details/35853747 本文属于个人理解,能力有限,纰漏在所难免,还望指正! [小鱼有点电] [Espruino中文社区] nRF24L01+(或nRF24L01P)是一款工作在2.4~2.5GHz 世界通用ISM 频段的单片无线收发器芯片.无线收发器包括:频率发生器.增强型SchockBurst模式控制器.功率放大器.晶体振荡器调制器.解调器.输出功率频道选择和协议的设置可以通过SPI接口进行设置.

nRF2401A/nRF24L01/nRF24L01+无线模块最常见问题汇集(转)

俗话说:每个人一生下来什么都会的,都是通过自己努力和探索出来的,NRF系列芯片,刚开始都好奇心加兴趣才来捣鼓它的,刚开始做硬件和软件,没有收发数据弄得整个人头都快炸开了,所以在此和大家分享一下前辈的经验,希望大家会少走弯路. Q:最近在选型的时候发现基本常见的无线模块都是3V供电,而我使用的单片机是5V的,它们之间要怎么连接呢?直接连接会不会损坏模块? 回答: 如果你使用的51单片机的P0口是高阻引脚,可以直接将无线模块的IO脚连接到P0端口,并在对应的连线与3V电源间放置1K~10K左右的偏置

[51单片机] nRF24L01 无线模块 测试 按键-灯-远程控制

哈哈,穷吊死一个,自己做的一个超简单的板还没有电源提供,只得借助我的大开发板啦.其实这2个模块是完全可以分开的,无线嘛,你懂得!进入正题,这个实验的功能就是一个发送模块(大的那个板)连接4个按键,通过按动这4个不同的按键来发送4种不同的命令,来控制接收端(小的板)点亮4个不同的灯. >_<!首先是发送模块: 1 void main() 2 { 3 uchar Tx_Buf1[]={1}; //发送的信息1 4 uchar Rx_Buf[32]; //接收到的数据暂存器,最多32字节数据 5 i

[51单片机] SPI nRF24L01 无线简单程序 1

main.c 1 #include <reg51.h> 2 #include <api.h> 3 4 #define uchar unsigned char 5 6 /***************************************************/ 7 #define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址 8 #define TX_PLOAD_WIDTH 4 // 数据通道有效数据宽度 9 #define LED P2 10 11

CB1 驱动NRF24L01 无线模块 通信成功

系统:lubuntu 官方  (喜欢cb官方原版)硬件: cb   NRF24L01*2   51开发板一块   杜邦线若干 CB1 驱动NRF24L01 无线模块与STC51单片机通信成功!!! 1.废话不多说,上图上代码: 2.自制51单片机开发板:(24L01在右下角,有内置接口)   3.来张清晰的图,上面手抖了,      LCD1602显示温度,并实时通过无线发给cubieboard 1   4. 下图,第一位是正负温度指示,0x00代表正 ,0xff代表零下  . 后两位分别代表温

[51单片机] nRF24L01 无线模块 串口法命令 通过无线控制另一个的灯

>_<!概述: 这是在上一个的基础上通过按键发送4种不同命令来控制接收端的LED灯亮的改进版(上一个:http://www.cnblogs.com/zjutlitao/p/3840013.html),这里俺把按键发命令给去掉,然后加入一个串口通信的功能,PC通过串口给发送端发送命令,然后发送端通过无线将命令发给接收端来实现控制,这里接收端和上一个例程中的一样,只是在发送端的代码里去除了按键控制,变成了串口控制. >_<!发送端电路: >_<!接收电路图: >_&l

LBDP-Z支持STM32通过无线模块实现在线升级

LBDP-Z可支持STM32通过无线模块实现在线升级,支持单播或广播模式. LBDP-Z可变数据域报文 SD2 LE LEr SD2 GA SA FC DU FCS ED SD2 起始字节,ED结束字节,GA组地址,SA从站地址/源地址,DA目的地址,LE/LEr数据域长度,FC控制字节,FCS校验字节. GA为组地址,可表示0x02~0x7E共125个组:0x7F表示广播,0x00.0x01和0x80~0xFF保留.SA为从站地址,可表示0x02~0x7E共125个从站:0x7F表示广播,0x