天线|RF射频
直播中

蔡彦壁

7年用户 248经验值
私信 关注
[问答]

如何调试nrf24l01+和nrf51822之间的通讯?


        用发烧友的MINI板。

这程序是中文的。可用于调试nrf24l01+和nrf51822之间的通讯

///////////////////////////////////////////////////////////////////////

另外要注意应答模式下:在地址和数据之间有9个bit的标志位(payload 6bit+pid 2bit+no_ack 1bit)

payload 6bit 表示字节数量

pid        2bit 表示数据重发的号码,每次自增1

no_ack  1bit 表示0为要应答,1为不要应答(发射机写0xB0寄存器用)

///////////////////////////////////////////////////////////////////////

//nrf24和nrf51822的地址关系如下

// 2401[add0 :add7] =PREFIX0[bit7:bit0](add7,add6,add5,add4,add3,add2,add1,add0)

// 2401[add8 :add15]=BASE0[bit31:bit24](add15,add14,add13,add12,add11,add10,add9,add8)

// 2401[add16:add23]=BASE0[bit23:bit16](add23,add22,add21,add20,add19,add18,add17,add16)

// 2401[add24:add31]=BASE0[bit15:bit8] (add31,add30,add29,add28,add27,add26,add25,add24)

// 2401[add32:add39]=BASE0[bit7 :bit0] (add39,add38,add37,add36,add35,add34,add33,add32)

////////////////////////////////////////////////////////////////////////////




//启动NRF24L01发送一次数据

//txbuf:待发送数据首地址

//返回值:发送完成状况

u8 NRF24L01_TxPacket(u8 *txbuf)//发射数据包

{

u8 sta;

  SPIx_SetSpeed(SPI_SPEED_8);        //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)   

NRF24L01_CE=0;                     //无线关闭

  NRF24L01_Write_Buf(0xA0,txbuf,32);//写发射缓存包TX BUF  32个字节

  NRF24L01_CE=1;//启动发送   

while(NRF24L01_IRQ!=0);//等待发送完成

sta=NRF24L01_Read_Reg(0x07);  //读取状态寄存器的值   

NRF24L01_Write_Reg(0x20+0x07,sta); //清除TX_DS或MAX_RT中断标志



if(sta&0x10)//bit4重发失败

{

  NRF24L01_Write_Reg(0xE1,0xff);//清除TX FIFO寄存器

  return 0; //重发失败

}

if(sta&0x20)//bit5发送完成

{

  return 1;//成功

}

return 0x00;//其他原因发送失败

}



//启动NRF24L01发送一次数据

//txbuf:待发送数据首地址

//返回值:0,接收完成;其他,错误代码

u8 NRF24L01_RxPacket(u8 *rxbuf)//接收数据包

{

u8 sta;               

SPIx_SetSpeed(SPI_SPEED_8); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)   

sta=NRF24L01_Read_Reg(0x07);  //读取状态寄存器的值    0000 1110(0x0E为没有数据)

NRF24L01_Write_Reg(0x20+0x07,sta); //清除TX_DS或MAX_RT中断标志

look[0]=sta;

if(sta&0x40)//bit6接收完成

{

  NRF24L01_Read_Buf(0x61,rxbuf,32);//读取数据字节长度

  NRF24L01_Write_Reg(0xe2,0xff);//清除RX FIFO寄存器

  

  return 1; //接收完成

}   

return 0;//接收失败

}     



        //该函数初始化NRF24L01到TX模式

//设置TX地址,写TX数据宽度,设置RX自动应答的地址,填充TX发送数据,选择RF频道,波特率和LNA HCURR

//PWR_UP,CRC使能

//当CE变高后,即进入RX模式,并可以接收数据了     

//CE为高大于10us,则启动发送.  

void TX_Mode(u8 MHz,u8 Longer,u8 ACK)//发射模式(频率,传输字节,应答11 1111)

