NRF24L01 射頻收發 使用方法


在干啥

這兩天在調nrf24l01,最終還是參考正點原子的例程才調通,看芯片手冊太難了

還要說啥廢話

廢話說到這,接下來上代碼

SPI協議

spi.c

#include "spi.h"

//以下是SPI模塊的初始化代碼,配置成主機模式,訪問SD Card/W25Q64/NRF24L01						  
//SPI口初始化
//這里針是對SPI2的初始化

void SPI2_Init(void)
{
 	GPIO_InitTypeDef GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;

	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOB, ENABLE );//PORTB時鍾使能 
	RCC_APB1PeriphClockCmd(	RCC_APB1Periph_SPI2,  ENABLE );//SPI2時鍾使能 	
 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15復用推挽輸出 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB

 	GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15上拉

	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 			//設置SPI單向或者雙向的數據模式:SPI設置為雙線雙向全雙工
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;														//設置SPI工作模式:設置為主SPI
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;												//設置SPI的數據大小:SPI發送接收8位幀結構
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;															//串行同步時鍾的空閑狀態為高電平
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;														//串行同步時鍾的第二個跳變沿(上升或下降)數據被采樣
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;																//NSS信號由硬件(NSS管腳)還是軟件(使用SSI位)管理:內部NSS信號有SSI位控制
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;		//定義波特率預分頻的值:波特率預分頻值為256 ,傳輸速度36M/256=140.625KHz
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;											//指定數據傳輸從MSB位還是LSB位開始:數據傳輸從MSB(高位)在前
	SPI_InitStructure.SPI_CRCPolynomial = 7;																//CRC值計算的多項式,大於1即可
	SPI_Init(SPI2, &SPI_InitStructure);  																		//根據SPI_InitStruct中指定的參數初始化外設SPIx寄存器
 
	SPI_Cmd(SPI2, ENABLE); //使能SPI外設
	
	SPI2_ReadWriteByte(0xff);//啟動傳輸(作用是維持MOSI為高電平,非必須,可去掉) 
 

}   

//固件庫並沒有提供單獨設置分頻系數的函數------

//SPI 速度設置函數
//SpeedSet:
//SPI_BaudRatePrescaler_2   2分頻   
//SPI_BaudRatePrescaler_8   8分頻   
//SPI_BaudRatePrescaler_16  16分頻  
//SPI_BaudRatePrescaler_256 256分頻  
void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler)
{
  assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
	SPI2->CR1&=0XFFC7;
	SPI2->CR1|=SPI_BaudRatePrescaler;	//設置SPI2速度 
	SPI_Cmd(SPI2,ENABLE); 

} 

//SPIx 讀寫一個字節
//TxData:要寫入的字節
//返回值:讀取到的字節
u8 SPI2_ReadWriteByte(u8 TxData)
{		
	u8 retry=0;				 	
	while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //發送緩存空標志位   TXE為1表明發送緩存器為空
		{
		retry++;
		if(retry>200)return 0;
		}			  
	SPI_I2S_SendData(SPI2, TxData); //通過外設SPIx發送一個數據
	retry=0;

	while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET)//接受緩存非空標志位  RXNE為1表明接收緩沖器中包含有效數據  
		{
		retry++;
		if(retry>200)return 0;
		}	  						    
	return SPI_I2S_ReceiveData(SPI2); //返回通過SPIx最近接收的數據					    
}


spi.h

#ifndef __SPI_H
#define __SPI_H
#include "sys.h"

 				  	    													  
void SPI2_Init(void);			 //初始化SPI口
void SPI2_SetSpeed(u8 SpeedSet); //設置SPI速度   
u8 SPI2_ReadWriteByte(u8 TxData);//SPI總線讀寫一個字節
		 
#endif


2401.c

#include "nrf2401.h"
#include "spi.h"
#include "sys.h"

const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //發送地址
const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};
//初始化 24L01的IO口

