用发烧友的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开始工作
}
更多回帖