24L01收发一体多线程测试demo

一、

1.初始化

	NRF24L01_Init();
	if(NRF24L01_Check()==0)
	{
	
		nRF24L01_data_init();
		main_data_1.NRF24L01_statue=1;
	}
	else
	{
	 
		main_data_1.NRF24L01_statue=0;
	}

2.发送线程

void NRF24L01_SEND_task(void *pvParameters)
{
	//u8 send_time=0;
	u8 send_data[32]={0};
	u8 rec_data[32]={0};
	u8 i=0;
	u8 t_d=0;
	u8 rec_time=0;
	u8 SEND_statue=0;
	BaseType_t statue;
	//BaseType_t err=pdFALSE;
	printf("Free heap: %d bytes\n", xPortGetFreeHeapSize());			/*´òÓ¡Ê£Óà¶ÑÕ»´óС*/	
	while(1)
	{
		  if(main_data_1.NRF24L01_statue==1)
			{

				send_data[0]=0xbb;
				send_data[1]=0xbf;
				send_data[2]=0x01;
				send_data[3]=0x1b;
				for(i=4;i<31;i++)
				{
				  send_data[i]=0x00;
				}
				send_data[31]=0x96 ;
				for(i=0;i<32;i++)
					{
						printf(" %x ", send_data[i]);
					}
					printf("\r\n");
					xSemaphoreTake(BinarySemaphore,portMAX_DELAY); //»ñÈ¡ÐźÅÁ¿£¬ËÀµÈ
					nRF24L01_TxPacket(send_data);
					xSemaphoreGive(BinarySemaphore ); //·¢ËÍ

				
			}		
		vTaskDelay(10);
	}

}

3.接收线程

void NRF24L01_REC_task(void *pvParameters)
{
	BaseType_t err=pdFALSE;
	u8 statue=0;
	u8 RxBuf[32]={0};
	u8 rec_time=0;
	
	while(1)
	{
		if(main_data_1.NRF24L01_statue==1)
		{

			xSemaphoreTake(BinarySemaphore,portMAX_DELAY); //»ñÈ¡ÐźÅÁ¿£¬ËÀµÈ
			//delay_us(800);
			SetRX_Mode();
			statue=nRF24L01_RxPacket(RxBuf);
			xSemaphoreGive(BinarySemaphore ); //·¢ËÍ
			if(statue==0)
				{
						main_data_1.not_rec_time=0;
						LED3(1);
				}
		}	
	  vTaskDelay(1);
	}
}

4. 24L01.C

#include "24l01.h"


SPI_HandleTypeDef hspi2;
extern QueueHandle_t   Message_Queue;		//ÏûÏ¢¶ÓÁÐ

void MX_SPI2_Init(void)
{

  hspi2.Instance = SPI2;//SPI1
  hspi2.Init.Mode = SPI_MODE_MASTER;//ÉèÖÃSPI¹¤×÷ģʽ£¬ÉèÖÃΪÖ÷ģʽ
  hspi2.Init.Direction = SPI_DIRECTION_2LINES;//ÉèÖÃSPIµ¥Ïò»òÕßË«ÏòµÄÊý¾Ýģʽ:SPIÉèÖÃΪ˫Ïßģʽ
  hspi2.Init.DataSize = SPI_DATASIZE_8BIT;//ÉèÖÃSPIµÄÊý¾Ý´óС:SPI·¢ËͽÓÊÕ8λ֡½á¹¹
  hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; //´®ÐÐͬ²½Ê±ÖӵĿÕÏÐ״̬Ϊ¸ßµçƽ
  hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; //´®ÐÐͬ²½Ê±Öӵĵڶþ¸öÌø±äÑØ£¨ÉÏÉý»òϽµ£©Êý¾Ý±»²ÉÑù
  hspi2.Init.NSS = SPI_NSS_SOFT;//NSSÐźÅÓÉÓ²¼þ£¨NSS¹Ü½Å£©»¹ÊÇÈí¼þ£¨Ê¹ÓÃSSI룩¹ÜÀí:ÄÚ²¿NSSÐźÅÓÐSSIλ¿ØÖÆ
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;//¶¨Ò岨ÌØÂÊÔ¤·ÖƵµÄÖµ:²¨ÌØÂÊÔ¤·ÖƵֵΪ256
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;//Ö¸¶¨Êý¾Ý´«Êä´ÓMSBλ»¹ÊÇLSBλ¿ªÊ¼:Êý¾Ý´«Êä´ÓMSBλ¿ªÊ¼
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;//¹Ø±ÕTIģʽ
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;//¹Ø±ÕÓ²¼þCRCУÑé
  hspi2.Init.CRCPolynomial = 7; //CRCÖµ¼ÆËãµÄ¶àÏîʽ
  if (HAL_SPI_Init(&hspi2) != HAL_OK)
  {
    Error_Handler();
  }


	__HAL_SPI_ENABLE(&hspi2);//ʹÄÜSPI1
	
	 SPI2_ReadWriteByte(0Xff);   
	
}