void NRF24L01_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	SPI_InitTypeDef SPI_InitStructure;
	RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);   //使能PB,G端口時鍾
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;	//PA10、PB12推挽輸出 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);			//初始化指定IO
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_Init(GPIOB,&GPIO_InitStructure);	
	
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;					//PA11輸入
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_11);	 //PA10,11
	GPIO_ResetBits(GPIOB,GPIO_Pin_12);							 //PB12
	
	
	SPI2_Init();							//初始化SPI
	SPI_Cmd(SPI2,DISABLE);		//SPI外設不使能
	
	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;		//設置SPI單向或雙向的數據模式:SPI設置為雙線雙向全雙工
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;				//設置SPI工作模式: 設置為主SPI
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;		//8位幀結構
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;					//時鍾懸空低
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;				//數據捕獲於第一個時鍾沿
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;						//NSS信號由軟件控制
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;			//定義波特率預分頻的值:波特率預分頻值為16
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;	//MSB 位開始
	SPI_InitStructure.SPI_CRCPolynomial = 7;	//CRC值計算的多項式
	SPI_Init(SPI2,&SPI_InitStructure);		//根據指定的參數初始化外設SPIx
	
	SPI_Cmd(SPI2,ENABLE);		//使能SPI外設
	NRF24L01_CE=0;					//使能24L01
	NRF24L01_CSN=1;					//SPI片選取消
	
}


