一、
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