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_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的中断标志位 }
u8 NRF_Check(void) { u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5}; u8 i; // SPI_SetSpeed(NRF_SPI,SPI_BaudRatePrescaler_8); //spi 速度为 9Mhz NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5);//写入 5 个字节的地址. NRF_Read_Buf(TX_ADDR,buf,5); //读出写入的地址 for(i=0;i<5;i++)if(buf[i]!=0XA5)break; if(i!=5)return 1; //检测 24L01 错误 return 0; //检测到 24L01 }
/* ***************************************************************** * 检测NRF是否正常,向nRF的写寄存器写入buf,然后读出来,如果nRF不正常,则无法读出或者读出数据不正确。 ***************************************************************** */ u8 NRF_CHECK(void) { u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5}; u8 i; NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5); buf[0] = 0; NRF_Read_Buf(TX_ADDR,buf,5); for(i=0;i<5;i++)if(buf[i]!=0XA5)break; if(i!=5)return 0; return 1; }
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;//没收到任何数据 }
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;//没收到任何数据 }
u8 Nrf24l01_Check(void) { u8 buf1[5]; u8 i; /*写入5个字节的地址. */ NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,5); /*读出写入的地址 */ NRF_Read_Buf(TX_ADDR,buf1,5); /*比较*/ for(i=0;i<5;i++) { if(buf1[i]!=TX_ADDRESS[i]) break; } if(i==5) return SUCCESS ; //MCU与NRF成功连接 else return ERROR ; //MCU与NRF不正常连接 }
uint8_t NRF_Check(void) { uint8_t buf1[5]; uint8_t i; /*写入5个字节的地址. */ NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,5); /*读出写入的地址 */ NRF_Read_Buf(TX_ADDR,buf1,5); /*比较*/ for(i=0;i<5;i++) { if(buf1[i]!=TX_ADDRESS[i]) break; } if(i==5) return 1; //MCU与NRF成功连接 else return 0; //MCU与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?????? }
//判断SPI接口是否接入NRF芯片是否可用 u8 NRF24L01_Check(void) { u8 buf[5]={0xC2,0xC2,0xC2,0xC2,0xC2}; u8 buf1[5]; u8 i=0; /*写入5 个字节的地址. */ NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5); /*读出写入的地址 */ NRF_Read_Buf(TX_ADDR,buf1,5); /*比较*/ for (i=0;i<5;i++) { if (buf1[i]!=0xC2) break; } if (i==5) {printf("初始化NRF24L01成功...\r\n");return 1 ;} //MCU 与NRF 成功连接 else {printf("初始化NRF24L01出错...\r\n");return 0 ;} //MCU与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); }