//檢測24L01是否存在
//返回值:0,成功;1,失敗	
u8 NRF24L01_Check(void)
{
	u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
	u8 i;
	SPI2_SetSpeed(SPI_BaudRatePrescaler_4); //spi速度為9Mhz(24L01的最大SPI時鍾為10Mhz)   	 
	NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5);//寫入5個字節的地址.	
	NRF24L01_Read_Buf(TX_ADDR,buf,5); //讀出寫入的地址  
	for(i=0;i<5;i++)if(buf[i]!=0XA5)break;	 							   
	if(i!=5)return 1;//檢測24L01錯誤	
	return 0;		 //檢測到24L01
}	 	 
//SPI寫寄存器
//reg:指定寄存器地址
//value:寫入的值
u8 NRF24L01_Write_Reg(u8 reg,u8 value)
{
	u8 status;	
   	NRF24L01_CSN=0;                 //使能SPI傳輸
  	status =SPI2_ReadWriteByte(reg);//發送寄存器號 
  	SPI2_ReadWriteByte(value);      //寫入寄存器的值
  	NRF24L01_CSN=1;                 //禁止SPI傳輸	   
  	return(status);       			//返回狀態值
}
//讀取SPI寄存器值
//reg:要讀的寄存器
u8 NRF24L01_Read_Reg(u8 reg)
{
	u8 reg_val;	    
 	NRF24L01_CSN = 0;          //使能SPI傳輸		
  	SPI2_ReadWriteByte(reg);   //發送寄存器號
  	reg_val=SPI2_ReadWriteByte(0XFF);//讀取寄存器內容
  	NRF24L01_CSN = 1;          //禁止SPI傳輸		    
  	return(reg_val);           //返回狀態值
}	
//在指定位置讀出指定長度的數據
//reg:寄存器(位置)
//*pBuf:數據指針
//len:數據長度
//返回值,此次讀到的狀態寄存器值 
u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)
{
	u8 status,u8_ctr;	       
  	NRF24L01_CSN = 0;           //使能SPI傳輸
  	status=SPI2_ReadWriteByte(reg);//發送寄存器值(位置),並讀取狀態值   	   
 	for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPI2_ReadWriteByte(0XFF);//讀出數據
  	NRF24L01_CSN=1;       //關閉SPI傳輸
  	return status;        //返回讀到的狀態值
}
//在指定位置寫指定長度的數據
//reg:寄存器(位置)
//*pBuf:數據指針
//len:數據長度
//返回值,此次讀到的狀態寄存器值
u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)
{
	u8 status,u8_ctr;	    
 	NRF24L01_CSN = 0;          //使能SPI傳輸
  	status = SPI2_ReadWriteByte(reg);//發送寄存器值(位置),並讀取狀態值
  	for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPI2_ReadWriteByte(*pBuf++); //寫入數據	 
  	NRF24L01_CSN = 1;       //關閉SPI傳輸
  	return status;          //返回讀到的狀態值
}				   
//啟動NRF24L01發送一次數據
//txbuf:待發送數據首地址
//返回值:發送完成狀況
u8 NRF24L01_TxPacket(u8 *txbuf)
{
	u8 sta;
 	SPI2_SetSpeed(SPI_BaudRatePrescaler_8);//spi速度為9Mhz(24L01的最大SPI時鍾為10Mhz)   
	NRF24L01_CE=0;
  	NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//寫數據到TX BUF  32個字節
 	NRF24L01_CE=1;//啟動發送	   
	while(NRF24L01_IRQ!=0);//等待發送完成
	sta=NRF24L01_Read_Reg(STATUS);  //讀取狀態寄存器的值	   
	NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中斷標志
	if(sta&MAX_TX)//達到最大重發次數
	{
		NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器 
		return MAX_TX; 
	}
	if(sta&TX_OK)//發送完成
	{
		return TX_OK;
	}
	return 0xff;//其他原因發送失敗
}
//啟動NRF24L01發送一次數據
//txbuf:待發送數據首地址
//返回值:0,接收完成;其他,錯誤代碼
u8 NRF24L01_RxPacket(u8 *rxbuf)
{
	u8 sta;		    							   
	SPI2_SetSpeed(SPI_BaudRatePrescaler_8); //spi速度為9Mhz(24L01的最大SPI時鍾為10Mhz)   
	sta=NRF24L01_Read_Reg(STATUS);  //讀取狀態寄存器的值    	 
	NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中斷標志
	if(sta&RX_OK)//接收到數據
	{
		NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//讀取數據
		NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器 
		return 0; 
	}	   
	return 1;//沒收到任何數據
}					    
//該函數初始化NRF24L01到RX模式
//設置RX地址,寫RX數據寬度,選擇RF頻道,波特率和LNA HCURR
//當CE變高后,即進入RX模式,並可以接收數據了		   
void NRF24L01_RX_Mode(void)
{
	NRF24L01_CE=0;	  
  	NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//寫RX節點地址
	  
  	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);    //使能通道0的自動應答    
  	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址  	 
  	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);	     //設置RF通信頻率		  
  	NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//選擇通道0的有效數據寬度 	    
  	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//設置TX發射參數,0db增益,2Mbps,低噪聲增益開啟   
  	NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的參數;PWR_UP,EN_CRC,16BIT_CRC,接收模式 
  	NRF24L01_CE = 1; //CE為高,進入接收模式 
}						 
//該函數初始化NRF24L01到TX模式
//設置TX地址,寫TX數據寬度,設置RX自動應答的地址,填充TX發送數據,選擇RF頻道,波特率和LNA HCURR
//PWR_UP,CRC使能
//當CE變高后,即進入RX模式,並可以接收數據了		   
//CE為高大於10us,則啟動發送.	 
void NRF24L01_TX_Mode(void)
{														 
	NRF24L01_CE=0;	    
  	NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//寫TX節點地址 
  	NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //設置TX節點地址,主要為了使能ACK	  

  	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);     //使能通道0的自動應答    
  	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址  
  	NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//設置自動重發間隔時間:500us + 86us;最大自動重發次數:10次
  	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);       //設置RF通道為40
  	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);  //設置TX發射參數,0db增益,2Mbps,低噪聲增益開啟   
  	NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的參數;PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷
	NRF24L01_CE=1;//CE為高,10us后啟動發送
}

/*--------------------------------
	改變為發送模式
---------------------------------*/
void changeModeTx(void)
{
		NRF24L01_CE=0;					//使能24L01
		NRF24L01_CSN=1;					//SPI片選取消
		NRF24L01_TX_Mode();	 									
}

/*--------------------------------
	改變為接收模式	
---------------------------------*/
void changeModeRx(void)
{		
		NRF24L01_CE=0;					//使能24L01
		NRF24L01_CSN=1;					//SPI片選取消
		NRF24L01_RX_Mode(); 									
}



2401.h

