/* * 函数名:NRF_Rx_Dat * 描述 :用于从NRF的接收缓冲区中读出数据 * 输入 :rxBuf:用于接收该数据的数组,外部定义 * 输出 :接收结果, * 调用 :外部调用 */ u8 NRF_Rx_Dat(u8 *rxbuf) { u8 state; if( nrf_mode != RX_MODE) { NRF_RX_Mode(); } NRF_CE_HIGH(); //进入接收状态 /*等待接收中断*/ while(NRF_Read_IRQ()!=0); NRF_CE_LOW(); //进入待机状态 /*读取status寄存器的值 */ state=NRF_ReadReg(STATUS); /* 清除中断标志*/ NRF_WriteReg(NRF_WRITE_REG+STATUS,state); /*判断是否接收到数据*/ if(state & RX_DR) //接收到数据 { NRF_ReadBuf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据 NRF_WriteReg(FLUSH_RX,NOP); //清除RX FIFO寄存器 return RX_DR; } else { return ERROR; //没收到任何数据 } }
//传输一次,数据最长为 32字节 static u8 NRF_TX_Dat_Once(u8 *txbuf) { u8 state; /*ce为低,进入待机模式1*/ NRF_CE_LOW(); /*写数据到TX BUF 最大 32个字节*/ NRF_WriteBuf(WR_TX_PLOAD,txbuf,MAX_ONCE_TX_NUM); /*CE为高,txbuf非空,发送数据包 */ NRF_CE_HIGH(); /*等待发送完成中断 */ while(NRF_Read_IRQ()!=0); /*读取状态寄存器的值 */ state = NRF_ReadReg(STATUS); /*清除TX_DS或MAX_RT中断标志*/ NRF_WriteReg(NRF_WRITE_REG+STATUS,state); NRF_WriteReg(FLUSH_TX,NOP); //清除TX FIFO寄存器 /*判断中断类型*/ return state; }
//由中断服务函数调用 void NRF_ISR_Tx_Handler(void) { if(isr_addr == NULL) { return; //无效 } //检测发送结果 isr_state = NRF_ReadReg(STATUS); /*读取状态寄存器的值 */ NRF_WriteReg(NRF_WRITE_REG+STATUS,isr_state); /*清除TX_DS或MAX_RT中断标志*/ NRF_WriteReg(FLUSH_TX,NOP); //清除TX FIFO寄存器 if( (!(isr_state & TX_DS) ) || (isr_L==0) ) //如果发送不成功,或者已经发送完成,则结束 { isr_addr = NULL; //通过判断 isr_addr 就知道是否发送完毕。 isr_L = 0; //isr_L就不一定了 return; //通过 isr_state 判断状态 } //还没发送完成,就继续发送 isr_addr += MAX_ONCE_TX_NUM; //指向下一个地址 NRF_ISR_Tx_Dat_Once(); }
uint8_t NRF24L01_RxPacket(uint8_t *rxbuf) { uint8_t sta;//spi速度为9Mhz(24L01的最大SPI时钟为10Mhz) sta= NRF_ReadReg(NRFRegSTATUS);//读取状态寄存器的值 NRF_WriteReg(NRF_WRITE_REG+NRFRegSTATUS, sta);//清除TX_DS或MAX_RT中断标志 if (sta & RX_OK) { NRF_ReadBuf(RD_RX_PLOAD, rxbuf, RX_PLOAD_WIDTH);//读取数据 NRF_WriteReg(FLUSH_RX, 0xff);//清除RX FIFO寄存器 return 1; } return 0;//没收到任何数据 }
//由中断服务函数调用 void NRF_ISR_Rx_Handler(void) { u8 state; NRF_CE_LOW(); //进入待机状态 /*读取status寄存器的值 */ state=NRF_ReadReg(STATUS); /* 清除中断标志*/ NRF_WriteReg(NRF_WRITE_REG+STATUS,state); if(re_flag == QUEUE_FULL) //满了就直接清FIFO,退出 { NRF_WriteReg(FLUSH_RX,NOP); //清除RX FIFO寄存器 NRF_CE_HIGH(); //进入接收模式 return; //接收队列满了,不进行处理 } //还没满,则继续接收 /*判断是否接收到数据*/ if(state & RX_DR) //接收到数据 { NRF_ReadBuf(RD_RX_PLOAD,(u8 *)&(RX_ISR_FIFO[rear]),RX_PLOAD_WIDTH); //读取数据 NRF_WriteReg(FLUSH_RX,NOP); //清除RX FIFO寄存器 rear++; if(rear >= RX_ISR_FIFO_PACKET) { rear=0; //重头开始 } if(rear == front) //追到屁股了,满了 { re_flag = QUEUE_FULL; } else { re_flag = QUEUE_NORMAL; } } else { //没收到任何数据 } NRF_CE_HIGH(); //进入接收模式 }
/*=====================================================================================================*/ u8 NRF_RxPacket( u8 *RxBuf ) { u8 Status; NRF_CE = 1; while(NRF_IRQ!=0); NRF_CE = 0; Status = NRF_ReadReg(CMD_R_REG | NRF_STATUS); NRF_WriteReg(CMD_W_REG | NRF_STATUS, Status); if(Status&NRF_STA_RX_DR) { NRF_RxData(RxBuf); return NRF_STA_RX_DR; } else return ERROR; }
/*=====================================================================================================*/ u8 NRF_TxPacket( u8 *TxBuf ) { u8 Status; NRF_TxData(TxBuf); while(NRF_IRQ!=0); Status = NRF_ReadReg(CMD_R_REG | NRF_STATUS); NRF_WriteReg(CMD_W_REG | NRF_STATUS, Status); NRF_FlushTxFIFO(); if(Status&NRF_STA_MAX_RT) return NRF_STA_MAX_RT; else if(Status&NRF_STA_TX_DS) return NRF_STA_TX_DS; else return ERROR; }
/** * @brief Enable of disable interrupt masks. * @note * @param Pointer to nRF24L01P_Object * @param Interrupt mask, can be combination of @ref NRF_InterruptMask. * @param NewState. ENABLE of DISABLE * @retval STATUS register in nRF24L01P. */ uint8_t NRF_INT_MASK_Cmd(nRF24L01P_Object* nrf, uint8_t NRF_InterruptMask, FunctionalState NewState) { uint8_t config; //Content of NRF_CONFIG register /* Parameter check */ assert_param(IS_NRF_INT_MASK(NRF_InterruptMask)); /* Read original NRF_CONFIG register */ config = NRF_ReadReg(nrf, NRF_CONFIG); /* Compute the new value */ if(NewState == ENABLE) config = config | NRF_InterruptMask; else config = config & ~NRF_InterruptMask; /* Write new value into NRF_CONFIG register */ return NRF_WriteReg(nrf, NRF_CONFIG, config); }
uint8_t NRF_PowerDown(nRF24L01P_Object* nrf) { uint8_t config; config = NRF_ReadReg(nrf, NRF_CONFIG) & (~NRF_PWR_UP); return NRF_WriteReg(nrf, NRF_CONFIG, config); }