//SPI2µ×²ãÇý¶¯£¬Ê±ÖÓʹÄÜ£¬Òý½ÅÅäÖÃ
//´Ëº¯Êý»á±»HAL_SPI_Init()µ÷ÓÃ
//hspi:SPI¾ä±ú
void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(spiHandle->Instance==SPI2)
  {
		__HAL_RCC_SPI2_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**SPI2 GPIO Configuration    
    PB13     ------> SPI2_SCK
    PB14     ------> SPI2_MISO
    PB15     ------> SPI2_MOSI 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_14;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    /* SPI2 interrupt Init */
    HAL_NVIC_SetPriority(SPI2_IRQn, 5, 0);
    HAL_NVIC_EnableIRQ(SPI2_IRQn);
  }
}

//SPIËÙ¶ÈÉèÖú¯Êý
//SPIËÙ¶È=fAPB1/·ÖƵϵÊý
//@ref SPI_BaudRate_Prescaler:SPI_BAUDRATEPRESCALER_2~SPI_BAUDRATEPRESCALER_2 256
//fAPB1ʱÖÓÒ»°ãΪ42Mhz£º
void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler)
{
    assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));//ÅжÏÓÐЧÐÔ
    __HAL_SPI_DISABLE(&hspi2);            //¹Ø±ÕSPI
    hspi2.Instance->CR1&=0XFFC7;          //λ3-5ÇåÁ㣬ÓÃÀ´ÉèÖò¨ÌØÂÊ
    hspi2.Instance->CR1|=SPI_BaudRatePrescaler;//ÉèÖÃSPIËÙ¶È
    __HAL_SPI_ENABLE(&hspi2);             //ʹÄÜSPI
    
}

//SPI1 ¶Áдһ¸ö×Ö½Ú
//TxData:ҪдÈëµÄ×Ö½Ú
//·µ»ØÖµ:¶ÁÈ¡µ½µÄ×Ö½Ú
u8 SPI2_ReadWriteByte(u8 TxData)
{
    u8 Rxdata;
    HAL_SPI_TransmitReceive(&hspi2,&TxData,&Rxdata,1, 1000);       
		return Rxdata;          		    //·µ»ØÊÕµ½µÄÊý¾Ý		
}


/**********************************************************************************/
/***********************************24l01***********************************************/
/**********************************************************************************/

const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x00,0x00,0x00,0x00,0x01}; //·¢Ë͵ØÖ·
const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x00,0x00,0x00,0x00,0x01}; //·¢Ë͵ØÖ·



//Õë¶ÔNRF24L01ÐÞ¸ÄSPI1Çý¶¯
void NRF24L01_SPI_Init(void)
{
    __HAL_SPI_DISABLE(&hspi2);               //ÏȹرÕSPI2
    hspi2.Init.CLKPolarity=SPI_POLARITY_LOW; //´®ÐÐͬ²½Ê±ÖӵĿÕÏÐ״̬ΪµÍµçƽ
    hspi2.Init.CLKPhase=SPI_PHASE_1EDGE;     //´®ÐÐͬ²½Ê±ÖӵĵÚ1¸öÌø±äÑØ£¨ÉÏÉý»òϽµ£©Êý¾Ý±»²ÉÑù
    HAL_SPI_Init(&hspi2);
    __HAL_SPI_ENABLE(&hspi2);                //ʹÄÜSPI2
}