#ifndef __24L01_H
#define __24L01_H	 		  
#include "sys.h"   
//pb13 14 15 SPI2_SCK SPI2_MISO SPI2_MOSI
/*
NRF24L01_CE   PBout(12) //24L01片選信號
NRF24L01_CSN  PAout(4) //SPI片選信號	   
NRF24L01_IRQ  PAin(11)  //IRQ主機數據輸入
 */   
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//NRF24L01寄存器操作命令
#define NRF_READ_REG    0x00  //讀配置寄存器,低5位為寄存器地址
#define NRF_WRITE_REG   0x20  //寫配置寄存器,低5位為寄存器地址
#define RD_RX_PLOAD     0x61  //讀RX有效數據,1~32字節
#define WR_TX_PLOAD     0xA0  //寫TX有效數據,1~32字節
#define FLUSH_TX        0xE1  //清除TX FIFO寄存器.發射模式下用
#define FLUSH_RX        0xE2  //清除RX FIFO寄存器.接收模式下用
#define REUSE_TX_PL     0xE3  //重新使用上一包數據,CE為高,數據包被不斷發送.
#define NOP             0xFF  //空操作,可以用來讀狀態寄存器	 
//SPI(NRF24L01)寄存器地址
#define CONFIG          0x00  //配置寄存器地址;bit0:1接收模式,0發射模式;bit1:電選擇;bit2:CRC模式;bit3:CRC使能;
                              //bit4:中斷MAX_RT(達到最大重發次數中斷)使能;bit5:中斷TX_DS使能;bit6:中斷RX_DR使能
#define EN_AA           0x01  //使能自動應答功能  bit0~5,對應通道0~5
#define EN_RXADDR       0x02  //接收地址允許,bit0~5,對應通道0~5
#define SETUP_AW        0x03  //設置地址寬度(所有數據通道):bit1,0:00,3字節;01,4字節;02,5字節;
#define SETUP_RETR      0x04  //建立自動重發;bit3:0,自動重發計數器;bit7:4,自動重發延時 250*x+86us
#define RF_CH           0x05  //RF通道,bit6:0,工作通道頻率;
#define RF_SETUP        0x06  //RF寄存器;bit3:傳輸速率(0:1Mbps,1:2Mbps);bit2:1,發射功率;bit0:低噪聲放大器增益
#define STATUS          0x07  //狀態寄存器;bit0:TX FIFO滿標志;bit3:1,接收數據通道號(最大:6);bit4,達到最多次重發
                              //bit5:數據發送完成中斷;bit6:接收數據中斷;
#define MAX_TX  		0x10  //達到最大發送次數中斷
#define TX_OK   		0x20  //TX發送完成中斷
#define RX_OK   		0x40  //接收到數據中斷

#define OBSERVE_TX      0x08  //發送檢測寄存器,bit7:4,數據包丟失計數器;bit3:0,重發計數器
#define CD              0x09  //載波檢測寄存器,bit0,載波檢測;
#define RX_ADDR_P0      0x0A  //數據通道0接收地址,最大長度5個字節,低字節在前
#define RX_ADDR_P1      0x0B  //數據通道1接收地址,最大長度5個字節,低字節在前
#define RX_ADDR_P2      0x0C  //數據通道2接收地址,最低字節可設置,高字節,必須同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P3      0x0D  //數據通道3接收地址,最低字節可設置,高字節,必須同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P4      0x0E  //數據通道4接收地址,最低字節可設置,高字節,必須同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P5      0x0F  //數據通道5接收地址,最低字節可設置,高字節,必須同RX_ADDR_P1[39:8]相等;
#define TX_ADDR         0x10  //發送地址(低字節在前),ShockBurstTM模式下,RX_ADDR_P0與此地址相等
#define RX_PW_P0        0x11  //接收數據通道0有效數據寬度(1~32字節),設置為0則非法
#define RX_PW_P1        0x12  //接收數據通道1有效數據寬度(1~32字節),設置為0則非法
#define RX_PW_P2        0x13  //接收數據通道2有效數據寬度(1~32字節),設置為0則非法
#define RX_PW_P3        0x14  //接收數據通道3有效數據寬度(1~32字節),設置為0則非法
#define RX_PW_P4        0x15  //接收數據通道4有效數據寬度(1~32字節),設置為0則非法
#define RX_PW_P5        0x16  //接收數據通道5有效數據寬度(1~32字節),設置為0則非法
#define NRF_FIFO_STATUS 0x17  //FIFO狀態寄存器;bit0,RX FIFO寄存器空標志;bit1,RX FIFO滿標志;bit2,3,保留
                              //bit4,TX FIFO空標志;bit5,TX FIFO滿標志;bit6,1,循環發送上一數據包.0,不循環;
