NRF24L01參考程序(包含多個(gè)實(shí)例)_第1頁
NRF24L01參考程序(包含多個(gè)實(shí)例)_第2頁
NRF24L01參考程序(包含多個(gè)實(shí)例)_第3頁
NRF24L01參考程序(包含多個(gè)實(shí)例)_第4頁
NRF24L01參考程序(包含多個(gè)實(shí)例)_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、(相關(guān)人員如覺得本人水平低下,還請(qǐng)見諒) Nrf24L01的使用程序和使用方法和簡(jiǎn)單操作:功能:無線對(duì)發(fā)程序。兩個(gè)模塊a, b,實(shí)現(xiàn)按下一個(gè)按鍵,會(huì)在對(duì)方的數(shù)碼管上顯示3或4,在本機(jī)上顯示1,2。當(dāng)一個(gè)模塊,比如 a模塊。當(dāng)兩個(gè)按鍵按下其中一個(gè),則會(huì)在另一個(gè)模塊b上顯示數(shù)字3,4(具體根據(jù)按下哪個(gè)按鍵)。以上功能描述,B模塊按鍵按下,如同 a模塊一樣的功能,不 做系統(tǒng)性描述了。下面給出程序中幾個(gè)地方的解釋:#defi ne READ_REG0x00/讀寄存器指令#defi ne WRITE_REG0x20/與寄存器扌曰令#defi ne RD_RX_PLOAD0x61/讀取接收數(shù)據(jù)指令#def

2、i ne WR_TX_PLOAD0xA0/寫待發(fā)數(shù)據(jù)指令#defi ne FLUSH_TX0xE1沖洗發(fā)送FIFO指令#defi ne FLUSH_RX0xE2/沖洗接收FIFO指令#defi ne REUSE_TX_PL0xE3/定義重復(fù)裝載數(shù)據(jù)指令#defi ne NOP0xFF/保留類似這種的描述,可以等同于READ_REG =0x00;這個(gè)是經(jīng)過實(shí)際程序測(cè)試出來的,比如以下程序:#in clude<reg51.h> #defi ne k 0xfe void mai n()P1=k;則會(huì)出現(xiàn)此類結(jié)果:MOSI = (uchar & 0x80); uchar = (uc

3、har << 1); SCK = 1; uchar |= MISO;/ output 'uchar', MSB to MOSI/ shift next bit into MSB. / Set SCK high./ capture current MISO bitSCK = 0;此處為 spi 的核心,是 spi 協(xié)議的編程,其中 uchar |= MISO; 表示 uchar |= MISO | uchar;MOSI = (uchar & 0x80);其中0x80是1000 0000,與上uchar,這種& ,是按位與,故可以 從 uchar 提取出

4、一個(gè)電平給 mosi。MOSI = (uchar & 0x80);/ output 'uchar', MSB to MOSIuchar = (uchar << 1);這兩句組合起來用,就實(shí)現(xiàn)了把uchar編程8位2進(jìn)制數(shù)后的每一位都可以發(fā)送給mosi;Uchar 的只待對(duì)象,就是上面的諸如 #define FLUSH_TX0xE1這樣的數(shù),或者是相關(guān)的發(fā)送數(shù)據(jù)。*pBuf 這個(gè)并不是一個(gè)主要的問題,實(shí)際這個(gè)是涉及指針問題的,帶*的跟地址有關(guān)系,但是我們其實(shí)不需要很關(guān)心編譯的時(shí)候數(shù)據(jù)被具體存入哪個(gè)地址,即使是很重要的數(shù)據(jù)。void init_NRF24L01(

5、void)inerDelay_us(100);CE=0;/ chip enableCSN=1;/ Spi disableSCK=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_RW_Reg(WRITE_REG + EN_AA, 0x01);/ 頻道 0自動(dòng) ACK 應(yīng)答 允許SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01

6、);/ 允許接收地址只有頻道 0,如果需要多頻道可以參考 Page21SPI_RW_Reg(WRITE_REG + RF_CH, 0);/設(shè)置信道工作為 2.4GHZ,收發(fā)必須一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); / 設(shè)置接收數(shù)據(jù)長(zhǎng)度, 本次設(shè)置為 32 字節(jié)SPI_RW_Reg(WRITE_REG + RF_SETUP , 0x07);/設(shè)置發(fā)射速率為 1MHZ,發(fā)射功率為最大值 0dB 在整個(gè)初始化中我們看到:CE=0;/ chip enableCSN=1;/ Spi disable這是設(shè)置整個(gè)的狀態(tài)。如過狀態(tài)設(shè)置成待機(jī),則