//³õʼ»¯24L01µÄIO¿Ú
void NRF24L01_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_GPIOA_CLK_ENABLE();			//¿ªÆôGPIOBʱÖÓ
    __HAL_RCC_GPIOB_CLK_ENABLE();			//¿ªÆôGPIOGʱÖÓ
    
	//CSN
    //GPIO_Initure.Pin=GPIO_PIN_12; 	
		GPIO_Initure.Pin=GPIO_PIN_4; 		
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //ÍÆÍìÊä³ö
    GPIO_Initure.Pull=GPIO_PULLUP;          //ÉÏÀ­
    GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;     //¸ßËÙ
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);     //³õʼ»¯

	//CE
    //GPIO_Initure.Pin=GPIO_PIN_8; 		
		GPIO_Initure.Pin=GPIO_PIN_3;	
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //ÍÆÍìÊä³ö
    GPIO_Initure.Pull=GPIO_PULLUP;          //ÉÏÀ­
    GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;     //¸ßËÙ
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);     //³õʼ»¯
	
	//IRQ
	//GPIO_Initure.Pin=GPIO_PIN_9;		
	GPIO_Initure.Pin=GPIO_PIN_5;		
	GPIO_Initure.Mode=GPIO_MODE_INPUT;      //ÊäÈë
	HAL_GPIO_Init(GPIOB,&GPIO_Initure);     //³õʼ»¯
	
	
    
	MX_SPI2_Init();    		                //³õʼ»¯SPI1
  //NRF24L01_SPI_Init();                    //Õë¶ÔNRFµÄÌصãÐÞ¸Ä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_8);   //  spiËÙ¶ÈΪ10.5Mhz£¨£¨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´íÎó	
	}	
	init_NRF24L01();
	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ËÙ¶ÈΪ6.75Mhz£¨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);          //¶Áȡ״̬¼Ä´æÆ÷µÄÖµ	   
//	printf("sta=%x  \r\n",sta);
//	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;	
//	u8 i=0;
//	//SPI2_SetSpeed(SPI_BAUDRATEPRESCALER_8); //spiËÙ¶ÈΪ6.75Mhz£¨24L01µÄ×î´óSPIʱÖÓΪ10Mhz£©   
//	sta=NRF24L01_Read_Reg(STATUS);          //¶Áȡ״̬¼Ä´æÆ÷µÄÖµ    	 
//	NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //Çå³ýTX_DS»òMAX_RTÖжϱêÖ¾
//	if(sta&RX_OK)//½ÓÊÕµ½Êý¾Ý
//	{
//			if(sta&0x02)
//			{
//				printf("Êý¾ÝÀ´×ÔͨµÀ1");
//			}
//			else if(sta&0x04)
//			{
//				printf("Êý¾ÝÀ´×ÔͨµÀ2");
//			}
//			else if(sta&0x06)
//			{
//				printf("Êý¾ÝÀ´×ÔͨµÀ3");
//			}
//			else if(sta&0x08)
//			{
//				printf("Êý¾ÝÀ´×ÔͨµÀ4");
//			}
//			else if(sta&0x0a)
//			{
//				printf("Êý¾ÝÀ´×ÔͨµÀ5");
//			}
//			else 
//			{
//				//printf("Êý¾ÝÀ´×ÔͨµÀ0");
//			}
//			NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//¶ÁÈ¡Êý¾Ý
//			for(i=0;i<32;i++)
//			{
//			  printf(" %x ", rxbuf[i]);
//			}
//			printf("\r\n");
//			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 rec_24l01()
//{
//	u8 tmp_buf[33];	
//	u8 t=0;
//	u8 i=0;
//	
//	
//  while(NRF24L01_Check())
//	{
//		printf("NRF24L01 Error  \r\n");
//	  vTaskDelay(1000);
//	}
//	NRF24L01_RX_Mode();	
//	while(1)
//		{	  		    		    				 
//			if(NRF24L01_RxPacket(tmp_buf)==0)//Ò»µ©½ÓÊÕµ½ÐÅÏ¢,ÔòÏÔʾ³öÀ´.
//			{
//				printf("NRF24L01 rec_data: \r\n");
//				for(i=0;i<32;i++)
//				{
//				  printf("  %x  ",tmp_buf[i]);  
//				}
//				printf("\r\n"); 
				tmp_buf[32]=0;//¼ÓÈë×Ö·û´®½áÊø·û
				printf("NRF24L01 rec_data:  %s  \r\n",tmp_buf);   
