void NRF24L01_INIT(void) { //这部分已经在SPI中初始化了 // GPIO_InitTypeDef GPIO_InitStructure; // RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); // //24L01的IO初始化 // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3; // // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; // GPIO_Init(GPIOA, &GPIO_InitStructure); // // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; // GPIO_Init(GPIOA, &GPIO_InitStructure); SPI_CE_L(); //StandBy I模式 SPI_CE_L(); NRF_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址 NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //写TX节点地址 NRF_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答 NRF_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址 NRF_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次 NRF_Write_Reg(NRF_WRITE_REG+RF_CH,40); //设置RF通道为CHANAL NRF_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度 NRF_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x26); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启 NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送 SPI_CE_H(); }
/* ***************************************************************** * 写数据包 ***************************************************************** */ void NRF_TxPacket(uint8_t * tx_buf, uint8_t len) { SPI_CE_L(); //StandBy I模式 NRF_Write_Buf(NRF_WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址 NRF_Write_Buf(WR_TX_PLOAD, tx_buf, len); // 装载数据 SPI_CE_H(); //置高CE,激发数据发送 }
/* 24L01初始化 model:24L01 模式 ch: 通道 */ void Nrf24l01_Init(u8 model, u8 ch) { #ifdef NRF24L01_SPI1 Nrf_Spi1_Init(); #elif defined NRF24L01_SPI2 Nrf_Spi2_Init(); #elif defined NRF24L01_SPI0 Nrf_Spi0_Init(); #else #error #endif SPI_CE_L(); NRF_Write_Buf(NRF_WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);//写RX节点地址 NRF_Write_Buf(NRF_WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); //写TX节点地址 NRF_Write_Reg(NRF_WRITE_REG + EN_AA, 0x01); //使能通道0的自动应答 NRF_Write_Reg(NRF_WRITE_REG + EN_RXADDR, 0x01); //使能通道0的接收地址 NRF_Write_Reg(NRF_WRITE_REG + SETUP_RETR, 0x1a); //设置自动重发间隔时间:500us;最大自动重发次数:10次 NRF_Write_Reg(NRF_WRITE_REG + RF_CH, ch); //设置RF通道为CHANAL NRF_Write_Reg(NRF_WRITE_REG + RF_SETUP, 0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启 //NRF_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x07); //设置TX发射参数,0db增益,1Mbps,低噪声增益开启 ///////////////////////////////////////////////////////// if (model == 1) //RX { NRF_Write_Reg(NRF_WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //选择通道0的有效数据宽度 NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断开启,16位CRC,主接收 } else if (model == 2) //TX { NRF_Write_Reg(NRF_WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //选择通道0的有效数据宽度 NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断开启,16位CRC,主发送 } else if (model == 3) //RX2 { NRF_Write_Reg(FLUSH_TX, 0xff); NRF_Write_Reg(FLUSH_RX, 0xff); NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断开启,16位CRC,主接收 Spi_RW(0x50); Spi_RW(0x73); NRF_Write_Reg(NRF_WRITE_REG + 0x1c, 0x01); NRF_Write_Reg(NRF_WRITE_REG + 0x1d, 0x07); } else if (model == 4) //TX2 { NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断开启,16位CRC,主发送 NRF_Write_Reg(FLUSH_TX, 0xff); NRF_Write_Reg(FLUSH_RX, 0xff); Spi_RW(0x50); Spi_RW(0x73); NRF_Write_Reg(NRF_WRITE_REG + 0x1c, 0x01); NRF_Write_Reg(NRF_WRITE_REG + 0x1d, 0x07); } SPI_CE_H(); }
//接收模式 void SetRX_Mode(void) { SPI_CE_L(); NRF_Write_Reg(FLUSH_RX,0xff);//清除TX FIFO寄存器 NRF_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(uint8_t*)RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址 NRF_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答 NRF_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址 NRF_Write_Reg(NRF_WRITE_REG+RF_CH,40); //设置RF通信频率 NRF_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度 NRF_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启 NRF_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式 SPI_CE_H(); printf("NRF24L01设为接收模式...\r\n"); }
//发送模式 void SetTX_Mode(void) { SPI_CE_L(); NRF_Write_Reg(FLUSH_TX,0xff); //清除TX FIFO寄存器 NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH); //写TX节点地址 NRF_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK NRF_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答 NRF_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址 NRF_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次 NRF_Write_Reg(NRF_WRITE_REG+RF_CH,40); //设置RF通道为40 NRF_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启 NRF_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断 SPI_CE_H(); }
void ReceiveData(void) { // if ( ES1 == 0 ) // { Reg1_L |= CE_L; //[0]: Active mode.[1]: Shut down mode (default). Reg1_L |= FASK_L; //[0]: ASK.[1]: FSK (default). SetRF(); //Delay1ms_CNT50US( 10 ); delay_ms(1); SPI_CE_H(); Reg1_L &= ~CE_L; //[0]: Active mode.[1]: Shut down mode (default). // Reg1_L |= FASK_L;//bFASK = ASK; //for ASK Mode, Promise AGC working SetRF(); //REN_1 = 1; // ES1 = 1; // start UART1 interrupt // } }
/* ***************************************************************** * 发送模式 ***************************************************************** */ void SetTX_Mode(void) { SPI_CE_L(); NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送 SPI_CE_H(); }
/****************************************************************** * 写数据包 ******************************************************************/ void NRF_TxPacket(uint8_t * tx_buf, uint8_t len) { SPI_CE_L(); //StandBy I模式 NRF_Write_Buf(WR_TX_PLOAD, tx_buf, len); // 装载数据 SPI_CE_H(); //置高CE,激发数据发送 }
void NRF_TxPacket_AP(uint8_t * tx_buf, uint8_t len) { SPI_CE_L(); //StandBy I模式 NRF_Write_Buf(0xa8, tx_buf, len); // 装载数据 SPI_CE_H(); //置高CE }