一、<
/h2>
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
", xPortGetFreeHeapSize()); /*′òó?ê£óà????′óD?*/
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("
");
xSemaphoreTake(BinarySemaphore,portMAX_DELAY); //??è?D?o?á?£??àμè
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); //??è?D?o?á?£??àμè
//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; //???¢?óáD
void MX_SPI2_Init(void)
{
hspi2.Instance = SPI2;//SPI1
hspi2.Init.Mode = SPI_MODE_MASTER;//éè??SPI1¤×÷?£ê?£?éè???a?÷?£ê?
hspi2.Init.Direction = SPI_DIRECTION_2LINES;//éè??SPIμ¥?ò?ò?????òμ?êy?Y?£ê?:SPIéè???a?????£ê?
hspi2.Init.DataSize = SPI_DATASIZE_8BIT;//éè??SPIμ?êy?Y′óD?:SPI·¢?í?óê?8?????á11
hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; //′?DDí?2?ê±?óμ????D×′ì??a??μ???
hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; //′?DDí?2?ê±?óμ?μú?t??ì?±???£¨é?éy?ò???μ£?êy?Y±?2é?ù
hspi2.Init.NSS = SPI_NSS_SOFT;//NSSD?o?óéó2?t£¨NSS1ü??£??1ê?èí?t£¨ê1ó?SSI??£?1üàí:?ú2?NSSD?o?óDSSI??????
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;//?¨ò?2¨ì??ê?¤·??μμ??μ:2¨ì??ê?¤·??μ?μ?a256
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;//???¨êy?Y′?ê?′óMSB???1ê?LSB???aê?:êy?Y′?ê?′óMSB???aê?
hspi2.Init.TIMode = SPI_TIMODE_DISABLE;//1?±?TI?£ê?
hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;//1?±?ó2?tCRCD£?é
hspi2.Init.CRCPolynomial = 7; //CRC?μ????μ??à??ê?
if (HAL_SPI_Init(&hspi2) != HAL_OK)
{
Error_Handler();
}
__HAL_SPI_ENABLE(&hspi2);//ê1?üSPI1
SPI2_ReadWriteByte(0Xff);
}
//SPI2μ×2??y?ˉ£?ê±?óê1?ü£?òy??????
//′?oˉêy?á±?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?ù?èéè??oˉêy
//SPI?ù?è=fAPB1/·??μ?μêy
//@ref SPI_BaudRate_Prescaler:SPI_BAUDRATEPRESCALER_2~SPI_BAUDRATEPRESCALER_2 256
//fAPB1ê±?óò?°??a42Mhz£o
void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler)
{
assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));//?D??óDD§D?
__HAL_SPI_DISABLE(&hspi2); //1?±?SPI
hspi2.Instance->CR1&=0XFFC7; //??3-5??á?£?ó?à′éè??2¨ì??ê
hspi2.Instance->CR1|=SPI_BaudRatePrescaler;//éè??SPI?ù?è
__HAL_SPI_ENABLE(&hspi2); //ê1?üSPI
}
//SPI1 ?áD′ò???×??ú
//TxData:òaD′è?μ?×??ú
//·μ???μ:?áè?μ?μ?×??ú
u8 SPI2_ReadWriteByte(u8 TxData)
{
u8 Rxdata;
HAL_SPI_TransmitReceive(&hspi2,&TxData,&Rxdata,1, 1000);
return Rxdata; //·μ??ê?μ?μ?êy?Y
}
/**********************************************************************************/
/***********************************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}; //·¢?íμ??·
//????NRF24L01DT??SPI1?y?ˉ
void NRF24L01_SPI_Init(void)
{
__HAL_SPI_DISABLE(&hspi2); //?è1?±?SPI2
hspi2.Init.CLKPolarity=SPI_POLARITY_LOW; //′?DDí?2?ê±?óμ????D×′ì??aμíμ???
hspi2.Init.CLKPhase=SPI_PHASE_1EDGE; //′?DDí?2?ê±?óμ?μú1??ì?±???£¨é?éy?ò???μ£?êy?Y±?2é?ù
HAL_SPI_Init(&hspi2);
__HAL_SPI_ENABLE(&hspi2); //ê1?üSPI2
}
//3?ê??ˉ24L01μ?IO?ú
void NRF24L01_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE(); //?a??GPIOBê±?ó
__HAL_RCC_GPIOB_CLK_ENABLE(); //?a??GPIOGê±?ó
//CSN
//GPIO_Initure.Pin=GPIO_PIN_12;
GPIO_Initure.Pin=GPIO_PIN_4;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //í?íìê?3?
GPIO_Initure.Pull=GPIO_PULLUP; //é?à-
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //???ù
HAL_GPIO_Init(GPIOB,&GPIO_Initure); //3?ê??ˉ
//CE
//GPIO_Initure.Pin=GPIO_PIN_8;
GPIO_Initure.Pin=GPIO_PIN_3;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //í?íìê?3?
GPIO_Initure.Pull=GPIO_PULLUP; //é?à-
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //???ù
HAL_GPIO_Init(GPIOB,&GPIO_Initure); //3?ê??ˉ
//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); //3?ê??ˉ
MX_SPI2_Init(); //3?ê??ˉSPI1
//NRF24L01_SPI_Init(); //????NRFμ?ì?μ?DT??SPIμ?éè??
NRF24L01_CE(0); //ê1?ü24L01
NRF24L01_CSN(1); //SPI????è???
}
//?ì2a24L01ê?·?′??ú
//·μ???μ:0£?3é1|;1£?ê§°ü
u8 NRF24L01_Check(void)
{
u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
u8 i;
SPI2_SetSpeed(SPI_BAUDRATEPRESCALER_8); // spi?ù?è?a10.5Mhz£¨£¨24L01μ?×?′óSPIê±?ó?a10Mhz,?aà?′óò?μ???1??μ£?
NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5);//D′è?5??×??úμ?μ??·.
NRF24L01_Read_Buf(TX_ADDR,buf,5); //?á3?D′è?μ?μ??·
for(i=0;i<5;i++)if(buf[i]!=0XA5)break;
if(i!=5)
{
return 1;//?ì2a24L01′í?ó
}
init_NRF24L01();
return 0; //?ì2aμ?24L01
}
//SPID′??′??÷
//reg:???¨??′??÷μ??·
//value:D′è?μ??μ
u8 NRF24L01_Write_Reg(u8 reg,u8 value)
{
u8 status;
NRF24L01_CSN(0); //ê1?üSPI′?ê?
status =SPI2_ReadWriteByte(reg);//·¢?í??′??÷o?
SPI2_ReadWriteByte(value); //D′è???′??÷μ??μ
NRF24L01_CSN(1); //???1SPI′?ê?
return(status); //·μ??×′ì??μ
}
//?áè?SPI??′??÷?μ
//reg:òa?áμ???′??÷
u8 NRF24L01_Read_Reg(u8 reg)
{
u8 reg_val;
NRF24L01_CSN(0); //ê1?üSPI′?ê?
SPI2_ReadWriteByte(reg); //·¢?í??′??÷o?
reg_val=SPI2_ReadWriteByte(0XFF);//?áè???′??÷?úèY
NRF24L01_CSN(1); //???1SPI′?ê?
return(reg_val); //·μ??×′ì??μ
}
//?ú???¨?????á3????¨3¤?èμ?êy?Y
//reg:??′??÷(????)
//*pBuf:êy?Y????
//len:êy?Y3¤?è
//·μ???μ,′?′??áμ?μ?×′ì???′??÷?μ
u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)
{
u8 status,u8_ctr;
NRF24L01_CSN(0); //ê1?üSPI′?ê?
status=SPI2_ReadWriteByte(reg);//·¢?í??′??÷?μ(????),2¢?áè?×′ì??μ
for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPI2_ReadWriteByte(0XFF);//?á3?êy?Y
NRF24L01_CSN(1); //1?±?SPI′?ê?
return status; //·μ???áμ?μ?×′ì??μ
}
//?ú???¨????D′???¨3¤?èμ?êy?Y
//reg:??′??÷(????)
//*pBuf:êy?Y????
//len:êy?Y3¤?è
//·μ???μ,′?′??áμ?μ?×′ì???′??÷?μ
u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)
{
u8 status,u8_ctr;
NRF24L01_CSN(0); //ê1?üSPI′?ê?
status = SPI2_ReadWriteByte(reg);//·¢?í??′??÷?μ(????),2¢?áè?×′ì??μ
for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPI2_ReadWriteByte(*pBuf++); //D′è?êy?Y
NRF24L01_CSN(1); //1?±?SPI′?ê?
return status; //·μ???áμ?μ?×′ì??μ
}
//???ˉNRF24L01·¢?íò?′?êy?Y
//txbuf:′y·¢?íêy?Yê×μ??·
//·μ???μ:·¢?ííê3é×′??
//u8 NRF24L01_TxPacket(u8 *txbuf)
//{
// u8 sta;
// //SPI2_SetSpeed(SPI_BAUDRATEPRESCALER_8); //spi?ù?è?a6.75Mhz£¨24L01μ?×?′óSPIê±?ó?a10Mhz£?
// NRF24L01_CE(0);
// NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//D′êy?Yμ?TX BUF 32??×??ú
// NRF24L01_CE(1); //???ˉ·¢?í
// while(NRF24L01_IRQ!=0); //μè′y·¢?ííê3é
// sta=NRF24L01_Read_Reg(STATUS); //?áè?×′ì???′??÷μ??μ
// printf("sta=%x
",sta);
// NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //??3yTX_DS?òMAX_RT?D??±ê??
// if(sta&MAX_TX) //′?μ?×?′ó??·¢′?êy
// {
// NRF24L01_Write_Reg(FLUSH_TX,0xff); //??3yTX FIFO??′??÷
// return MAX_TX;
// }
// if(sta&TX_OK) //·¢?ííê3é
// {
// return TX_OK;
// }
// return 0xff;//?????-òò·¢?íê§°ü
//}
//???ˉNRF24L01·¢?íò?′?êy?Y
//txbuf:′y·¢?íêy?Yê×μ??·
//·μ???μ:0£??óê?íê3é£?????£?′í?ó′ú??
//u8 NRF24L01_RxPacket(u8 *rxbuf)
//{
// u8 sta;
// u8 i=0;
// //SPI2_SetSpeed(SPI_BAUDRATEPRESCALER_8); //spi?ù?è?a6.75Mhz£¨24L01μ?×?′óSPIê±?ó?a10Mhz£?
// sta=NRF24L01_Read_Reg(STATUS); //?áè?×′ì???′??÷μ??μ
// NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //??3yTX_DS?òMAX_RT?D??±ê??
// if(sta&RX_OK)//?óê?μ?êy?Y
// {
// if(sta&0x02)
// {
// printf("êy?Yà′×?í¨μà1");
// }
// else if(sta&0x04)
// {
// printf("êy?Yà′×?í¨μà2");
// }
// else if(sta&0x06)
// {
// printf("êy?Yà′×?í¨μà3");
// }
// else if(sta&0x08)
// {
// printf("êy?Yà′×?í¨μà4");
// }
// else if(sta&0x0a)
// {
// printf("êy?Yà′×?í¨μà5");
// }
// else
// {
// //printf("êy?Yà′×?í¨μà0");
// }
// NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//?áè?êy?Y
// for(i=0;i<32;i++)
// {
// printf(" %x ", rxbuf[i]);
// }
// printf("
");
// NRF24L01_Write_Reg(FLUSH_RX,0xff); //??3yRX FIFO??′??÷
// return 0;
// }
// return 1;//??ê?μ?è?o?êy?Y
//}
//??oˉêy3?ê??ˉNRF24L01μ?RX?£ê?
//éè??RXμ??·,D′RXêy?Y?í?è,????RF?μμà,2¨ì??êoíLNA HCURR
//μ±CE±???oó,?′??è?RX?£ê?,2¢?éò??óê?êy?Yá?
void NRF24L01_RX_Mode(void)
{
NRF24L01_CE(0);
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//D′RX?úμ?μ??·
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //ê1?üí¨μà0μ?×??ˉó|′e
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //ê1?üí¨μà0μ??óê?μ??·
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //éè??RFí¨D??μ?ê
NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//????í¨μà0μ?óDD§êy?Y?í?è
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //éè??TX·¢é?2?êy,0db??ò?,2Mbps,μí??éù??ò??a??
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f); //?????ù±?1¤×÷?£ê?μ?2?êy;PWR_UP,EN_CRC,16BIT_CRC,?óê??£ê?
NRF24L01_CE(1); //CE?a??,??è??óê??£ê?
}
//??oˉêy3?ê??ˉNRF24L01μ?TX?£ê?
//éè??TXμ??·,D′TXêy?Y?í?è,éè??RX×??ˉó|′eμ?μ??·,ì?3?TX·¢?íêy?Y,????RF?μμà,2¨ì??êoíLNA HCURR
//PWR_UP,CRCê1?ü
//μ±CE±???oó,?′??è?RX?£ê?,2¢?éò??óê?êy?Yá?
//CE?a??′óóú10us,?ò???ˉ·¢?í.
void NRF24L01_TX_Mode(void)
{
NRF24L01_CE(0);
NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//D′TX?úμ?μ??·
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //éè??TX?úμ?μ??·,?÷òa?aá?ê1?üACK
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //ê1?üí¨μà0μ?×??ˉó|′e
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //ê1?üí¨μà0μ??óê?μ??·
NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//éè??×??ˉ??·¢????ê±??:500us + 86us;×?′ó×??ˉ??·¢′?êy:10′?
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //éè??RFí¨μà?a40
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //éè??TX·¢é?2?êy,0db??ò?,2Mbps,μí??éù??ò??a??
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e); //?????ù±?1¤×÷?£ê?μ?2?êy;PWR_UP,EN_CRC,16BIT_CRC,?óê??£ê?,?a???ùóD?D??
NRF24L01_CE(1);//CE?a??,10usoó???ˉ·¢?í
}
//void rec_24l01()
//{
// u8 tmp_buf[33];
// u8 t=0;
// u8 i=0;
//
//
// while(NRF24L01_Check())
// {
// printf("NRF24L01 Error
");
// vTaskDelay(1000);
// }
// NRF24L01_RX_Mode();
// while(1)
// {
// if(NRF24L01_RxPacket(tmp_buf)==0)//ò?μ??óê?μ?D??¢,?ò??ê?3?à′.
// {
// printf("NRF24L01 rec_data:
");
// for(i=0;i<32;i++)
// {
// printf(" %x ",tmp_buf[i]);
// }
// printf("
");
tmp_buf[32]=0;//?óè?×?·?′??áê?·?
printf("NRF24L01 rec_data: %s
",tmp_buf);
// }
//
// t++;
// if(t==100)//′ó??1s?ó??±?ò?′?×′ì?
// {
// t=0;
// LED_TEST_TOG;
// }
// vTaskDelay(10);
// }
//}
*************************************************ê?·¢ò?ì?///********************************************************************///
*************************************************ê?·¢ò?ì?///********************************************************************///
*************************************************ê?·¢ò?ì?///********************************************************************///
*************************************************ê?·¢ò?ì?///********************************************************************///
//********************
//*NRF24L013?ê??ˉ
//
void init_NRF24L01(void)
{
NRF24L01_CE(0);
NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//D′TX?úμ?μ??·
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //éè??TX?úμ?μ??·,?÷òa?aá?ê1?üACK
NRF24L01_Write_Reg(NRF_WRITE_REG + EN_AA, 0x01); //ê1?üí¨μà0μ?×??ˉó|′e
NRF24L01_Write_Reg(NRF_WRITE_REG + EN_RXADDR, 0x01); //ê1?üí¨μà0μ??óê?μ??·
NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//éè??×??ˉ??·¢????ê±??:500us + 86us;×?′ó×??ˉ??·¢′?êy:10′?
NRF24L01_Write_Reg(NRF_WRITE_REG + RF_CH, 40); //éè??RFí¨μà?a40
NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//????í¨μà0μ?óDD§êy?Y?í?è
NRF24L01_Write_Reg(NRF_WRITE_REG + RF_SETUP, 0x0e); //éè??TX·¢é?2?êy,0db??ò?,2Mbps,μí??éù??ò??a??
//NRF24L01_Write_Reg(NRF_WRITE_REG + RF_SETUP, 0x06); //éè??TX·¢é?2?êy,0db??ò?,1Mbps,μí??éù??ò??a??
}
/***********************************************************************************************************/
//·¢?í 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?úμ?μ??·,?÷òa?aá?ê1?üACK
NRF24L01_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);//D′êy?Yμ?TX BUF 32??×??ú
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e); //?????ù±?1¤×÷?£ê?μ?2?êy;PWR_UP,EN_CRC,16BIT_CRC,?óê??£ê?,?a???ùóD?D??
NRF24L01_CE(1);
while(NRF24L01_IRQ!=0); //μè′y·¢?ííê3é
//delay_us(100);
// sta=NRF24L01_Read_Reg(STATUS); //?áè?×′ì???′??÷μ??μ
// printf("sta=%x
",sta);
// NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //??3yTX_DS?òMAX_RT?D??±ê??
// if(sta&MAX_TX) //′?μ?×?′ó??·¢′?êy
// {
// NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,0xff); //??3yTX FIFO??′??÷
//
// }
// if(sta&TX_OK) //·¢?ííê3é
// {
//
// }
}
void SetRX_Mode(void)
{
NRF24L01_CE(0);
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f); //?????ù±?1¤×÷?£ê?μ?2?êy;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)//?óê?μ?êy?Y
{
if(sta&0x02)
{
//printf("êy?Yà′×?í¨μà1
");
}
else if(sta&0x04)
{
//printf("êy?Yà′×?í¨μà2
");
}
else if(sta&0x06)
{
//printf("êy?Yà′×?í¨μà3
");
}
else if(sta&0x08)
{
//printf("êy?Yà′×?í¨μà4
");
}
else if(sta&0x0a)
{
//printf("êy?Yà′×?í¨μà5
");
}
else
{
printf("êy?Yà′×?í¨μà0
");
}
NRF24L01_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);//?áè?êy?Y
memcpy(nRF24L01_RxPacket_data,rx_buf,32);
NRF24L01_Write_Reg(FLUSH_RX,0xff); //??3yRX FIFO??′??÷
NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //??3yTX_DS?òMAX_RT?D??±ê??
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!
");
// }
dear_data(rx_buf,32);
return 0;
}
}
else
{
return 1;
}
}
else if(sta&TX_OK)
{
//printf("·¢?ííê3é
");
NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //??3yTX_DS?òMAX_RT?D??±ê??
return 1;
}
else if(sta&0x10)
{
//printf("′?μ?×??à??·¢?D??′?êy
");
NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //??3yTX_DS?òMAX_RT?D??±ê??
return 1;
}
// else if(sta==0x00)
// {
// //printf("Free heap: %d bytes
", xPortGetFreeHeapSize()); /*′òó?ê£óà????′óD?*/
// NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,0xff); //??3yTX_DS?òMAX_RT?D??±ê??
// }
return 1;//??ê?μ?è?o?êy?Y
}
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??′??÷2ù×÷?üá?
#define NRF_READ_REG 0x00 //?á??????′??÷,μí5???a??′??÷μ??·
#define NRF_WRITE_REG 0x20 //D′??????′??÷,μí5???a??′??÷μ??·
#define RD_RX_PLOAD 0x61 //?áRXóDD§êy?Y,1~32×??ú
#define WR_TX_PLOAD 0xA0 //D′TXóDD§êy?Y,1~32×??ú
#define FLUSH_TX 0xE1 //??3yTX FIFO??′??÷.·¢é??£ê???ó?
#define FLUSH_RX 0xE2 //??3yRX FIFO??′??÷.?óê??£ê???ó?
#define REUSE_TX_PL 0xE3 //??D?ê1ó?é?ò?°üêy?Y,CE?a??,êy?Y°ü±?2???·¢?í.
#define NOP 0xFF //??2ù×÷,?éò?ó?à′?á×′ì???′??÷
//SPI(NRF24L01)??′??÷μ??·
#define CONFIG 0x00 //??????′??÷μ??·;bit0:1?óê??£ê?,0·¢é??£ê?;bit1:μ?????;bit2:CRC?£ê?;bit3:CRCê1?ü;
//bit4:?D??MAX_RT(′?μ?×?′ó??·¢′?êy?D??)ê1?ü;bit5:?D??TX_DSê1?ü;bit6:?D??RX_DRê1?ü
#define EN_AA 0x01 //ê1?ü×??ˉó|′e1|?ü bit0~5,??ó|í¨μà0~5
#define EN_RXADDR 0x02 //?óê?μ??·?êDí,bit0~5,??ó|í¨μà0~5
#define SETUP_AW 0x03 //éè??μ??·?í?è(?ùóDêy?Yí¨μà):bit1,0:00,3×??ú;01,4×??ú;02,5×??ú;
#define SETUP_RETR 0x04 //?¨á¢×??ˉ??·¢;bit3:0,×??ˉ??·¢??êy?÷;bit7:4,×??ˉ??·¢?óê± 250*x+86us
#define RF_CH 0x05 //RFí¨μà,bit6:0,1¤×÷í¨μà?μ?ê;
#define RF_SETUP 0x06 //RF??′??÷;bit3:′?ê??ù?ê(0:1Mbps,1:2Mbps);bit2:1,·¢é?1|?ê;bit0:μí??éù·?′ó?÷??ò?
#define STATUS 0x07 //×′ì???′??÷;bit0:TX FIFO?ú±ê??;bit3:1,?óê?êy?Yí¨μào?(×?′ó:6);bit4,′?μ?×??à′???·¢
//bit5:êy?Y·¢?ííê3é?D??;bit6:?óê?êy?Y?D??;
#define MAX_TX 0x10 //′?μ?×?′ó·¢?í′?êy?D??
#define TX_OK 0x20 //TX·¢?ííê3é?D??
#define RX_OK 0x40 //?óê?μ?êy?Y?D??
#define OBSERVE_TX 0x08 //·¢?í?ì2a??′??÷,bit7:4,êy?Y°ü?aê§??êy?÷;bit3:0,??·¢??êy?÷
#define CD 0x09 //??2¨?ì2a??′??÷,bit0,??2¨?ì2a;
#define RX_ADDR_P0 0x0A //êy?Yí¨μà0?óê?μ??·,×?′ó3¤?è5??×??ú,μí×??ú?ú?°
#define RX_ADDR_P1 0x0B //êy?Yí¨μà1?óê?μ??·,×?′ó3¤?è5??×??ú,μí×??ú?ú?°
#define RX_ADDR_P2 0x0C //êy?Yí¨μà2?óê?μ??·,×?μí×??ú?ééè??,??×??ú,±?D?í?RX_ADDR_P1[39:8]?àμè;
#define RX_ADDR_P3 0x0D //êy?Yí¨μà3?óê?μ??·,×?μí×??ú?ééè??,??×??ú,±?D?í?RX_ADDR_P1[39:8]?àμè;
#define RX_ADDR_P4 0x0E //êy?Yí¨μà4?óê?μ??·,×?μí×??ú?ééè??,??×??ú,±?D?í?RX_ADDR_P1[39:8]?àμè;
#define RX_ADDR_P5 0x0F //êy?Yí¨μà5?óê?μ??·,×?μí×??ú?ééè??,??×??ú,±?D?í?RX_ADDR_P1[39:8]?àμè;
#define TX_ADDR 0x10 //·¢?íμ??·(μí×??ú?ú?°),ShockBurstTM?£ê???,RX_ADDR_P0ó?′?μ??·?àμè
#define RX_PW_P0 0x11 //?óê?êy?Yí¨μà0óDD§êy?Y?í?è(1~32×??ú),éè???a0?ò·?·¨
#define RX_PW_P1 0x12 //?óê?êy?Yí¨μà1óDD§êy?Y?í?è(1~32×??ú),éè???a0?ò·?·¨
#define RX_PW_P2 0x13 //?óê?êy?Yí¨μà2óDD§êy?Y?í?è(1~32×??ú),éè???a0?ò·?·¨
#define RX_PW_P3 0x14 //?óê?êy?Yí¨μà3óDD§êy?Y?í?è(1~32×??ú),éè???a0?ò·?·¨
#define RX_PW_P4 0x15 //?óê?êy?Yí¨μà4óDD§êy?Y?í?è(1~32×??ú),éè???a0?ò·?·¨
#define RX_PW_P5 0x16 //?óê?êy?Yí¨μà5óDD§êy?Y?í?è(1~32×??ú),éè???a0?ò·?·¨
#define NRF_FIFO_STATUS 0x17 //FIFO×′ì???′??÷;bit0,RX FIFO??′??÷??±ê??;bit1,RX FIFO?ú±ê??;bit2,3,±£á?
//bit4,TX FIFO??±ê??;bit5,TX FIFO?ú±ê??;bit6,1,?-?··¢?íé?ò?êy?Y°ü.0,2??-?·;
//
//24L012ù×÷??
//#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????D?o?
//#define NRF24L01_CSN PGout(7) //SPI????D?o?
//#define NRF24L01_IRQ PGin(6) //IRQ?÷?úêy?Yê?è?
//24L01·¢?í?óê?êy?Y?í?è?¨ò?
#define TX_ADR_WIDTH 5 //5×??úμ?μ??·?í?è
#define RX_ADR_WIDTH 5 //5×??úμ?μ??·?í?è
#define TX_PLOAD_WIDTH 32 //32×??úμ?ó??§êy?Y?í?è
#define RX_PLOAD_WIDTH 32 //32×??úμ?ó??§êy?Y?í?è
void NRF24L01_Init(void);//3?ê??ˉ
void NRF24L01_RX_Mode(void);//?????a?óê??£ê?
void NRF24L01_TX_Mode(void);//?????a·¢?í?£ê?
u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 u8s);//D′êy?Y??
u8 NRF24L01_Read_Buf(u8 reg, u8 *pBuf, u8 u8s);//?áêy?Y??
u8 NRF24L01_Read_Reg(u8 reg); //?á??′??÷
u8 NRF24L01_Write_Reg(u8 reg, u8 value);//D′??′??÷
u8 NRF24L01_Check(void);//?ì2é24L01ê?·?′??ú
u8 NRF24L01_TxPacket(u8 *txbuf);//·¢?íò???°üμ?êy?Y
//u8 NRF24L01_RxPacket(u8 *rxbuf);//?óê?ò???°üμ?êy?Y
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