u8 xNRF_TxPacket(void *txbuf,u8 len,void *rxbuf,u8* rxlen) // { u8 sta; NRF_Write_Buf(WR_TX_PLOAD,txbuf,len);//写数据到TX FIFO NRF_CE=1; //启动发送 while(NRF_IRQ == 1); //等待发送完成 sta=NRF_Read_Reg(STATUS); //读取状态寄存器的值 NRF_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除 TX_DS或MAX_RT 中断标志 if(sta&MAX_TX) //达到最大重发次数 { NRF_Write_Reg(FLUSH_TX,0xff);//清除 TX FIFO 寄存器 return MAX_TX; } if(sta&RX_OK) //收到应答数据包 { *rxlen = NRF_Read_Reg(R_RX_PL_WID); NRF_Read_Buf(RD_RX_PLOAD,rxbuf,*rxlen);//读取数据 NRF_Write_Reg(FLUSH_RX,0xff);//清除 RX FIFO 寄存器 ??? return RX_OK; } if(sta&TX_OK)//发送完成 { return TX_OK; } return 0;//其他原因发送失败 }
void Nrf_Check_Event(void) { u8 sta = NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS); //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// if(sta & (1<<RX_DR)) { u8 rx_len = NRF_Read_Reg(R_RX_PL_WID); if(rx_len<33) { NRF_Read_Buf(RD_RX_PLOAD,NRF24L01_RXDATA,rx_len);// read receive payload from RX_FIFO buffer LED2_ON Data_Receive_Anl(NRF24L01_RXDATA,rx_len); Nrf_Erro = 0; } else { NRF_Write_Reg(FLUSH_RX,0xff);//Çå¿Õ»º³åÇø } } else { Nrf_Erro ++; if(Nrf_Erro>2000) //³¬¹ý1sδ½ÓÊÕnrfÊý¾Ý £¬ÉÏËø { Nrf_Erro = 0; Rc_C.ARMED = 0; } } //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// if(sta & (1<<TX_DS)) { //LED1_ONOFF(); } //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// if(sta & (1<<MAX_RT)) { if(sta & 0x01) //TX FIFO FULL { NRF_Write_Reg(FLUSH_TX,0xff); } } //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// NRF_Write_Reg(NRF_WRITE_REG + NRFRegSTATUS, sta); }
//接受数据时放入新数据包 u8 xNRF_RxPacket(void *rxbuf,u8* rxlen,void *txbuf,u8 txlen) { u8 sta; sta=NRF_Read_Reg(STATUS); //读取状态寄存器的值 NRF_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除 TX_DS 或MAX_RT 中断标志 if(sta&RX_OK)//接收到数据 { *rxlen = NRF_Read_Reg(R_RX_PL_WID); NRF_Read_Buf(RD_RX_PLOAD,rxbuf,*rxlen);//读取数据 NRF_Write_Reg(FLUSH_RX,0xff);//清除 RX FIFO 寄存器 NRF_Write_Buf(W_ACK_PAYLOAD,txbuf,txlen); //写入应答时携带的数据包 return 0; } return 1;//没收到任何数据 }
//查询中断 void Nrf_Irq(void) { uint8_t sta = NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS); if(sta & (1<<RX_DR))//接收轮训标志位 { NRF_Read_Buf(RD_RX_PLOAD,NRF24L01_RXDATA,RX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer ReceiveDataFormNRF(); //自己做修改 } NRF_Write_Reg(0x27, sta);//清除nrf的中断标志位 }
void Nrf_Check_Event(void) //将2401接收到的数据返回串口 { u8 sta = NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS); //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// if(sta & (1<<RX_DR))//接收中断 { u8 rx_len = NRF_Read_Reg(R_RX_PL_WID); //2401寄存器,值为0x60 if(rx_len<33) { NRF_Read_Buf(RD_RX_PLOAD,NRF24L01_RXDATA,rx_len);// read receive payload from RX_FIFO buffer Uart1_Send_Buf(NRF24L01_RXDATA,rx_len); } else { NRF_Write_Reg(FLUSH_RX,0xff);//清空缓冲区 } } //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// if(sta & (1<<TX_DS))//发送中断 { //PC_Debug_Show(1,2); } //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// if(sta & (1<<MAX_RT))//应该是缓存溢出中断 { static u16 max_cnt = 0; max_cnt++; PC_Debug_Show(7,max_cnt); if(sta & 0x01) //TX FIFO FULL { NRF_Write_Reg(FLUSH_TX,0xff); } } //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// NRF_Write_Reg(NRF_WRITE_REG + NRFRegSTATUS, sta);//??nrf?????? }
void Nrf_Check_Event(void) { u8 sta = NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS); //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// if(sta & (1<<RX_DR)) { u8 rx_len = NRF_Read_Reg(R_RX_PL_WID); if(rx_len<33) { NRF_Read_Buf(RD_RX_PLOAD,NRF24L01_RXDATA,rx_len);// read receive payload from RX_FIFO buffer //LED1_ONOFF(); Data_Receive_Anl(NRF24L01_RXDATA,rx_len); } else { NRF_Write_Reg(FLUSH_RX,0xff);//Çå¿Õ»º³åÇø } } //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// if(sta & (1<<TX_DS)) { Ledx_ONOFF(1); } //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// if(sta & (1<<MAX_RT)) { if(1)//sta & 0x01) //TX FIFO FULL { NRF_Write_Reg(FLUSH_TX,0); } } //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// NRF_Write_Reg(NRF_WRITE_REG + NRFRegSTATUS, sta); }
u8 NRF_RxPacket(void *rxbuf) //成功接收数据返回0 { u8 sta; sta=NRF_Read_Reg(STATUS); //读取状态寄存器的值 NRF_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除 TX_DS 或MAX_RT 中断标志 if(sta&RX_OK)//接收到数据 { NRF_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据 NRF_Write_Reg(FLUSH_RX,0xff);//清除 RX FIFO 寄存器 return 0; } return 1;//没收到任何数据 }
//接收函数 u8 NRF24L01_RxPacket(u8 *rxbuf) { u8 sta; //SPI2_SetSpeed(SPI_SPEED_4); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz) sta=NRF_Read_Reg(NRFRegSTATUS); //读取状态寄存器的值 NRF_Write_Reg(NRF_WRITE_REG+NRFRegSTATUS,sta); //清除TX_DS或MAX_RT中断标志 if(sta&RX_OK)//接收到数据 { NRF_Write_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据 NRF_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器 return 0; } return 1;//没收到任何数据 }
/*======================================================================*/ void NRF_IRQ(void) { uint8_t sta = NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS); if(sta & (1<<RX_DR))//接收中断 { } if(sta & (1<<TX_DS))//发送完成并接收到应答信号中断 { NRF_Write_Reg(0x27, 0xff);//清除nrf的中断标志位 } if(sta & (1<<MAX_RT))//达到最大重发次数中断 { NRF_Write_Reg(0x27, 0xff);//清除nrf的中断标志位 } }
u8 NRF_TxPacket(void *txbuf) { u8 sta; NRF_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF 32 个字节 while(NRF_IRQ == 1); //等待发送完成 sta=NRF_Read_Reg(STATUS); //读取状态寄存器的值 NRF_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除 TX_DS 或MAX_RT 中断标志 if(sta&TX_OK)//发送完成 { return TX_OK; } if(sta&MAX_TX) //达到最大重发次数 { NRF_Write_Reg(FLUSH_TX,0xff);//清除 TX FIFO 寄存器 return MAX_TX; } return 0xff;//其他原因发送失败 }
void NRFmatching(void) { static uint32_t nTs,nT; static uint32_t writeOvertime = 2 * 1000000;// unit :us LedC_on; //led3 always on when 2.4G matching nTs = micros(); do { NRFMatched = 0; nT = micros() - nTs; if(nT >= writeOvertime){ RX_ADDRESS[4] = table.NRFaddr[4]; break; //exit when time out,and do not change original address } SetRX_Mode(); // reset RX mode write RX panel address delay_ms(4); // delay is needed after reset NRF sta = NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS); if((sta & 0x0E )== 0x00){ NRFMatched = 1; }else{ RX_ADDRESS[4] ++; //search the next RX_ADDRESS if(RX_ADDRESS[4] == 0xff ){ RX_ADDRESS[4] = 0x00; } } }while((sta & 0x0E )== 0x0E); SetRX_Mode(); // reset RX mode if((NRFMatched == 1)&&(RX_ADDRESS[4]!= table.NRFaddr[4])){ SaveParamsToEEPROM(); //write eeprom when current addr != original addr } LedC_off; // matching end }
u8 Nrf_Get_FIFOSta(void) { return NRF_Read_Reg(NRF_READ_REG + FIFO_STATUS); }
u8 Nrf_Get_Sta(void) { return NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS); }