金牌会员
- 积分
- 1633
- 金钱
- 1633
- 注册时间
- 2012-8-28
- 在线时间
- 71 小时
|
<p>
用正点原子的MINI板。<br />
这程序是中文的。可用于调试nrf24l01+和nrf51822之间的通讯<br />
///////////////////////////////////////////////////////////////////////<br />
另外要注意<span style="color:#FFE500;background-color:#000000;">应答模式下</span>:在地址和数据之间有<span style="color:#FFE500;background-color:#000000;">9个bit</span>的标志位(payload 6bit+pid 2bit+no_ack 1bit)<br />
payload<span style="color:#00D5FF;background-color:#003399;"> <span style="color:#E53333;background-color:#000000;">6bit</span> <span style="background-color:#FFFFFF;"> </span><span><span style="background-color:#FFFFFF;"> </span><span style="background-color:#000000;"> </span></span><span style="background-color:#000000;"> 表示字节数量</span><br />
<span style="color:#FFFFFF;background-color:#FFFFFF;"> <span style="color:#000000;"> pid <span style="color:#E53333;background-color:#000000;">2bit</span> <span style="color:#00D5FF;background-color:#000000;">表示数据重发的号码,每次自增1</span></span></span><br />
<span style="color:#000000;background-color:#FFFFFF;">no_ack <span style="color:#E53333;background-color:#000000;">1bit</span> <span style="color:#00D5FF;background-color:#000000;">表示0为要应答,1为不要应答(发射机写0xB0寄存器用)</span></span><br />
<span style="color:#00D5FF;background-color:#000000;"><span style="color:#000000;background-color:#FFFFFF;">///////////////////////////////////////////////////////////////////////<br />
//nrf24和nrf51822的地址关系如下<br />
// 2401[add0 :add7] =PREFIX0[bit7:bit0](add7,add6,add5,add4,add3,add2,add1,add0)<br />
// 2401[add8 :add15]=BASE0[bit31:bit24](add15,add14,add13,add12,add11,add10,add9,add8)<br />
// 2401[add16:add23]=BASE0[bit23:bit16](add23,add22,add21,add20,add19,add18,add17,add16)<br />
// 2401[add24:add31]=BASE0[bit15:bit8] (add31,add30,add29,add28,add27,add26,add25,add24)<br />
// 2401[add32:add39]=BASE0[bit7 :bit0] (add39,add38,add37,add36,add35,add34,add33,add32)<br />
////////////////////////////////////////////////////////////////////////////</span></span><br />
</span><br />
//启动NRF24L01发送一次数据<br />
//txbuf:待发送数据首地址<br />
//返回值:发送完成状况<br />
u8 NRF24L01_TxPacket(u8 *txbuf)//发射数据包<br />
{<br />
u8 sta;<br />
SPIx_SetSpeed(SPI_SPEED_8); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz) <br />
NRF24L01_CE=0; //无线关闭<br />
NRF24L01_Write_Buf(0xA0,txbuf,32);//写发射缓存包TX BUF 32个字节<br />
NRF24L01_CE=1;//启动发送 <br />
while(NRF24L01_IRQ!=0);//等待发送完成<br />
sta=NRF24L01_Read_Reg(0x07); //读取状态寄存器的值 <br />
NRF24L01_Write_Reg(0x20+0x07,sta); //清除TX_DS或MAX_RT中断标志<br />
<br />
if(sta&0x10)//bit4重发失败<br />
{<br />
NRF24L01_Write_Reg(0xE1,0xff);//清除TX FIFO寄存器 <br />
return 0; //重发失败<br />
}<br />
if(sta&0x20)//bit5发送完成<br />
{<br />
return 1;//成功<br />
}<br />
return 0x00;//其他原因发送失败<br />
}<br />
<br />
//启动NRF24L01发送一次数据<br />
//txbuf:待发送数据首地址<br />
//返回值:0,接收完成;其他,错误代码<br />
u8 NRF24L01_RxPacket(u8 *rxbuf)//接收数据包<br />
{<br />
u8 sta; <br />
SPIx_SetSpeed(SPI_SPEED_8); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz) <br />
sta=NRF24L01_Read_Reg(0x07); //读取状态寄存器的值 0000 1110(0x0E为没有数据)<br />
NRF24L01_Write_Reg(0x20+0x07,sta); //清除TX_DS或MAX_RT中断标志<br />
look[0]=sta;<br />
if(sta&0x40)//bit6接收完成<br />
{<br />
NRF24L01_Read_Buf(0x61,rxbuf,32);//读取数据字节长度<br />
NRF24L01_Write_Reg(0xe2,0xff);//清除RX FIFO寄存器 <br />
<br />
return 1; //接收完成<br />
} <br />
return 0;//接收失败<br />
}
</p>
<p>
//该函数初始化NRF24L01到TX模式<br />
//设置TX地址,写TX数据宽度,设置RX自动应答的地址,填充TX发送数据,选择RF频道,波特率和LNA HCURR<br />
//PWR_UP,CRC使能<br />
//当CE变高后,即进入RX模式,并可以接收数据了 <br />
//CE为高大于10us,则启动发送. <br />
void TX_Mode(u8 MHz,u8 Longer,u8 ACK)//发射模式(频率,传输字节,应答11 1111)<br />
{ <br />
NRF24L01_CE=0;//无线待机<br />
////写地址<br />
NRF24L01_Write_Buf(0x20+0x10,(u8*)ADD0,5);//写TX发射地址只有地址0有发射功能 <br />
NRF24L01_Write_Buf(0x20+0x0a,(u8*)ADD0,5); //地址0,主要为了接收ACK(应答信号) <br />
////工作模式<br />
NRF24L01_Write_Reg(0x20+0x00,0x0E); //发射模式WR_UP,EN_CRC,16BIT_CRC,<br />
NRF24L01_Write_Reg(0x20+0x01,ACK); //应答设置0x3f代表543210应答<br />
NRF24L01_Write_Reg(0x20+0x02,0x3f); //使能地址543210的接收<br />
NRF24L01_Write_Reg(0x20+0x03,0x03); //地址长度5字节<br />
NRF24L01_Write_Reg(0x20+0x04,0xff);//设置自动重发间隔时间:4000us + 86us;最大自动重发次数:15次<br />
NRF24L01_Write_Reg(0x20+0x05,MHz); //设置RF频率。24MHz+2400MHz=2424MHz
</p>
<p>
///////////////////////////////////////////////////////////////////////////////////////<br />
NRF24L01_Write_Reg(0x20+0x06,0x0F); //TX,0db,2Mbps (0000 1111)<br />
// NRF24L01_Write_Reg(0x20+0x06,0x27); //TX,0db,250kbps (0010 0111)<br />
/////////////////////////////////////////////////////////////////////////////////////////<br />
NRF24L01_CE=1;//CE为高,10us后模块工作<br />
}
</p>
<p>
//该函数初始化NRF24L01到RX模式<br />
//设置RX地址,写RX数据宽度,选择RF频道,波特率和LNA HCURR<br />
//当CE变高后,即进入RX模式,并可以接收数据了 <br />
void RX_Mode(u8 MHz,u8 Longer,u8 ACK)//接收<br />
{ <br />
NRF24L01_CE=0; //修改无线配置 <br />
NRF24L01_Write_Reg(0x20+0x00,0x0F);//接收,PWR_UP,EN_CRC,16BIT_CRC,<br />
NRF24L01_Write_Reg(0x20+0x01,ACK); //应答设置0x3f代表543210应答<br />
NRF24L01_Write_Reg(0x20+0x02,0x3f);//接收通道使能0x3f代表543210通道接收<br />
NRF24L01_Write_Reg(0x20+0x03,0x03); //地址的字节长度<br />
NRF24L01_Write_Reg(0x20+0x05,MHz); //设置RF通信频率 24MHz+2400MHz=2424MHz<br />
///////////////////////////////////////////////////////////////////////////////<br />
NRF24L01_Write_Reg(0x20+0x06,0x0F); //TX,0db,2Mbps (0000 1111)<br />
// NRF24L01_Write_Reg(0x20+0x06,0x27); //TX,0db,250kbps (0011 0111)<br />
////////////////////////////////////////////////////////////////////////////////<br />
NRF24L01_Write_Buf(0X20+0X0a,(u8*)ADD0,5);//写RX0地址0<br />
NRF24L01_Write_Buf(0X20+0X0b,(u8*)ADD1,5);//写RX1地址1<br />
NRF24L01_Write_Buf(0X20+0X0c,(u8*)ADD2,1);//写RX2地址2<br />
NRF24L01_Write_Buf(0X20+0X0d,(u8*)ADD3,1);//写RX3地址3<br />
NRF24L01_Write_Buf(0X20+0X0e,(u8*)ADD4,1);//写RX4地址4<br />
NRF24L01_Write_Buf(0X20+0X0f,(u8*)ADD5,1);//写RX5地址5<br />
NRF24L01_Write_Buf(0X20+0X10,(u8*)ADD1,5);// 写TX地址
</p>
<p>
NRF24L01_Write_Reg(0x20+0x11,Longer);//地址0每次传输数据的宽度32字节<br />
NRF24L01_Write_Reg(0x20+0x12,Longer);//地址1每次传输数据的宽度32字节<br />
NRF24L01_Write_Reg(0x20+0x13,Longer);//地址2每次传输数据的宽度32字节<br />
NRF24L01_Write_Reg(0x20+0x14,Longer);//地址3每次传输数据的宽度32字节<br />
NRF24L01_Write_Reg(0x20+0x15,Longer);//地址4每次传输数据的宽度32字节<br />
NRF24L01_Write_Reg(0x20+0x16,Longer);//地址5每次传输数据的宽度32字节
</p>
<p>
NRF24L01_CE = 1; //CE为高,nrf24开始工作
</p>
<p>
<br />
}
</p>
<p>
<br />
</p> |
|