//			}
//			
//			t++;
//			if(t==100)//´óÔ¼1sÖӸıäÒ»´Î״̬
//			{
//				t=0;
//				LED_TEST_TOG;
//			} 
//			vTaskDelay(10);			
//		}
//}


*************************************************ÊÕ·¢Ò»Ìå///********************************************************************///
*************************************************ÊÕ·¢Ò»Ìå///********************************************************************///
*************************************************ÊÕ·¢Ò»Ìå///********************************************************************///
*************************************************ÊÕ·¢Ò»Ìå///********************************************************************///



//********************
//*NRF24L01³õʼ»¯
//
void init_NRF24L01(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+RX_PW_P0,RX_PLOAD_WIDTH);//Ñ¡ÔñͨµÀ0µÄÓÐЧÊý¾Ý¿í¶È 	
	NRF24L01_Write_Reg(NRF_WRITE_REG + RF_SETUP, 0x0e);   	//ÉèÖÃTX·¢Éä²ÎÊý,0dbÔöÒæ,2Mbps,µÍÔëÉùÔöÒ濪Æô   
	//NRF24L01_Write_Reg(NRF_WRITE_REG + RF_SETUP, 0x06);   	//ÉèÖÃTX·¢Éä²ÎÊý,0dbÔöÒæ,1Mbps,µÍÔëÉùÔöÒ濪Æô   
}



/***********************************************************************************************************/
//·¢ËÍ  tx_buf  
//*******************************************************************************************************
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
	u8 sta=0;
	
	NRF24L01_CE(0);
	
	NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //ÉèÖÃTX½ÚµãµØÖ·,Ö÷ҪΪÁËʹÄÜACK
	NRF24L01_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);//дÊý¾Ýµ½TX BUF  32¸ö×Ö½Ú
	NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);    //ÅäÖûù±¾¹¤×÷ģʽµÄ²ÎÊý;PWR_UP,EN_CRC,16BIT_CRC,½ÓÊÕģʽ,¿ªÆôËùÓÐÖжÏ
	NRF24L01_CE(1);
	while(NRF24L01_IRQ!=0);                 //µÈ´ý·¢ËÍÍê³É
	
	//delay_us(100);
//	sta=NRF24L01_Read_Reg(STATUS);          //¶Áȡ״̬¼Ä´æÆ÷µÄÖµ	   
//	printf("sta=%x  \r\n",sta);
//	NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //Çå³ýTX_DS»òMAX_RTÖжϱêÖ¾
//	if(sta&MAX_TX)                          //´ïµ½×î´óÖØ·¢´ÎÊý
//	{
//		NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,0xff);  //Çå³ýTX FIFO¼Ä´æÆ÷ 
//		 
//	}
//	if(sta&TX_OK)                           //·¢ËÍÍê³É
//	{
//		
//	}
	
}

void SetRX_Mode(void)
{
	NRF24L01_CE(0);
	NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);     //ÅäÖûù±¾¹¤×÷ģʽµÄ²ÎÊý;PWR_UP,EN_CRC,16BIT_CRC,½ÓÊÕģʽ 
	NRF24L01_CE(1);
	delay_us(130);
}

