分享NRF24L01简单驱动,51程序,STM32程序都有,还有各种相关的非常详细的资料,下面一起来看看吧:
NRF24L01中文说明书手册:
nRF24L01P(新版无线模块控制IC).PDF
nRF24L01中文说明书.pdf
NRF24L01功能使用文档.pdf
RF产品设计经验.pdf
安信可2.4G模块选型及使用详解.pdf
NRF24L01引脚图:
NRF24L01简介:
NRF24L01参数:
NRF24L01结构方框图:
NRF24L01引脚功能:
单片机源程序如下LCD1602显示:
- /*NRF24L01+无线模块(和2.4G模块)测试 LCD1602 单位通道和多通道测试完成
- 和2.4G模块(两种)混合使用时,NRF24L01用于接收正常,NRF24L01相同配置下用于发送时接收不到应答
- 以下为个人理解(欢迎指正):
- 1,发送和接收模块要设置相同的发射频率(寄存器0x05),传输速率(寄存器0x06),CRC长度(寄存器0x00)
- 和自动应答(寄存器0x01)是否.
- 2,发送模块通道0的地址是应答时用的,要和发送地址(寄存器0xa0)是一样的,自动重发设置(寄存器0x04),
- 上电和设置为发送模式(寄存器0x00).
- 3,接收模块可以用任一通道接收,把要接收的通道地址(寄存器0x0a~0x0f)设置和发送模块的发送地址相
- 同即可,然后把用到的通道的应答(寄存器0x01)打开,通道接收(寄存器0x02)打开,设置通道有效位宽
- 度(寄存器0x11~0x16)(1次性接收的有效数据是多少个(可设0~32)),上电和设置为接收模式(寄存器0x00).
- 4.网上看到:使用靠后通道要把前面的通道一起配置,经测试可以直接使用第6个通道接收,前面5个通道不用
- 设置,但发送模式时,应答只能默认在通道0,接收模式通道随意使用.
- 5.由于条件有限,不好全部功其都测试,它设置可参考一起打包的中文使用手册,见谅*/
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit LCD_RS=P2^6; //LCD 数据/命令 端口
- sbit LCD_RW=P2^5; //LCD 读/写 端口
- sbit LCD_EN=P2^7; //LCD 使能 端口
- sbit LCD_BF=P0^7; //LCD 忙碌标志位
- sbit NRFT_IRQ =P1^0; //中断信号,无线通信过程中MCU主要是通过IRQ与NRF24L01进行通信
- sbit NRFT_MISO=P1^1; //芯片控制数据线(主入从出)
- sbit NRFT_MOSI=P1^2; //芯片控制数据线(主出从入)
- sbit NRFT_SCK =P1^3; //芯片控制的时钟线(SPI 时钟)
- sbit NRFT_CSN =P1^4; //芯片的片选线,CSN为低电平芯片工作
- sbit NRFT_CE =P1^5; //芯片的模式控制线.在CSN为低的情况下,
- //CE协同NRF24L01的CONFIG寄存器共同决定NRF24L01的状态
- sbit NRFR_IRQ =P3^7; //中断信号,无线通信过程中MCU主要是通过IRQ与NRF24L01进行通信
- sbit NRFR_MISO=P3^6; //芯片控制数据线(主入从出)
- sbit NRFR_MOSI=P3^5; //芯片控制数据线(主出从入)
- sbit NRFR_SCK =P3^4; //芯片控制的时钟线(SPI 时钟)
- sbit NRFR_CSN =P3^3; //芯片的片选线,CSN为低电平芯片工作
- sbit NRFR_CE =P3^2; //芯片的模式控制线.在CSN为低的情况下,
- //CE协同NRF24L01的CONFIG寄存器共同决定NRF24L01的状态
- sbit KEY_UPP=P2^1; //按键上
- sbit KEY_LOW=P2^2; //按键下
- sbit KEY_LEF=P2^3; //按键左
- sbit KEY_RIG=P2^4; //按键右
- sbit OK=P2^0; //程序测试位
- code uchar TAB[]="0123456789ABCDEF"; //lcd显示寄存器用的字符
- uchar TAB_RX_DAT[32]; //接收到的数据读到这
- code uchar TAB_TR_ADDR[]={0x0f,0x02,0x03,0x04,0x05}; //发送,接收及应答用的地址
- uchar num=7; //lcd要显示的寄存器
- void Delay(uint xms) //延时(12M晶振约1ms)
- {
- uint i;
- for(;xms>0;xms--)
- for(i=123;i>0;i--);
- }
- void LCD_Read_BF() //读lcd的忙碌标记位
- {
- uint i=10000;
- P0=0xff;
- LCD_RS=0;
- LCD_RW=1;
- LCD_EN=1;
- while((LCD_BF==1)&&(i-->0)); //i-->0;意思是如果读lcd忙碌标记错误,i从10000减至0也跳出
- LCD_EN=0;
- }
- void LCD_Write_DAT(uchar dat) //lcd写入数据
- {
- LCD_Read_BF();
- LCD_RS=1;
- LCD_RW=0;
- P0=dat;
- LCD_EN=1;
- LCD_EN=0;
- }
- void LCD_Write_CMD(uchar cmd) //lcd写入命令
- {
- LCD_Read_BF();
- LCD_RS=0;
- LCD_RW=0;
- P0=cmd;
- LCD_EN=1;
- LCD_EN=0;
- }
- void LCD_Init() //lcd初始化
- {
- LCD_RW=1;
- LCD_RS=0;
- LCD_EN=0;
- LCD_Write_CMD(0x38);
- LCD_Write_CMD(0x0c);
- LCD_Write_CMD(0x06);
- LCD_Write_CMD(0X01);
- }
- uchar SPIT_RW(uchar dat) //发送模块 SPI总线读写(NRF24L01接口)
- {
- uchar i,val;
- for(i=8;i>0;i--)
- {
- NRFT_MOSI=(bit)(dat&0x80);
- dat<<=1;
- NRFT_SCK=1;
- val<<=1;
- val|=NRFT_MISO;
- NRFT_SCK=0;
- }
- return val;
- }
- uchar NRFT_Read_REG(uchar reg) //发送模块 读寄存器1个数据
- {
- uchar val;
- NRFT_CSN=0;
- SPIT_RW(reg);
- val=SPIT_RW(0xff);
- NRFT_CSN=1;
- return val;
- }
- uchar NRFT_Write_REG(uchar reg,uchar dat) //发送模块 写1个数据到寄存器
- { //寄存器,要写入数据
- uchar val;
- NRFT_CSN=0;
- val=SPIT_RW(0x20|reg); //NRF写入配置寄存器时规定bit6=bit7=0,bit5=1,bit0-bit4为有效位
- SPIT_RW(dat);
- NRFT_CSN=1;
- return val;
- }
- uchar NRFT_Write_BUF(uchar reg,uchar *pBUF,uchar bytes)//发送模块 写入多个数据到寄存器
- { //寄存器,要写入数据的首地址,写入数据的数量
- uchar temp,i;
- NRFT_CSN=0;
- temp=SPIT_RW(reg|0x20); //NRF写入配置寄存器时规定bit6=bit7=0,bit5=1,bit0-bit4为有效位
- Delay(1);
- for(i=0;i<bytes;i++)
- SPIT_RW(*pBUF++);
- NRFT_CSN=1;
- return temp;
- }
- /*uchar NRFT_Read_BUF(uchar reg,uchar *pBUF,uchar bytes)//读出发送模块的多个数据(读出收到的数据)
- {
- uchar temp,i;
- NRFT_CSN=0;
- temp=SPIT_RW(reg);
- Delay(1);
- for(i=0;i<bytes;i++)
- *pBUF++=SPIT_RW(0xff);
- NRFT_CSN=1;
- return temp;
- }*/
- uchar SPIR_RW(uchar dat) //接收模块 SPI总线读写(NRF24L01接口)
- {
- uchar i,val;
- for(i=8;i>0;i--)
- {
- NRFR_MOSI=(bit)(dat&0x80);
- dat<<=1;
- NRFR_SCK=1;
- val<<=1;
- val|=NRFR_MISO;
- NRFR_SCK=0;
- }
- return val;
- }
- uchar NRFR_Read_REG(uchar reg) //接收模块 读寄存器1个数据
- {
- uchar val;
- NRFR_CSN=0;
- SPIR_RW(reg);
- val=SPIR_RW(0xff);
- NRFR_CSN=1;
- return val;
- }
- uchar NRFR_Write_REG(uchar reg,uchar dat) //接收模块 写1个数据到寄存器
- {
- uchar val;
- NRFR_CSN=0;
- val=SPIR_RW(0x20|reg); //NRF写入配置寄存器时规定bit6=bit7=0,bit5=1,bit0-bit4为有效位
- SPIR_RW(dat);
- NRFR_CSN=1;
- return val;
- }
- uchar NRFR_Write_BUF(uchar reg,uchar *pBUF,uchar bytes)//接收模块 写入多个数据到寄存器
- { //寄存器,要写入数据的首地址,写入数据的数量
- uchar temp,i;
- NRFR_CSN=0;
- temp=SPIR_RW(reg|0x20); //NRF写入配置寄存器时规定bit6=bit7=0,bit5=1,bit0-bit4为有效位
- Delay(1);
- for(i=0;i<bytes;i++)
- SPIR_RW(*pBUF++);
- NRFR_CSN=1;
- return temp;
- }
- uchar NRFR_Read_BUF(uchar reg,uchar *pBUF,uchar bytes)//接收模块 读出的多个数据(读出收到的数据)
- { //寄存器,读出数据存放的首地址,写入数据的数量
- uchar temp,i;
- NRFR_CSN=0;
- temp=SPIR_RW(reg);
- Delay(1);
- for(i=0;i<bytes;i++)
- *pBUF++=SPIR_RW(0xff);
- NRFR_CSN=1;
- return temp;
- }
- void NRFT_Init() //NRF24L01发送模块初始化
- {
- code uchar NRFT_TX_DAT[]={"abcdefghijklmnopABCDEFGHIJKLMNOP"};//要发送出去的数据
- NRFT_CE=0; //关模块(无论是发送还是接收)
- NRFT_CSN=1; //SPI通信的片选使能
- NRFT_SCK=0; //SPI通信的时钟(这里选择空闲时为低电平)
- NRFT_IRQ=1; //NRF模块的中断输出端(中断发生输出低电平)
- NRFT_Write_BUF(0x10,TAB_TR_ADDR,0x05); //发送地址(接收模块通道地址)
- NRFT_Write_BUF(0x0a,TAB_TR_ADDR,0x05); //数据通道0接收地址(发送模块总是用通道0作为答)
- NRFT_Write_BUF(0xa0,NRFT_TX_DAT,32); //写入要发送的数据(1-32字节,用于发送模式)
- NRFT_Write_REG(0x01,0x01); //自动应答使能(发送模块总是用通道0作为答)
- NRFT_Write_REG(0x02,0x01); //接收地址允许(发送模块的通道1要接收应答信号)
- NRFT_Write_REG(0x04,0x12); //建立自动重发(高4位自动重发间隔时间,低4位重发次数)
- NRFT_Write_REG(0x05,40); //射频通道(频率[0-127])(Fo=(2400+RF_CH)*MHz)
- NRFT_Write_REG(0x06,0x07); //射频设置
- NRFT_Write_REG(0x00,0x0e); //配置为上电,发送模式
- NRFT_CE=1; //使能模块接收或者发送
- }
- void NRFR_Init() //NRF24L01接收模块初始化
- {
- code uchar TAB_P1_ADDR[]={0x0b,0x02,0x03,0x04,0x05};
- //通道5的前4字节地址和通道1共用,用通道5也要设置通道1,用两地址不应相同
- NRFR_CE=0; //关模块(无论是发送还是接收)
- NRFR_CSN=1; //SPI通信的片选使能
- NRFR_SCK=0; //SPI通信的时钟(这里选择空闲时为低电平)
- NRFR_IRQ=1; //NRF模块的中断输出端(中断发生输出低电平)
- NRFR_Write_BUF(0x0b,TAB_P1_ADDR,0x05); //数据通道1接收地址(这里用通道1作为存放接收地址)
- NRFR_Write_REG(0x0f,TAB_TR_ADDR[0]); //数据通道5接收地址(只用1字节,共用通道1的4个高字节)
- NRFR_Write_REG(0x01,0X20); //自动应答使能 只开通道5(用哪个通道接收就用哪个通道应答)
- NRFR_Write_REG(0x02,0X20); //接收通道允许 只开通道5(b0-b5为接收通道0-5使能位)
- NRFR_Write_REG(0x05,40); //射频通道(频率)(频率[0-127])(Fo=(2400+RF_CH)*MHz)
- NRFR_Write_REG(0x06,0X07); //射频设置
- // NRFR_Write_REG(0x11,32); //通道0有效字节宽度(0-32)
- // NRFR_Write_REG(0x12,32); //通道1有效字节宽度(0-32)
- // NRFR_Write_REG(0x13,32); //通道2有效字节宽度(0-32)
- // NRFR_Write_REG(0x14,32); //通道3有效字节宽度(0-32)
- // NRFR_Write_REG(0x15,32); //通道4有效字节宽度(0-32)
- NRFR_Write_REG(0x16,32); //通道5有效字节宽度(0-32)
- NRFR_Write_REG(0x00,0X0f); //配置为上电,接收模式
- NRFR_CE=1; //使能模块接收或者发送
- }
- void Init() //初始化
- {
- Delay(100);
- LCD_Init();
- NRFR_Init();
- NRFT_Init();
- Delay(100);
- }
- uchar Keys(uchar dat) //按键
- {
- if(KEY_UPP==0&&dat<0x1f) //修改要显示的寄存器
- {
- Delay(10);
- if(KEY_UPP==0)
- {
- dat++;
- while(!KEY_UPP);
- }
- }
- else if(KEY_LOW==0&&dat!=0) //修改要显示的寄存器
- {
- Delay(10);
- if(KEY_LOW==0)
- {
- dat--;
- while(!KEY_LOW);
- }
- }
- return dat;
- }
- void DIS_LCD() //显示
- {
- uchar temp;
- num=Keys(num); //修改要显示的寄存器
- LCD_Write_CMD(0x80); //在lcd1602的第一行开始写入
- LCD_Write_DAT(TAB[num>>4]);
- LCD_Write_DAT(TAB[num&0x0f]);
- LCD_Write_DAT(' ');
- LCD_Write_DAT('T');
- LCD_Write_DAT(':');
- temp=NRFT_Read_REG(num); //读发送模块的寄存器
- LCD_Write_DAT(TAB[temp>>4]);
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
NRF24L01无线模块.rar
(5.38 MB, 下载次数: 503)
|