7、引腳可能變?yōu)楦咦琛?(以上并非全部引腳)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); / 寫接收端地址 類似以上兩句,這是應(yīng)用 spi 的子程序,將寄存器指令放入 nrf24l01 。如果需深究,請(qǐng)參考 說明書,手冊(cè)等。 或者可以通過 #define READ_REG 0x00 / 讀 寄 存 器指 令 等 了解大概流程。在整個(gè)無線通信過程中,初始化只需設(shè)置一次。TxBuf

8、 存放的是發(fā)送的數(shù)據(jù)。并且此數(shù)據(jù)被發(fā)送時(shí),是將這個(gè)數(shù)組的數(shù)全部發(fā)送的。對(duì)方 也全部接收。RxBuf 接收數(shù)組,用于存放對(duì)方發(fā)來的數(shù)據(jù)。SetRX_Mode(); nRF24L01_RxPacket(RxBuf); 當(dāng)主程序中包含這兩個(gè)子函數(shù)時(shí), 且這時(shí)某個(gè)數(shù)據(jù)被發(fā)送過來, 則會(huì)被接收到。 且被存放到 了 RxBuf ;反之包含 nRF24L01_TxPacket(TxBuf); 且 TxBuf 已經(jīng)存入你想要的數(shù)據(jù)的時(shí)候, 這個(gè)數(shù)據(jù)將 被發(fā)送。程序部分:下面給出程序,由于收發(fā)雙方程序是完全一樣的,所以只粘貼一份。程序雖然不是自己寫的,但是經(jīng)過實(shí)際測(cè)試的,沒有任何詭異的問題。#include &

9、lt; reg52.h>#include < intrin s.h>typedef unsigned char uchar;typedef unsigned char uint;/*NRF24L01 端口定義 *sbit MISO=P1A3;sbit MOSI =P1A4;sbitSCKsbitCEsbitCSNsbitIRQ=P1A2;=P1A1;=P3A2;=P3A3;/*按鍵sbitKEY1=P 3A6;sbitKEY2=P 3A7;/*sbitled3=P2A0;數(shù)碼管位 選 *sbit led2=P2A1;sbit led1=P2A2;sbit led0=P2A3;

10、/*蜂明器sbitBELL=P 3A4;/*數(shù)碼管 0-9 編碼 *uchar seg10=0xC 0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF 8,0x80,0x90;/09 段碼/*NRF 24 L01*#define TX _ADR_WID TH/ 5 uints TX addr ess width#define RX _ADR _W IDTH/ 5 uints RX address width#define TX _PLOAD_WID TH20/ 20 uints TX payload#define RX _PLOAD_W IDTH20/ 20 uints T

11、X payloaduint const TX_ADD RESSTX _ADR _WIDTH= 0x34,0x43,0x10,0x10,0x01;/本地地址uint const RX_ADDR ESSRX _AD R_WIDTH= 0x34,0x43,0x10,0x10,0x01;/接收地址/*NRF24L01 寄存器指 令 */*SPI(nRF24L01) 寄存器地址 *#define CONF IG0x00/配置收發(fā)狀態(tài),CRC校驗(yàn)?zāi)J揭约笆瞻l(fā)狀態(tài)響應(yīng)方式#define EN _AA0x01/自動(dòng)應(yīng)答功 能設(shè)置#define EN _RXADDR0x02/ 可用信道設(shè)置#define SET

12、UP _AW0x03/ 收發(fā)地址 寬度設(shè) 置#define SETUP _RETR0x04/ 自動(dòng)重發(fā) 功能設(shè)置#define RF_CH0x05/ 工作頻 率設(shè)置#define RF_SETUP0x06/ 發(fā)射速 率、功耗 功能設(shè) 置#define STATU S0x07/ 狀態(tài)寄存 器#define OBSERV E_TX0x08/ 發(fā)送監(jiān)測(cè) 功能#define CD0x09 / 地址檢測(cè)#define READ_REG0x00/ 讀寄存器指令#define WR ITE_REG0x20/ 寫寄存器指令#define RD _RX_PLOAD0x61/ 讀取接收數(shù)據(jù)指令#define WR

13、 _TX_P LOAD0xA0/ 寫待發(fā)數(shù)據(jù)指令#define FLUSH_TX0xE1/ 沖洗發(fā)送FIFO 指令#define FLUSH_RX0xE2/ 沖洗接收FIFO 指令#define REUSE_TX_P L0xE3/ 定義重復(fù)裝載數(shù)據(jù) 指令#define NOP0xFF/ 保留P00x0A/ 頻道 0 接收數(shù)據(jù) 地址P10x0B/ 頻道 1 接收數(shù)據(jù) 地址P20x0C/ 頻道 2 接收 數(shù)據(jù)地 址P30x0D/ 頻道 3 接收 數(shù)據(jù)地 址P40x0E/ 頻道 4接收數(shù)據(jù) 地址P50x0F/ 頻道 5 接收 數(shù)據(jù)地 址#define RX _ADDR#define RX _ADDR