u8 nRF24L01_RxPacket(u8* rx_buf)
{
	u8 sum=0;
	u8 sta=0;
	u8 i=0;
	unsigned char revale=0;
	BaseType_t statue;
	u8 nRF24L01_RxPacket_data[32]={0};
	//static u8 rx_data[32]={0};
	//memset(rx_data,0,32);
	//memcpy(rx_data,rx_buf,0);
	
	sta=NRF24L01_Read_Reg(STATUS);          //¶Áȡ״̬¼Ä´æÆ÷µÄÖµ    	 
	if(sta&RX_OK)//½ÓÊÕµ½Êý¾Ý
	{
			if(sta&0x02)
			{
				//printf("Êý¾ÝÀ´×ÔͨµÀ1 \r\n");
			}
			else if(sta&0x04)
			{
				//printf("Êý¾ÝÀ´×ÔͨµÀ2 \r\n");
			}
			else if(sta&0x06)
			{
				//printf("Êý¾ÝÀ´×ÔͨµÀ3 \r\n");
			}
			else if(sta&0x08)
			{
				//printf("Êý¾ÝÀ´×ÔͨµÀ4 \r\n");
			}
			else if(sta&0x0a)
			{
				//printf("Êý¾ÝÀ´×ÔͨµÀ5 \r\n");
			}
			else 
			{
				printf("Êý¾ÝÀ´×ÔͨµÀ0 \r\n");
			}
			NRF24L01_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);//¶ÁÈ¡Êý¾Ý
			memcpy(nRF24L01_RxPacket_data,rx_buf,32);
			
			NRF24L01_Write_Reg(FLUSH_RX,0xff);  //Çå³ýRX FIFO¼Ä´æÆ÷ 
			NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //Çå³ýTX_DS»òMAX_RTÖжϱêÖ¾			
			
			if(rx_buf[0]==0xbb&&rx_buf[1]==0xbf)
				{
					for(i=0;i<31;i++)
					{
						sum+=rx_buf[i];
					}
					if(rx_buf[31]==sum)
					{
						//main_data_1.not_rec_time=0;
						
//						statue=xQueueSend(Message_Queue,rx_buf,0);
//						if(statue != pdTRUE)
//						{
//							printf("Queue Send Failed!\r\n");
//						}
						dear_data(rx_buf,32);
						return 0;
					}
				}
				else
				{
				  return 1;
				}
				
			
		}	
	 else if(sta&TX_OK)
	 {
	   //printf("·¢ËÍÍê³É  \r\n");
		 NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //Çå³ýTX_DS»òMAX_RTÖжϱêÖ¾
		 return 1;
	 }
	 else if(sta&0x10)
	 {
	   //printf("´ïµ½×î¶àÖØ·¢ÖжϴÎÊý \r\n");
		 NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //Çå³ýTX_DS»òMAX_RTÖжϱêÖ¾
		 return 1;
	 }
//	 else if(sta==0x00)
//	 {
//		 //printf("Free heap: %d bytes\n", xPortGetFreeHeapSize());			/*´òÓ¡Ê£Óà¶ÑÕ»´óС*/	
//	   NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,0xff); //Çå³ýTX_DS»òMAX_RTÖжϱêÖ¾
//	 }
	return 1;//ûÊÕµ½ÈκÎÊý¾Ý
}

5. 24L01.h

#ifndef __24L01_H
#define __24L01_H

#include "main.h"


typedef unsigned char u8; 
typedef unsigned short u16;
typedef unsigned int u32;


extern SPI_HandleTypeDef hspi2;

void MX_SPI2_Init(void);

void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler);
u8 SPI2_ReadWriteByte(u8 TxData);


/**********************************************************************************/
/***********************************24l01***********************************************/
/**********************************************************************************/

//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(n)  n==1? HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET): HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET)
//#define NRF24L01_CSN(n)  n==1? HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET): HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET)
//#define NRF24L01_IRQ  HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9)

#define NRF24L01_CE(n)  n==1? HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET): HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET)
#define NRF24L01_CSN(n)  n==1? HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET): HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET)
#define NRF24L01_IRQ  HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5)


//#define NRF24L01_CE     PGout(8)  //24L01ƬѡÐźÅ
//#define NRF24L01_CSN    PGout(7)  //SPIƬѡÐźÅ	   
//#define NRF24L01_IRQ    PGin(6)   //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 rec_24l01(void);


/**********************************************************************************/

void init_NRF24L01(void);
void nRF24L01_TxPacket(unsigned char * tx_buf);
void SetRX_Mode(void);
u8 nRF24L01_RxPacket(u8* rx_buf);



#endif




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值