




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Good is good, but better carries it.精益求精,善益求善。NRF24L01參考程序%28包含多個(gè)實(shí)例%29(相關(guān)人員如覺得本人水平低下,還請見諒)Nrf24L01的使用程序和使用方法和簡單操作:功能:無線對發(fā)程序。兩個(gè)模塊a,b,實(shí)現(xiàn)按下一個(gè)按鍵,會在對方的數(shù)碼管上顯示3或4,在本機(jī)上顯示1,2。當(dāng)一個(gè)模塊,比如a模塊。當(dāng)兩個(gè)按鍵按下其中一個(gè),則會在另一個(gè)模塊b上顯示數(shù)字3,4(具體根據(jù)按下哪個(gè)按鍵)。以上功能描述,B模塊按鍵按下,如同a模塊一樣的功能,不做系統(tǒng)性描述了。下面給出程序中幾個(gè)地方的解釋:#defineREAD_REG0 x00/讀寄存器指令#de
2、fineWRITE_REG0 x20/寫寄存器指令#defineRD_RX_PLOAD0 x61/讀取接收數(shù)據(jù)指令#defineWR_TX_PLOAD0 xA0/寫待發(fā)數(shù)據(jù)指令#defineFLUSH_TX0 xE1/沖洗發(fā)送FIFO指令#defineFLUSH_RX0 xE2/沖洗接收FIFO指令#defineREUSE_TX_PL0 xE3/定義重復(fù)裝載數(shù)據(jù)指令#defineNOP0 xFF/保留類似這種的描述,可以等同于READ_REG=0 x00;這個(gè)是經(jīng)過實(shí)際程序測試出來的,比如以下程序:#include#definek0 xfevoidmain()P1=k;則會出現(xiàn)此類結(jié)果:MOS
3、I=(uchar&0 x80);/outputuchar,MSBtoMOSIuchar=(uchar1);/shiftnextbitintoMSB.SCK=1;/SetSCKhigh.uchar|=MISO;/capturecurrentMISObitSCK=0;此處為spi的核心,是spi協(xié)議的編程,其中uchar|=MISO;表示uchar|=MISO|uchar;MOSI=(uchar&0 x80);其中0 x80是10000000,與上uchar,這種&,是按位與,故可以從uchar提取出一個(gè)電平給mosi。MOSI=(uchar&0 x80);/outputuchar,MSBtoMO
4、SIuchar=(uchar1);這兩句組合起來用,就實(shí)現(xiàn)了把uchar編程8位2進(jìn)制數(shù)后的每一位都可以發(fā)送給mosi;Uchar的只待對象,就是上面的諸如#defineFLUSH_TX0 xE1這樣的數(shù),或者是相關(guān)的發(fā)送數(shù)據(jù)。*pBuf這個(gè)并不是一個(gè)主要的問題,實(shí)際這個(gè)是涉及指針問題的,帶*的跟地址有關(guān)系,但是我們其實(shí)不需要很關(guān)心編譯的時(shí)候數(shù)據(jù)被具體存入哪個(gè)地址,即使是很重要的數(shù)據(jù)。voidinit_NRF24L01(void)inerDelay_us(100);CE=0;/chipenableCSN=1;/SpidisableSCK=0;/SPI_Write_Buf(WRITE_REG+T
5、X_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,0 x01);/頻道0自動(dòng)ACK應(yīng)答允許SPI_RW_Reg(WRITE_REG+EN_RXADDR,0 x01);/允許接收地址只有頻道0,如果需要多頻道可以參考Page21SPI_RW_Reg(WRITE_REG+RF_CH,0);/設(shè)置信道工作為2.4GHZ,收發(fā)必須一致SPI_RW_Reg(WRITE_REG+RX_PW_P0
6、,RX_PLOAD_WIDTH);/設(shè)置接收數(shù)據(jù)長度,本次設(shè)置為32字節(jié)SPI_RW_Reg(WRITE_REG+RF_SETUP,0 x07);/設(shè)置發(fā)射速率為1MHZ,發(fā)射功率為最大值0dB在整個(gè)初始化中我們看到:CE=0;/chipenableCSN=1;/Spidisable這是設(shè)置整個(gè)的狀態(tài)。如過狀態(tài)設(shè)置成待機(jī),則引腳可能變?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_WI
7、DTH);/寫接收端地址類似以上兩句,這是應(yīng)用spi的子程序,將寄存器指令放入nrf24l01。如果需深究,請參考說明書,手冊等?;蛘呖梢酝ㄟ^#defineREAD_REG0 x00/讀寄存器指令等了解大概流程。在整個(gè)無線通信過程中,初始化只需設(shè)置一次。TxBuf存放的是發(fā)送的數(shù)據(jù)。并且此數(shù)據(jù)被發(fā)送時(shí),是將這個(gè)數(shù)組的數(shù)全部發(fā)送的。對方也全部接收。RxBuf接收數(shù)組,用于存放對方發(fā)來的數(shù)據(jù)。SetRX_Mode();nRF24L01_RxPacket(RxBuf);當(dāng)主程序中包含這兩個(gè)子函數(shù)時(shí),且這時(shí)某個(gè)數(shù)據(jù)被發(fā)送過來,則會被接收到。且被存放到了RxBuf;反之包含nRF24L01_TxPack
8、et(TxBuf);且TxBuf已經(jīng)存入你想要的數(shù)據(jù)的時(shí)候,這個(gè)數(shù)據(jù)將被發(fā)送。程序部分:下面給出程序,由于收發(fā)雙方程序是完全一樣的,所以只粘貼一份。程序雖然不是自己寫的,但是經(jīng)過實(shí)際測試的,沒有任何詭異的問題。#include#includetypedefunsignedcharuchar;typedefunsignedcharuint;/*NRF24L01端口定義*sbitMISO=P13;sbitMOSI=P14;sbitSCK=P12;sbitCE=P11;sbitCSN=P32;sbitIRQ=P33;/*按鍵*sbitKEY1=P36;sbitKEY2=P37;/*數(shù)碼管位選*sbi
9、tled3=P20;sbitled2=P21;sbitled1=P22;sbitled0=P23;/*蜂明器*sbitBELL=P34;/*數(shù)碼管0-9編碼*ucharseg10=0 xC0,0 xCF,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90;/09段碼/*NRF24L01*#defineTX_ADR_WIDTH5/5uintsTXaddresswidth#defineRX_ADR_WIDTH5/5uintsRXaddresswidth#defineTX_PLOAD_WIDTH20/20uintsTXpayload#defineRX_PL
10、OAD_WIDTH20/20uintsTXpayloaduintconstTX_ADDRESSTX_ADR_WIDTH=0 x34,0 x43,0 x10,0 x10,0 x01;/本地地址uintconstRX_ADDRESSRX_ADR_WIDTH=0 x34,0 x43,0 x10,0 x10,0 x01;/接收地址/*NRF24L01寄存器指令*#defineREAD_REG0 x00/讀寄存器指令#defineWRITE_REG0 x20/寫寄存器指令#defineRD_RX_PLOAD0 x61/讀取接收數(shù)據(jù)指令#defineWR_TX_PLOAD0 xA0/寫待發(fā)數(shù)據(jù)指令#def
11、ineFLUSH_TX0 xE1/沖洗發(fā)送FIFO指令#defineFLUSH_RX0 xE2/沖洗接收FIFO指令#defineREUSE_TX_PL0 xE3/定義重復(fù)裝載數(shù)據(jù)指令#defineNOP0 xFF/保留/*SPI(nRF24L01)寄存器地址*#defineCONFIG0 x00/配置收發(fā)狀態(tài),CRC校驗(yàn)?zāi)J揭约笆瞻l(fā)狀態(tài)響應(yīng)方式#defineEN_AA0 x01/自動(dòng)應(yīng)答功能設(shè)置#defineEN_RXADDR0 x02/可用信道設(shè)置#defineSETUP_AW0 x03/收發(fā)地址寬度設(shè)置#defineSETUP_RETR0 x04/自動(dòng)重發(fā)功能設(shè)置#defineRF_CH
12、0 x05/工作頻率設(shè)置#defineRF_SETUP0 x06/發(fā)射速率、功耗功能設(shè)置#defineSTATUS0 x07/狀態(tài)寄存器#defineOBSERVE_TX0 x08/發(fā)送監(jiān)測功能#defineCD0 x09/地址檢測#defineRX_ADDR_P00 x0A/頻道0接收數(shù)據(jù)地址#defineRX_ADDR_P10 x0B/頻道1接收數(shù)據(jù)地址#defineRX_ADDR_P20 x0C/頻道2接收數(shù)據(jù)地址#defineRX_ADDR_P30 x0D/頻道3接收數(shù)據(jù)地址#defineRX_ADDR_P40 x0E/頻道4接收數(shù)據(jù)地址#defineRX_ADDR_P50 x0F/頻
13、道5接收數(shù)據(jù)地址#defineTX_ADDR0 x10/發(fā)送地址寄存器#defineRX_PW_P00 x11/接收頻道0接收數(shù)據(jù)長度#defineRX_PW_P10 x12/接收頻道0接收數(shù)據(jù)長度#defineRX_PW_P20 x13/接收頻道0接收數(shù)據(jù)長度#defineRX_PW_P30 x14/接收頻道0接收數(shù)據(jù)長度#defineRX_PW_P40 x15/接收頻道0接收數(shù)據(jù)長度#defineRX_PW_P50 x16/接收頻道0接收數(shù)據(jù)長度#defineFIFO_STATUS0 x17/FIFO棧入棧出狀態(tài)寄存器設(shè)置/*voidDelay(unsignedints);voidiner
14、Delay_us(unsignedcharn);voidinit_NRF24L01(void);uintSPI_RW(uintuchar);ucharSPI_Read(ucharreg);voidSetRX_Mode(void);uintSPI_RW_Reg(ucharreg,ucharvalue);uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars);uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars);unsignedcharnRF24L01_RxPacket(unsignedchar*rx_bu
15、f);voidnRF24L01_TxPacket(unsignedchar*tx_buf);/*長延時(shí)*voidDelay(unsignedints)unsignedinti;for(i=0;is;i+);for(i=0;i0;n-)_nop_();/*/*NRF24L01初始化/*/voidinit_NRF24L01(void)inerDelay_us(100);CE=0;/chipenableCSN=1;/SpidisableSCK=0;/SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);/寫本地地址SPI_Write_Buf
16、(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);/寫接收端地址SPI_RW_Reg(WRITE_REG+EN_AA,0 x01);/頻道0自動(dòng)ACK應(yīng)答允許SPI_RW_Reg(WRITE_REG+EN_RXADDR,0 x01);/允許接收地址只有頻道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ù)長度,本次設(shè)置為32字節(jié)SPI_RW_Reg(WRIT
17、E_REG+RF_SETUP,0 x07);/設(shè)置發(fā)射速率為1MHZ,發(fā)射功率為最大值0dB/*/*函數(shù):uintSPI_RW(uintuchar)/*功能:NRF24L01的SPI寫時(shí)序/*/uintSPI_RW(uintuchar)uintbit_ctr;for(bit_ctr=0;bit_ctr8;bit_ctr+)/output8-bitMOSI=(uchar&0 x80);/outputuchar,MSBtoMOSIuchar=(uchar1);/shiftnextbitintoMSB.SCK=1;/SetSCKhigh.uchar|=MISO;/capturecurrentMISO
18、bitSCK=0;/.thensetSCKlowagainreturn(uchar);/returnreaduchar/*/*函數(shù):ucharSPI_Read(ucharreg)/*功能:NRF24L01的SPI時(shí)序/*/ucharSPI_Read(ucharreg)ucharreg_val;CSN=0;/CSNlow,initializeSPIcommunication.SPI_RW(reg);/Selectregistertoreadfrom.reg_val=SPI_RW(0);/.thenreadregistervalueCSN=1;/CSNhigh,terminateSPIcommun
19、icationreturn(reg_val);/returnregistervalue/*/*功能:NRF24L01讀寫寄存器函數(shù)/*/uintSPI_RW_Reg(ucharreg,ucharvalue)uintstatus;CSN=0;/CSNlow,initSPItransactionstatus=SPI_RW(reg);/selectregisterSPI_RW(value);/.andwritevaluetoit.CSN=1;/CSNhighagainreturn(status);/returnnRF24L01statusuchar/*/*函數(shù):uintSPI_Read_Buf(uc
20、harreg,uchar*pBuf,ucharuchars)/*功能:用于讀數(shù)據(jù),reg:為寄存器地址,pBuf:為待讀出數(shù)據(jù)地址,uchars:讀出數(shù)據(jù)的個(gè)數(shù)/*/uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars)uintstatus,uchar_ctr;CSN=0;/SetCSNlow,initSPItranactionstatus=SPI_RW(reg);/Selectregistertowritetoandreadstatusucharfor(uchar_ctr=0;uchar_ctruchars;uchar_ctr+)pBufuchar
21、_ctr=SPI_RW(0);/CSN=1;return(status);/returnnRF24L01statusuchar/*/*函數(shù):uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars)/*功能:用于寫數(shù)據(jù):為寄存器地址,pBuf:為待寫入數(shù)據(jù)地址,uchars:寫入數(shù)據(jù)的個(gè)數(shù)/*/uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars)uintstatus,uchar_ctr;CSN=0;/SPI使能status=SPI_RW(reg);for(uchar_ctr=0;uchar_ctrucha
22、rs;uchar_ctr+)/SPI_RW(*pBuf+);CSN=1;/關(guān)閉SPIreturn(status);/*/*函數(shù):voidSetRX_Mode(void)/*功能:數(shù)據(jù)接收配置/*/voidSetRX_Mode(void)CE=0;SPI_RW_Reg(WRITE_REG+CONFIG,0 x0f);/IRQ收發(fā)完成中斷響應(yīng),16位CRC,主接收CE=1;inerDelay_us(130);/*/*函數(shù):unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf)/*功能:數(shù)據(jù)讀取后放如rx_buf接收緩沖區(qū)中/*/unsignedchar
23、nRF24L01_RxPacket(unsignedchar*rx_buf)unsignedcharrevale=0;sta=SPI_Read(STATUS);/讀取狀態(tài)寄存其來判斷數(shù)據(jù)接收狀況if(RX_DR)/判斷是否接收到數(shù)據(jù)CE=0;/SPI使能SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);/readreceivepayloadfromRX_FIFObufferrevale=1;/讀取數(shù)據(jù)完成標(biāo)志SPI_RW_Reg(WRITE_REG+STATUS,sta);/接收到數(shù)據(jù)后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清楚
24、中斷標(biāo)志returnrevale;/*/*函數(shù):voidnRF24L01_TxPacket(unsignedchar*tx_buf)/*功能:發(fā)送tx_buf中數(shù)據(jù)/*/voidnRF24L01_TxPacket(unsignedchar*tx_buf)CE=0;/StandByI模式SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);/裝載接收端地址SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);/裝載數(shù)據(jù)SPI_RW_Reg(WRITE_REG+CONFIG,0 x0e);/IRQ收發(fā)完成中斷響應(yīng),16位CRC,主發(fā)送CE=1;/置高CE,激發(fā)數(shù)據(jù)發(fā)送inerDelay_us(10);/*主函數(shù)*voidmain(void)unsignedchartf=0;unsignedcharTxBuf20=0;/unsignedcharRxBuf20=0;init_NRF24L01();led0=0;led1=0;led2=0;l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工程居間合同范本
- 上海供貨服裝合同范例
- 廚師績效合同范本
- 合同范例作廢文本
- 代課教師聘用合同范例
- 合同范本打賭
- 廠區(qū)勞務(wù)合同范例
- 合同范本修訂調(diào)研方案
- 北京官方合同范本
- 報(bào)社發(fā)布廣告合同范本
- 2023年中國鐵路南寧局招聘筆試參考題庫附帶答案詳解
- 某鐵路注漿處理工藝性試驗(yàn)方案
- GB/T 12265-2021機(jī)械安全防止人體部位擠壓的最小間距
- GB 8537-2018食品安全國家標(biāo)準(zhǔn)飲用天然礦泉水
- GB 31247-2014電纜及光纜燃燒性能分級
- 婚禮開場白主持詞15篇
- 部編人教版道德與法治五年級下冊全冊課時(shí)練習(xí)講解課件
- 識讀齒輪精測報(bào)告課件
- 《農(nóng)村土地承包法》課件
- 廉政鑒定書(院內(nèi)廉政意見書)
- 《潘姓源于固始,是不爭的史實(shí)》的考辨
評論
0/150
提交評論