/* * 函数名:NRF_Tx_Dat * 描述 :用于向NRF的发送缓冲区中写入数据 * 输入 :txBuf:存储了将要发送的数据的数组,外部定义 * 输出 :发送结果,成功返回TXDS,失败返回MAXRT或ERROR * 调用 :外部调用 */ u8 NRF_Tx_Dat(u8 *txbuf) { u8 state; /*ce为低,进入待机模式1*/ NRF_CE_LOW(); /*写数据到TX BUF 最大 32个字节*/ SPI_NRF_WriteBuf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH); /*CE为高,txbuf非空,发送数据包 */ NRF_CE_HIGH(); /*等待发送完成中断 */ while(NRF_Read_IRQ()!=0); /*读取状态寄存器的值 */ state = SPI_NRF_ReadReg(STATUS); /*清除TX_DS或MAX_RT中断标志*/ SPI_NRF_WriteReg(NRF_WRITE_REG+STATUS,state); SPI_NRF_WriteReg(FLUSH_TX,NOP); //清除TX FIFO寄存器 /*判断中断类型*/ if(state&MAX_RT) //达到最大重发次数 return MAX_RT; else if(state&TX_DS) //发送完成 return TX_DS; else return ERROR; //其他原因发送失败 }
/** * @brief 用于从NRF的接收缓冲区中读出数据 * @param * @arg rxBuf :用于接收该数据的数组,外部定义 * @retval * @arg 接收结果 */ u8 NRF_Rx_Dat(u8 *rxbuf) { u8 state; u16 link_count=0; NRF_CE_HIGH(); //进入接收状态 /*等待接收中断*/ while(NRF_Read_IRQ()!=0) { link_count ++; if(link_count == 5000) //5000为最大重连次数 return ERROR; } NRF_CE_LOW(); //进入待机状态 /*读取status寄存器的值 */ state=SPI_NRF_ReadReg(STATUS); /* 清除中断标志*/ SPI_NRF_WriteReg(NRF_WRITE_REG+STATUS,state); /*判断是否接收到数据*/ if(state&RX_DR) //接收到数据 { SPI_NRF_ReadBuf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据 SPI_NRF_WriteReg(FLUSH_RX,NOP); //清除RX FIFO寄存器 return RX_DR; } else return ERROR; //没收到任何数据 }
/* * 函数名:NRF_RX_Mode * 描述 :配置并进入接收模式 * 输入 :无 * 输出 :无 * 调用 :外部调用 */ void NRF_RX_Mode(void) { NRF_CE_LOW(); SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址 SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答 SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址 SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL); //设置RF通信频率 SPI_NRF_WriteReg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度 SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启 SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG, 0x0f); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式 /*CE拉高,进入接收模式*/ NRF_CE_HIGH(); }
/* * 函数名:NRF_TX_Mode * 描述 :配置发送模式 * 输入 :无 * 输出 :无 * 调用 :外部调用 */ void NRF_TX_Mode(void) { NRF_CE_LOW(); SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //写TX节点地址 SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答 SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址 SPI_NRF_WriteReg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次 SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL); //设置RF通道为CHANAL SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启 SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG,0x0e); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,发射模式,开启所有中断 /*CE拉高,进入发送模式*/ NRF_CE_HIGH(); Delay(0xffff); //CE要拉高一段时间才进入发送模式 }