//////////////////////////////////////////////////////////////////////////////////////////////////////////
/*//24L01操作線   
#define NRF24L01_CE   PGout(8) //24L01片選信號
#define NRF24L01_CSN  PGout(7) //SPI片選信號	   
#define NRF24L01_IRQ  PGin(6)  //IRQ主機數據輸入
*/
//24L01操作線
#define NRF24L01_CE   PBout(12) //24L01片選信號
#define NRF24L01_CSN  PAout(4) //SPI片選信號	   
#define NRF24L01_IRQ  PAin(11)  //IRQ主機數據輸入

//24L01發送接收數據寬度定義
#define TX_ADR_WIDTH    5   	//5字節的地址寬度
#define RX_ADR_WIDTH    5   	//5字節的地址寬度
#define TX_PLOAD_WIDTH  32  	//32字節的用戶數據寬度
#define RX_PLOAD_WIDTH  32  	//32字節的用戶數據寬度
									   	   

void NRF24L01_Init(void);						//初始化
void NRF24L01_RX_Mode(void);					//配置為接收模式
void NRF24L01_TX_Mode(void);					//配置為發送模式
u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 u8s);//寫數據區
u8 NRF24L01_Read_Buf(u8 reg, u8 *pBuf, u8 u8s);	//讀數據區		  
u8 NRF24L01_Read_Reg(u8 reg);					//讀寄存器
u8 NRF24L01_Write_Reg(u8 reg, u8 value);		//寫寄存器
u8 NRF24L01_Check(void);						//檢查24L01是否存在
u8 NRF24L01_TxPacket(u8 *txbuf);				//發送一個包的數據
u8 NRF24L01_RxPacket(u8 *rxbuf);				//接收一個包的數據

void changeModeTx(void);
void changeModeRx(void);

#endif





main_Tx.c 發送端

#include "sys.h"
#include "nrf2401.h"
#include "led.h"


void MySystemInit(void){
	SystemInit();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	delay_init();
	uart_init(115200);
	NRF24L01_Init();
	LED_GPIO_Config();
	while( NRF24L01_Check())			//檢查NRF24L01
	{
		printf("error");
		delay_ms(100);		
	}
	
	
}

u16 t=0;
u8 key;
u8 mode;
u8 tmp_buf[33]="fuck";	
//char * k;
void TX(void)
{
	
	if(NRF24L01_TxPacket(tmp_buf)==TX_OK)
			{
				printf("success");
			
				 	  
				tmp_buf[32]=0;//加入結束符	

				
			}else
			{		
printf("failed");				
 	
			};

			delay_ms(1500);				
}


int	main(){
	
	
	MySystemInit();
	NRF24L01_TX_Mode();
	mode=' ';//從空格鍵開始  
	//changeModeTx();
while(1){
		
	TX();
}
}


main_RX.c 接收端

#include "sys.h"
#include "nrf2401.h"


u8 MSG_RX_BUF[33];

void MySystemInit(void){
	SystemInit();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	delay_init();
	uart_init(115200);
	NRF24L01_Init();
	while( NRF24L01_Check())			//檢查NRF24L01
	{
		printf("error");
		delay_ms(100);		
	}
	
	
}

	u16 t=0;
u8 key;
u8 mode;
u8 tmp_buf[33];
char Display[80];
char * dis;
void RX(void)
{
	
			if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,則顯示出來.
			{
				
				int i=0;
				printf("Recived");
				tmp_buf[32]=0;//加入字符串結束符
				printf(tmp_buf);
				
			}else delay_us(100);	   
			t++;
			if(t==10000)//大約1s鍾改變一次狀態
			{
				t=0;

			} 				    
}


int	main(){
	
	MySystemInit();
	NRF24L01_RX_Mode();
	mode=' ';//從空格鍵開始  
while(1){
	
	RX();
}
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM