nRF24L01无线介绍

news/2024/11/15 19:52:32/

引脚功能

CE:RX或TX模式选择
CSN:SPI片选信号
SCK:SPI时钟
MOSI:SPI数据输入
MISO:SPI数据输出
IRQ:可屏蔽中断脚

时序
51测试程序
实测可用!

#define TX_ADR_WIDTH    5
#define RX_ADR_WIDTH    5
#define TX_PLOAD_WIDTH  32
#define RX_PLOAD_WIDTH  32#define MAX_TX  	0x10	//达到最大发送次数中断
#define TX_OK   	0x20	//TX发送完成中断
#define RX_OK   	0x40	//接收到数据中断const uchar TX_ADDRESS[TX_ADR_WIDTH]={0xEE,0xDD,0xCC,0xBB,0xAA};	//发送地址
const uchar RX_ADDRESS[RX_ADR_WIDTH]={0xAA,0xBB,0xCC,0xDD,0xEE};sbit CE   = P2^7;
sbit CSN  = P2^6;
sbit MISO = P2^3;
sbit MOSI = P2^4;
sbit SCK  = P2^5;
sbit IRQ  = P2^2;sbit LED=P1^0;void delay_us(uchar num)
{uchar i; for(i=0;i>num;i++)_nop_();
}void delay(uint t)
{uchar k;while(t--)for(k=0;k<200;k++);
}uchar SPI_RW(uchar byte)
{uchar bit_ctr;for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit{MOSI = (byte & 0x80); // output 'byte', MSB to MOSIbyte = (byte << 1); // shift next bit into MSB..SCK = 1; // Set SCK high..byte |= MISO; // capture current MISO bitSCK = 0; // ..then set SCK low again}return(byte); // return read byte
}uchar SPI_Write_Reg(uchar reg, uchar value)
{uchar status;CSN = 0; // CSN low, init SPI transactionstatus = SPI_RW(reg); // select registerSPI_RW(value); // ..and write value to it..CSN = 1; // CSN high againreturn(status); // return nRF24L01 status byte
}uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
{uchar status,byte_ctr;CSN = 0; // Set CSN low, init SPI tranactionstatus = SPI_RW(reg); // Select register to write tofor(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // then write allSPI_RW(*pBuf++);CSN = 1; // Set CSN high againreturn(status); // return nRF24L01 status byte
}void RX_Mode_Init(void)
{CE=0;SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);SPI_Write_Reg(WRITE_REG + EN_AA, 0x01); // Enable Auto.Ack:Pipe0SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x01); // Enable Pipe0SPI_Write_Reg(WRITE_REG + RF_CH, 0);SPI_Write_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0f);SPI_Write_Reg(WRITE_REG + CONFIG, 0x0f); // Set PWR_UP bit, enableCE = 1; // Set CE pin high to enable RX device
}uchar SPI_Read_Reg(uchar reg)
{uchar reg_val;CSN = 0; // CSN low, initialize SPI communicationSPI_RW(reg); // Select register to read from..reg_val = SPI_RW(0); // ..then read registervalueCSN = 1; // CSN high, terminate SPI communicationreturn(reg_val); // return register value
}uchar NRF24L01_TxPacket(uchar *txbuf)
{uchar state;CE=0;SPI_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH); //写数据到TX_BUFCE=1;while(IRQ==1); //等待发送完成LED = ~LED;state=SPI_Read_Reg(STATUS);  SPI_Write_Reg(WRITE_REG+STATUS,state); //清除中断标志TX_DS或MAX_RTif(state&MAX_TX) //达到最多重发中断{SPI_Write_Reg(FLUSH_TX,0xff); //清除TX FIFO寄存器return MAX_TX; }if(state&TX_OK) //发送完成{return TX_OK;}return 0xff; //发送失败
}void Send_Buf(uchar *buf)
{CE=0;SPI_Write_Reg(WRITE_REG+CONFIG,0x0e);CE=1;delay_us(15);NRF24L01_TxPacket(buf);CE=0;SPI_Write_Reg(WRITE_REG+CONFIG, 0x0f);CE=1;	
}int main()
{uchar buf[TX_PLOAD_WIDTH];RX_Mode_Init();buf[0]=2; //无线串口模块需要第一位标识长度(忽略)buf[1]=0xaa;buf[2]=0x55;while(1){Send_Buf(buf);delay(1000);}
}

