/* * 函数名: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; //没收到任何数据 } }
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(); //进入接收模式 }
/*=====================================================================================================*/ static u8 NRF_Check( void ) { u8 i; u8 buf[5] = {0}; NRF_WriteBuf(CMD_W_REG | NRF_TX_ADDR, TX_ADDRESS, 5); NRF_ReadBuf(CMD_R_REG | NRF_TX_ADDR, buf, 5); for(i=0; i<5; i++) if(buf[i]!=TX_ADDRESS[i]) return ERROR; return SUCCESS; }
/*=====================================================================================================*/ u8 NRF_Check( void ) { u8 i; u8 SendBuf[5] = {0xc2, 0xb5, 0x81, 0xd0, 0xa9}; u8 RecvBuf[5] = {0}; NRF_WriteBuf(CMD_W_REG | NRF_TX_ADDR, SendBuf, 5); NRF_ReadBuf(CMD_R_REG | NRF_TX_ADDR, RecvBuf, 5); for(i=0; i<5; i++) if(RecvBuf[i]!=SendBuf[i]) return ERROR; return SUCCESS; }
//判断SPI接口是否接入NRF芯片是否可用 uint8_t NRF24L01_Check(void) { uint8_t buf[5] = {0xC2,0xC2,0xC2,0xC2,0xC2}; uint8_t buf1[5] = {0}; uint8_t i; NRF_WriteBuf(NRF_WRITE_REG + TX_ADDR, buf, 5); NRF_ReadBuf(TX_ADDR, buf1, 5); for (i=0;i<5;i++) { if (buf1[i]!=0xC2) break; } if (i==5) {printf("NRF24L01 is working...\r\n");return 1 ;} //MCU 与NRF 成功连接 else {printf("NRF24L01 wrong...\r\n");return 0 ;} //MCU与NRF不正常连接 }
/* * 函数名:NRF_Check * 描述 :主要用于NRF与MCU是否正常连接 * 输入 :无 * 输出 :SUCCESS/ERROR 连接正常/连接失败 * 调用 :外部调用 */ u8 NRF_Check(void) { #define NRF_CHECH_DATA 0xC2 u8 buf[5]={NRF_CHECH_DATA,NRF_CHECH_DATA,NRF_CHECH_DATA,NRF_CHECH_DATA,NRF_CHECH_DATA}; u8 buf1[5]; u8 i; /*写入5个字节的地址. */ NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,buf,5); /*读出写入的地址 */ NRF_ReadBuf(TX_ADDR,buf1,5); /*比较*/ for(i=0;i<5;i++) { if(buf1[i] != NRF_CHECH_DATA) { return 0 ; //MCU与NRF不正常连接 } } return 1 ; //MCU与NRF成功连接 }
/*=====================================================================================================*/ static void NRF_RxData( u8 *RxBuf ) { NRF_ReadBuf(CMD_R_RX_PLOAD, RxBuf, NRF_RX_PL_WIDTH); NRF_FlushRxFIFO(); }