14、#define RX _ADDR#define RX _ADDR#define RX _ADDR#define RX _ADDR#define TX_ADDR0x10/ 發(fā)送地址寄存 器#define RX_PW_P00x11/ 接收頻道0 接 收數(shù)據(jù) 長(zhǎng)度#define RX_PW_P10x12/ 接收頻 道0 接收 數(shù)據(jù)長(zhǎng) 度#define RX_PW_P20x13/ 接收頻 道0 接收 數(shù)據(jù)長(zhǎng) 度#define RX_PW_P30x14/ 接收頻 道0 接收 數(shù)據(jù)長(zhǎng) 度#define RX_PW_P40x15/ 接收頻 道0 接收 數(shù)據(jù)長(zhǎng) 度#define RX_PW_P50x16/ 接

15、收頻 道0 接收 數(shù)據(jù)長(zhǎng) 度#define FIF O_STA TUS0x17/ FIFO 棧入棧出狀態(tài) 寄存器 設(shè)置void Del ay(un signed int s);void i nerDelay_u s(unsigned char n);void i nit_NRF 24L01(void);uint SPI_RW(uint uch ar);uchar SPI_Re ad(uchar reg);void SetR X_M ode(void);uint SPI_RW _Reg(u char reg, uchar value);uint SPI_Re ad_Buf(uchar re g,

