分享NRF24L01簡單驅動,51程序,STM32程序都有,還有各種相關的非常詳細的資料,下面一起來看看吧:
這兩種都測試過了.jpg (87.08 KB, 下載次數: 148)
下載附件
2017-5-23 15:39 上傳
0.png (64.71 KB, 下載次數: 121)
下載附件
2017-5-23 16:34 上傳
NRF24L01中文說明書手冊:
nRF24L01P(新版無線模塊控制IC).PDF
nRF24L01中文說明書.pdf
NRF24L01功能使用文檔.pdf
RF產品設計經驗.pdf
安信可2.4G模塊選型及使用詳解.pdf
NRF24L01引腳圖:
0.png (43.45 KB, 下載次數: 141)
下載附件
2017-5-23 16:42 上傳
NRF24L01簡介:
0.png (129.61 KB, 下載次數: 131)
下載附件
2017-5-23 16:40 上傳
NRF24L01參數:
0.png (135.2 KB, 下載次數: 134)
下載附件
2017-5-23 16:41 上傳
NRF24L01結構方框圖:
0.png (77.82 KB, 下載次數: 128)
下載附件
2017-5-23 16:42 上傳
NRF24L01引腳功能:
0.png (106.66 KB, 下載次數: 123)
下載附件
2017-5-23 16:42 上傳
單片機源程序如下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)
2017-5-23 15:38 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|