日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NRF24L01模块配置

發(fā)布時(shí)間:2024/9/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NRF24L01模块配置 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

發(fā)射數(shù)據(jù)時(shí):

? (1)首先將nRF24L01配置為發(fā)射模式

? (2)接著把接收節(jié)點(diǎn)地址TX_ADDR和有效數(shù)據(jù)TX_PLD按照時(shí)序由SPI口寫入nRF24L01緩存區(qū),TX_PLD必須在CSN為低時(shí)連續(xù)寫入,而TX_ADDR在發(fā)射時(shí)寫入一次即可,然后CE置為高電平并保持至少10μs,延遲130μs后發(fā)射數(shù)據(jù);若自動(dòng)應(yīng)答開啟,那么nRF24L01在發(fā)射數(shù)據(jù)后立即進(jìn)入接收模式,接收應(yīng)答信號(hào)(自動(dòng)應(yīng)答接收地址應(yīng)該與接收節(jié)點(diǎn)地址TX_ADDR一致)。如果收到應(yīng)答,則認(rèn)為此次通信成功,TX_DS置高,同時(shí)TX_PLD從TXFIFO中清除;若未收到應(yīng)答,則自動(dòng)重新發(fā)射該數(shù)據(jù)(自動(dòng)重發(fā)已開啟),若重發(fā)次數(shù)(ARC)達(dá)到上限,MAX_RT置高,TXFIFO中數(shù)據(jù)保留以便再次重發(fā);MAX_RT或TX_DS置高時(shí),使IRQ變低,產(chǎn)生中斷,通知MCU。最后發(fā)射成功時(shí),若CE為低則nRF24L01進(jìn)入空閑模式1;若發(fā)送堆棧中有數(shù)據(jù)且CE為高,則進(jìn)入下一次發(fā)射;若發(fā)送堆棧中無數(shù)據(jù)且CE為高,則進(jìn)入空閑模式2。