16、 uchar *p Buf, uchar uchars);uint SPI_Write_Buf(uch ar reg, uchar *pBuf, uchar uchars);unsigned char nRF 24L01_RxP acket(unsigned char* rx_b uf);void n RF24L01_TxP acket(unsigned char * t x_buf);/* 長(zhǎng)延時(shí) *void Del ay(un signed int s)unsigned int i;for(i=0; i<s; i +);for(i=0; i<s; i +);uint bdata

17、 sta;/狀態(tài)標(biāo)志sbitRX_DR=staA6;sbitTX_DS=staA5;sbitMAX_RT=staA4;/*延時(shí)函數(shù)void i nerDelay_u s(unsigned char n)for(;n>0;n-)_nop_();/*NRF 24L01 初始化void init_NRF 24L01(void)inerDel ay_us(100);CE= 0;/ chip enableCSN=1;/ Spi disableSCK=0; /SPI_Write_Buf(WR ITE_REG + TX_ADDR , TX_ADDR ESS, TX_ADR_W IDTH); / 寫本地

18、地 址SPI_Write_Buf(WR ITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR _WIDTH); / 寫接收端地 址SPI_RW _Reg(WRITE_R EG + EN _AA , 0x01);/ 頻道 0 自動(dòng)ACK 應(yīng)答允許SPI_RW _Reg(WRITE_R EG + EN_RXADDR, 0x01);/ 允許接收 地址只有頻道 0,如果需要多頻道可以參考 Page21SPI_RW _Reg(WRITE_R EG + RF_CH, 0);/ 設(shè)置信道工 作為 2.4GHZ ,收發(fā)必 須一致SPI_RW _Re g(WRITE_R EG + R

19、X _PW_P 0, RX _PLOAD_WID TH); /設(shè)置接收數(shù) 據(jù)長(zhǎng)度, 本次設(shè) 置為 32字節(jié)SPI_RW _Re g(WRITE_R EG + RF_SETUP , 0x07);/設(shè)置發(fā)射速率 為 1MHZ ,發(fā)射功率為 最大值 0dB/* 函數(shù):uint SPI_R W(uint uch ar)/* 功能:NRF 24L01 的 SPI 寫時(shí)序uint SPI_RW(uint uch ar)uint bit _ctr;for(bit_ctr= 0;bit _ctr<8;bit _ctr+) / / output 8-bitMOSI = (uch ar & 0x80

20、);uchar = (uc har << 1);SCK = 1;uchar |= MISO;SCK = 0;return(uc har);/ output 'uchar', MSB to MOS I/ shift next bit int o MSB./ Set SCK high./ capture current M ISO bit/ .then set SCK low again/ retur n read ucharSPI_RW(val ue);/ .and write value to it.SPI_RW(val ue);/ .and write value

21、 to it./* 函數(shù): uchar SPI_Re ad(uchar reg)/*功能: NRF 24L01 的 SPI 時(shí)序uchar SPI_Re ad(uchar reg)uchar reg_val;CSN = 0;/ CSN low, initialize SPI communic ation.SPI_RW(re g);/ Select register to read from.reg_val = SP I_RW(0);/ .then read re gisterv alueCSN = 1;/ CSN high, terminate SPI commu nicationreturn

22、(reg_val); / return register value/*功能: NRF 24L01 讀寫寄存器函 數(shù)uint SPI_RW _Reg(u char reg, uchar value)uint status;CSN = 0;/ CSN low, init SPI tran sactionstatus = SPI_RW(re g);/ select registerSPI_RW(val ue);/ .and write value to it.CSN = 1;/ CSN high againreturn(statu s); / return nRF 24L01 stat us uc

23、har/* 函數(shù): uint SPI_Re ad_Buf(uchar re g, uchar *p Buf, uchar u chars)/*功能:用于讀數(shù)據(jù),reg:為寄存器地 址,pBuf :為待讀出 數(shù)據(jù)地址,uchars讀出數(shù)據(jù)的 個(gè)數(shù)uint SPI_Re ad_Buf(uchar re g, uchar *p Buf, uchar uchars)uint status,uchar_ctr;CSN = 0;/ Set CSN low, init SPI tranacti onstatus = SPI_RW(re g);/ Select register to write to and

24、 read status ucharfor(uchar_ctr= 0;uchar_ctr<uch ars;uchar_ctr+ +)pBufuchar_ctr = SPI_RW( 0);/CSN = 1;return(statu s);/ return nRF 24L01 status uchar/*函數(shù): uint SPI_Write _Buf(uchar reg, uchar *p Buf, uchar uchars)/*功能:用于寫數(shù)據(jù):為寄存器地址,pBuf :為待寫入數(shù)據(jù)地址,uchars :寫入數(shù)據(jù)的個(gè)數(shù)uint SPI_Write_Buf(uch ar reg, uchar

25、 *pBuf, uc har uchars)uint status,uchar_ctr;CSN = 0;/SPI 使能status = SPI_RW(re g);for(uchar_ctr= 0; uchar _ctr<uchar s; uchar_ctr+) /SPI_RW(*pBuf+);CSN = 1;/關(guān)閉 SPIreturn(statu s);/*函數(shù): void SetRX _Mode(void)/*功能:數(shù)據(jù) 接收配 置void SetRX_M ode(void)CE= 0;SPI_RW _Reg(WRITE_R EG + CONF IG, 0x0f);/ IR Q收發(fā)完成

26、中斷響應(yīng),16位CRC,主接收CE = 1;inerDel ay_u s(130);/* 函數(shù): unsigned char nRF 24L01_R xPacket(unsigned char* r x_buf)/*功能:數(shù)據(jù) 讀取后 放如 rx_buf 接收緩沖 區(qū)中unsigned char nRF 24L01_RxP acket(unsigned char* rx_b uf)unsigned char revale=0;sta=SPI_Read(S TA TUS); / 讀取狀態(tài)寄 存其來判斷數(shù) 據(jù)接收 狀況if(RX_DR) / 判斷是否接 收到數(shù) 據(jù)CE = 0; /SPI 使能SP

27、I_Read _Buf(RD _RX _PLOAD,rx_b uf,TX _PLOAD_WID TH);/ re ad r eceive payload fr om RX _FIFO buffer revale =1;/讀取數(shù)據(jù)完成標(biāo) 志SPI_RW _Re g(WRITE_R EG+S TATUS,sta);/接收到數(shù)據(jù) 后 RX_DR ,TX _D S,MAX _PT 都置高為 1,通 過寫 1來清楚中斷標(biāo)志return revale;/*函數(shù): void nRF 24L01_TxP ack et(unsigned char * t x_b uf)/* 功能:發(fā)送 tx_buf 中數(shù)據(jù)vo

28、id n RF24L01_TxP acket(unsigned char * t x_buf)CE= 0; /StandBy I 模式SPI_Write_Buf(WR ITE_REG + R X_A DDR _P0, TX_ADDR ESS, TX_ADR _WIDTH); / 裝載接收端 地址SPI_Write_Buf(WR _TX_P LOAD, tx_buf , TX_P LOAD _WIDTH); / 裝載數(shù)據(jù)SP_RW _Reg(WRITE_R EG + CONFIG, 0x0e);/ IRQ 收發(fā)完成 中斷響應(yīng),16位 CRC,主發(fā)送CE=1;/置高CE,激發(fā)數(shù)據(jù)發(fā) 送inerDelay_us(10);主函數(shù) */*void mai n(void)unsigned char tf = 0;/unsigned char TxBuf

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論