模块不能自发自收

TX_ADDR和RX_ADDR_P0地址可以相同。但是TX_ADDR是目标板地址,RX_ADDR_P0是本模块地址。只有收发地址配置正确才能收发成功

最主要是RX_Mode_Init中寄存器的配置:
RF_CH,射频通道频率。收发必须一致(F0= 2400 + RF_CH [MHz])
RF_SETUP,射频寄存器。数据传输速率、发射功率、低噪声放大增益,收发必须一致
CRCO,校验方式。收发必须一致


http://www.ppmy.cn/news/284341.html

相关文章

深入理解深度学习——注意力机制(Attention Mechanism):Bahdanau注意力

分类目录&#xff1a;《深入理解深度学习》总目录 之前我们探讨了机器翻译问题&#xff1a; 通过设计一个基于两个循环神经网络的编码器—解码器架构&#xff0c; 用于序列到序列学习。 具体来说&#xff0c;循环神经网络编码器将长度可变的序列转换为固定形状的上下文变量&…

TP-LINK TL-WR740N 升级系统 总结

今天把家里的TP-LINK路由器型号TL-WR740N升级了下其固件&#xff0c;本来家里的网络就经常会掉&#xff0c;昨晚又一直掉&#xff0c;小米盒子论坛说该路由器可能和新小米盒子有点问题&#xff08;关于最近小米盒子连接WIFI后其他设备无法上网的说明&#xff09;&#xff0c;那…

不同IP网段连接网络打印机

帮朋友买了个网络打印机&#xff0c;昨天打印机到了&#xff0c;他对电脑不是很懂&#xff0c;所以一定要我来帮忙设置。本来这个东西没什么复杂的&#xff0c;打印机机直接接到路由器上或交换机上&#xff0c;然后电脑端加驱动就行了&#xff0c;电脑一般会自动找到网络打印机…

详解NRF24L01无线收发模块

近日有粉丝朋友留言&#xff0c;希望介绍一下nRF24L01这款无线收发芯片&#xff0c;正巧前不久的电赛有些涉及&#xff0c;因此将自己的一些经验写在这里&#xff0c;希望能有所收获。 前面我们介绍过单片机的几种通信协议&#xff0c;并且初步了解如何操作寄存器进而控制芯片的…

STM32无线通信——nRF24L01通信模块

不同型号STM32的无线通信——基于一样的nRF24L01芯片模块 在此声明一下全部代码均不允许转发以及在商业上的行为等,—Mannix声明。 本次讲解主要内容 1、实验目的 2、实验硬件 3、芯片模块原理 4、实验代码 S T M 32 F 103 通 用 代 码 STM32F103通用代码 STM32F103通用代码 (…

TP-LINK WR847N

今天买了一个TP-LINK WR847N, 想照着 《山东大学H3C校园网无线路由开wifi》 http://www.cnblogs.com/buer1209/p/3370309.html 去刷一下机&#xff0c;结果发现TP-LINK WR847N 还没有 现在的841N好&#xff0c;实在不忍心刷841N了

移植TP-LINK TL-WN721N 驱动到micro2440(by liukun321咕唧咕唧)

内核版本&#xff1a;linux-3.1.4 我先把 无线网卡&#xff08;TP-LINK TL-WN721N&#xff09;插到了我的PC上 用 lsusb 命令打印无线网卡ID &#xff1a;Bus 001 Device 003: ID 148f:5370 Ralink Technology, Corp. 照着这个ID百度搜一下你的无线网卡的芯片组&#xff0c;…

nrf24l01+无线发送

经过dt的两天睡不好&#xff0c;玩不好的日子&#xff0c;终于把nrf24l01这个看着dt&#xff0c;做起来也dt的东西搞定了。幸亏有一点好的&#xff0c;就是资料还算是多的。看了两天的资料&#xff0c;调试了两天后终于在这个阳光明媚的下午实验成功。这两天可是一句dota都没有…