NRF2401收发一套程序只需要修改参数即可实现收发功能。
单片机源程序如下:
- #include "NRF24L01.h"
- xdata u8 TxAddr[5] = {0x01,0x10,0x34,0x43,0x20}; //发送地址
- xdata u8 RxAddr[5] = {0x01,0x10,0x34,0x43,0x20}; //接收地址
- void NRF_IO_Init(void)
- {
- SCK = 0;
- }
- u8 NRF_SPI_RW(u8 byte)
- {
- u8 i = 0;
- for(i=0;i<8;i++)
- {
- MOSI = (byte&0x80);
- byte <<= 1;
- SCK = 1;
- byte|=MISO;
- SCK=0;
- }
-
- return byte;
- }
- void NRF_WriteReg(u8 regaddr,u8 regval)
- {
- CSN = 0;
- NRF_SPI_RW(regaddr+W_REG);
- NRF_SPI_RW(regval);
- CSN = 1;
- }
- u8 NRF_ReadReg(u8 regaddr)
- {
- CSN = 0;
- NRF_SPI_RW(regaddr+R_REG);
- regaddr = NRF_SPI_RW(NOP);
- CSN = 1;
- return regaddr;
- }
- void NRF_WriteBytes(u8 regaddr,u8*nrfaddr,u8 len)
- {
- u8 i = 0;
- CSN = 0;
- NRF_SPI_RW(regaddr+W_REG);
- for(i = 0;i<len;i++)
- {
- NRF_SPI_RW(nrfaddr[i]);
- }
- CSN = 1;
- }
- void NRF_ReadBytes(u8 regaddr,u8*nrfaddr,u8 len)
- {
- u8 i = 0;
- CSN = 0;
- NRF_SPI_RW(regaddr+R_REG);
- for(i = 0;i<len;i++)
- {
- nrfaddr[i] = NRF_SPI_RW(NOP);
- }
- CSN = 1;
- }
- u8 NRF_CheckDev(void)
- {
- u8 i = 0;
- xdata u8 rbuf[5] = {0};
- NRF_WriteBytes(TX_ADDR,TxAddr,5);
- NRF_ReadBytes(TX_ADDR,rbuf,5);
- for(i=0;i<5;i++)
- {
- if(TxAddr[i]!=rbuf[i])
- {
- return 0xff;
- }
- }
- return 0x0;
- }
- void NRF_SendMode(void)
- {
- NRF_WriteBytes(TX_ADDR,TxAddr,5); //设置发送地址
- NRF_WriteReg(EN_AA,0x01); //允许P0自动应答
- NRF_WriteReg(EN_RXADDR,0x01); //P0接收
- NRF_WriteBytes(RX_ADDR_P0,RxAddr,5); //自动应答地址
- NRF_WriteReg(RF_CH,40); //频率
- NRF_WriteReg(RF_SETUP,0x07); //功率和速度
- NRF_WriteReg(CONFIG,0x0e); //发送模式
- }
- void NRF_RecvMode(void)
- {
- NRF_WriteReg(EN_RXADDR,0x01); //P0接收
- NRF_WriteBytes(RX_ADDR_P0,RxAddr,5); //接收地址
- NRF_WriteReg(EN_AA,0x01); //允许P0自动应答
- NRF_WriteReg(RF_CH,40); //频率
- NRF_WriteReg(RF_SETUP,0x07); //功率和速度
- NRF_WriteReg(RX_PW_P0,32); //数据有效宽度
- NRF_WriteReg(CONFIG,0x0f); //接收模式
- }
- //返回值 0 存在设备 1 设备有问题
- //参数 0 发送模式 1接收模式
- u8 NRF_CONFIG(u8 mode)
- {
-
- NRF_IO_Init();
- if(NRF_CheckDev()) //检测设备存在
- {
- return 0xff;
- }
-
- switch(mode)
- {
- case NRF_TX:NRF_SendMode();
- break; //发送
- case NRF_RX:NRF_RecvMode();
- break; //接收
-
- default: return 0xff;
- }
-
- return 0x00;
- }
- void NRF_SendData(u8 *sbuf,u8 len)
- {
- CE = 0;
- CSN = 0;
- if(len>32)len = 32; //限制最大32个字节
- NRF_SPI_RW(WR_TX_PLOAD); //发送fifo地址
- while(len--)
- {
- NRF_SPI_RW(*sbuf++);
- }
- CSN = 1;
- CE = 1;
- }
- void NRF_RecvData(u8 *sbuf,u8 len)
- {
- CSN = 0;
- if(len>32)len = 32; //限制最大32个字节
- NRF_SPI_RW(RD_RX_PLOAD);
- while(len--)
- {
- *sbuf=NRF_SPI_RW(NOP);
- sbuf++;
- }
- CSN = 1;
- }
- u8 NRF_TxOrRxPack(u8 mode,u8 *pbuf,u8 len,u8 timeout)
- {
- static xdata u16 cnt = 0;
- static xdata u8 SRMode = 0;
- u8 status = 0;
- if(++cnt>timeout)
- {
- cnt = 0;
- if(mode==NRF_TX) //发送模式
- {
- switch(SRMode)
- {
- case 0:NRF_SendData(pbuf,len);SRMode++;
- break;
- case 1:if(IRQ==0){
- status =NRF_ReadReg(STATUS);
- NRF_WriteReg(STATUS,status);
- if(status&MAX_TX)
- {
- NRF_WriteReg(FLUSH_TX,0xff);
- SRMode = 0;
- return MAX_TX; //达到最大重发次数
- }
- if(status&TX_OK)
- {
- SRMode = 0;
- return TX_OK; //成功
- }
- }
- break;
- default: SRMode = 0;
- }
- }
- if(mode==NRF_RX) //接收模式
- {
- status =NRF_ReadReg(STATUS);
- NRF_WriteReg(STATUS,status); //清除标志位
- if(status&RX_OK) //收到数据
- {
- NRF_RecvData(pbuf,len);
- NRF_WriteReg(FLUSH_RX,0xff);//收到数据将RX FIFO清空
- return RX_OK;
- }
- }
- }
-
- return 0xff; //其他错误
- }
复制代码
所有资料51hei提供下载:
NRF24L01(整理后).zip
(90.47 KB, 下载次数: 101)
|