{               

   NRF24L01_CE=0;//无线待机

////写地址

   NRF24L01_Write_Buf(0x20+0x10,(u8*)ADD0,5);//写TX发射地址只有地址0有发射功能

   NRF24L01_Write_Buf(0x20+0x0a,(u8*)ADD0,5); //地址0,主要为了接收ACK(应答信号)

////工作模式

    NRF24L01_Write_Reg(0x20+0x00,0x0E);    //发射模式WR_UP,EN_CRC,16BIT_CRC,

   NRF24L01_Write_Reg(0x20+0x01,ACK);     //应答设置0x3f代表543210应答

   NRF24L01_Write_Reg(0x20+0x02,0x3f);    //使能地址543210的接收

    NRF24L01_Write_Reg(0x20+0x03,0x03);     //地址长度5字节

   NRF24L01_Write_Reg(0x20+0x04,0xff);//设置自动重发间隔时间:4000us + 86us;最大自动重发次数:15次

   NRF24L01_Write_Reg(0x20+0x05,MHz);      //设置RF频率。24MHz+2400MHz=2424MHz



        ///////////////////////////////////////////////////////////////////////////////////////

   NRF24L01_Write_Reg(0x20+0x06,0x0F);  //TX,0db,2Mbps     (0000 1111)

//      NRF24L01_Write_Reg(0x20+0x06,0x27);  //TX,0db,250kbps   (0010 0111)

/////////////////////////////////////////////////////////////////////////////////////////

   NRF24L01_CE=1;//CE为高,10us后模块工作

}   



        //该函数初始化NRF24L01到RX模式

//设置RX地址,写RX数据宽度,选择RF频道,波特率和LNA HCURR

//当CE变高后,即进入RX模式,并可以接收数据了     

void RX_Mode(u8 MHz,u8 Longer,u8 ACK)//接收

{   

   NRF24L01_CE=0;                     //修改无线配置

    NRF24L01_Write_Reg(0x20+0x00,0x0F);//接收,PWR_UP,EN_CRC,16BIT_CRC,

    NRF24L01_Write_Reg(0x20+0x01,ACK); //应答设置0x3f代表543210应答

    NRF24L01_Write_Reg(0x20+0x02,0x3f);//接收通道使能0x3f代表543210通道接收

   NRF24L01_Write_Reg(0x20+0x03,0x03); //地址的字节长度

   NRF24L01_Write_Reg(0x20+0x05,MHz);  //设置RF通信频率  24MHz+2400MHz=2424MHz

///////////////////////////////////////////////////////////////////////////////

   NRF24L01_Write_Reg(0x20+0x06,0x0F); //TX,0db,2Mbps     (0000 1111)

//     NRF24L01_Write_Reg(0x20+0x06,0x27); //TX,0db,250kbps   (0011 0111)

////////////////////////////////////////////////////////////////////////////////

NRF24L01_Write_Buf(0X20+0X0a,(u8*)ADD0,5);//写RX0地址0

NRF24L01_Write_Buf(0X20+0X0b,(u8*)ADD1,5);//写RX1地址1

NRF24L01_Write_Buf(0X20+0X0c,(u8*)ADD2,1);//写RX2地址2

NRF24L01_Write_Buf(0X20+0X0d,(u8*)ADD3,1);//写RX3地址3

NRF24L01_Write_Buf(0X20+0X0e,(u8*)ADD4,1);//写RX4地址4

NRF24L01_Write_Buf(0X20+0X0f,(u8*)ADD5,1);//写RX5地址5

NRF24L01_Write_Buf(0X20+0X10,(u8*)ADD1,5);// 写TX地址



         NRF24L01_Write_Reg(0x20+0x11,Longer);//地址0每次传输数据的宽度32字节

NRF24L01_Write_Reg(0x20+0x12,Longer);//地址1每次传输数据的宽度32字节

NRF24L01_Write_Reg(0x20+0x13,Longer);//地址2每次传输数据的宽度32字节

NRF24L01_Write_Reg(0x20+0x14,Longer);//地址3每次传输数据的宽度32字节

NRF24L01_Write_Reg(0x20+0x15,Longer);//地址4每次传输数据的宽度32字节

NRF24L01_Write_Reg(0x20+0x16,Longer);//地址5每次传输数据的宽度32字节



         NRF24L01_CE = 1; //CE为高,nrf24开始工作



        

}      



        



nrf24L01+--6&1.rar (1.06 MB )

回帖(17)

刘辉

2020-6-16 13:48:30
置顶3天,大家互相交流学习下。
举报

程玲

2020-6-16 13:53:47
不错,谢谢分享,开源顶起
举报

李铃华

2020-6-16 14:04:24
nrf24L01的(payload 6bit+pid 2bit+no_ack 1bit)

对应nrf51822的2.4g无线(S0+LENGTH+S1)

        S0:1bit。意思是是否空1位

LENGTH:payload 6bit

        S1:pid 2bit+no_ack 1bit

所以nrf51822要设置S0=0;LENGTH=6;S1=3;
举报

黎锦荣

2020-6-16 14:11:21
不错,谢谢分享.
举报

更多回帖

发帖
×
20
完善资料,
赚取积分