1 /********************************************************************** 2 配置NRF為TX模式,并發(fā)送一個(gè)數(shù)據(jù)包 3 輸入?yún)?shù)tfbuf:即將要發(fā)送出去的數(shù)據(jù)區(qū)首地址 4 ***********************************************************************/ 5 void NRF_SendPacket(u8* tfbuf) 6 { 7 CE_LOW; //拉低CE,進(jìn)入待機(jī)模式,準(zhǔn)備開始往NRF中的寄存器中寫入數(shù)據(jù) 10 SPI_Write_Buf(WR_TX_PLOAD, tfbuf, TX_PLOAD_WIDTH); //將數(shù)據(jù)寫入TX端的FIFO中,寫入的個(gè)數(shù)與TX_PLOAD_WIDTH設(shè)置值相同 12 SPI_Write_Byte(WRITE_REG_CMD + CONFIG, 0x0e); //將NRF配置成發(fā)射模式 13 SPI_Write_Byte(WRITE_REG_CMD + STATUS, 0x7e); //寫0111 xxxx 給STATUS,清除所有中斷標(biāo)志,防止一進(jìn)入發(fā)射模式就觸發(fā)中斷 14 15 CE_HIGH; //拉高CE,準(zhǔn)備發(fā)射TX端FIFO中的數(shù)據(jù) 16 17 delay_ms(1); //CE拉高后,需要延遲至少130us 18 }

?

?

?

?

接收數(shù)據(jù)時(shí):

? ?(1)首先將nRF24L01配置為接收模式,接著延遲130μs進(jìn)入接收狀態(tài)等待數(shù)據(jù)的到來

? ?(2)當(dāng)接收方檢測(cè)到有效的地址和CRC時(shí),就將數(shù)據(jù)包存儲(chǔ)在RXFIFO中,同時(shí)中斷標(biāo)志位RX_DR置高,IRQ變低,產(chǎn)生中斷,通知MCU去取數(shù)據(jù)。若此時(shí)自動(dòng)應(yīng)答開啟,接收方則同時(shí)進(jìn)入發(fā)射狀態(tài)回傳應(yīng)答信號(hào)。最后接收成功時(shí),若CE變低,則nRF24L01進(jìn)入空閑模式1。

?

1 /********************************************************************** 2 從NRF的RX的FIFO中讀取一組數(shù)據(jù)包 3 輸入?yún)?shù)rx_buf:FIFO中讀取到的數(shù)據(jù)的保存區(qū)域首地址 4 ***********************************************************************/ 5 void NRF_ReceivePacket(u8* rx_buf) 6 { 7 CE_LOW; 8 9 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH); //從RX端的FIFO中讀取數(shù)據(jù),并存入指定的區(qū)域,注意:讀取完FIFO中的數(shù)據(jù)后,NRF會(huì)自動(dòng)清除其中的數(shù)據(jù) 10 SPI_Write_Byte(WRITE_REG_CMD+STATUS,sta); //接收到數(shù)據(jù)后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清楚中斷標(biāo)志 11 12 CE_HIGH; //重新拉高CE,讓其重新處于接收模式,準(zhǔn)備接收下一個(gè)數(shù)據(jù) 13 }

?

?

?

①接收地址與發(fā)送地址為什么要設(shè)定成一樣的?

? ? ??a.了解接收端與發(fā)送端的職責(zé):

? ? ? ? ? ?發(fā)送端(手柄)的職責(zé):發(fā)送數(shù)據(jù)給接收端,接收某接收端的應(yīng)答信號(hào)。

? ? ? ? ? ?接收端飛機(jī)的職責(zé):接收發(fā)送端發(fā)送的數(shù)據(jù),發(fā)送應(yīng)答信號(hào)給發(fā)送端。

? ?b.對(duì)接收&發(fā)送地址的闡述:

? ? ? 1.

? ? ??

? ??

因此程序中要將發(fā)送地址和接收地址配成一樣的,這樣發(fā)射端可以正常收到接收端發(fā)送的應(yīng)答信號(hào),確保通信成功。

1 u8 TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //--本地地址 2 u8 RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //此地址用來配置本機(jī)NRF的RX0通道的地址,同時(shí)為了能正常收到應(yīng)答信號(hào),此地址一般都和上面的地址配置相同

?

寫寄存器進(jìn)行TX_ADDR,TX_ADDR地址配置:

1 SPI_Write_Buf(WRITE_REG_CMD + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); 2 SPI_Write_Buf(WRITE_REG_CMD + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);

?

?

?

②如何拋開接收端(飛機(jī)),來進(jìn)行調(diào)試(遙控器)發(fā)送是否成功?

?

? NRF24L01是收發(fā)雙方都需要編程的器件,這就對(duì)調(diào)試方法產(chǎn)生了一定的要求,如果兩塊一起調(diào),那么通訊不成功,根本不知道是發(fā)的問題還是收的問題;

? 發(fā)送方:發(fā)送-等應(yīng)答-(自動(dòng)重發(fā))-觸發(fā)中斷?可是這樣的流程就已經(jīng)把接收方給牽涉進(jìn)來了,就是說一定要接收方正確收到數(shù)據(jù)并且回送應(yīng)答信號(hào)之后發(fā)送方才能觸發(fā)中斷,結(jié)束一次完整的發(fā)送。可是這跟我們的初衷不相符,我們想單獨(dú)調(diào)試發(fā)送,完全拋開接收,這樣就要去配置一些參數(shù)來取消自動(dòng)應(yīng)答,取消自動(dòng)重發(fā),讓發(fā)送方達(dá)到發(fā)出數(shù)據(jù)就算成功的目的。

?

于是通過以下三語句將發(fā)送端的流程就變成了發(fā)送-觸發(fā)中斷。這樣就拋開了接收方,可以專心去調(diào)試發(fā)送端

1 //測(cè)試NRF作為發(fā)射端的時(shí)候是否能發(fā)出數(shù)據(jù)的測(cè)試代碼,程序正常運(yùn)行時(shí),可以注釋掉 2 SPI_Write_Byte(WRITE_REG_CMD + SETUP_RETR, 0x00); 3 SPI_Write_Byte(WRITE_REG_CMD + EN_AA, 0x00); 4 SPI_Write_Byte(WRITE_REG_CMD + EN_RXADDR, 0x00);

?

?

參考博客:

? ? ? ? ? ? ? ?發(fā)送地址和接收地址問題參考https://blog.csdn.net/qq_26602023/article/details/51016724?

? ? ? ? ? ? ? ?調(diào)試單端參考https://blog.csdn.net/q553716434/article/details/9996985

轉(zhuǎn)載于:https://www.cnblogs.com/darren-pty/p/10273972.html

總結(jié)

以上是生活随笔為你收集整理的NRF24L01模块配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。