找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 84778|回復(fù): 35
打印 上一主題 下一主題
收起左側(cè)

nRF24L01單片機(jī)通信的總結(jié)--看了就會(huì)用了

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:70976 發(fā)表于 2014-12-26 21:38 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1周時(shí)間,我從一個(gè)沒(méi)用過(guò)STC單片機(jī),不知道什么叫SPI接口的“文盲”,把nRF24L01的整個(gè)通信過(guò)程弄到完全沒(méi)有bug.。興奮之余來(lái)小屁一下。給那些正在奮斗著這個(gè)牛逼的芯片的小牛們小炫一下。希望有所幫助。屁話少說(shuō)。正題:

  基本的東西我理解了,那就是:1.用5根線的SPI接口向2401發(fā)送數(shù)據(jù)或指令。2.芯片在每次上電的時(shí)候都需要進(jìn)行一番配置。這些配置數(shù)據(jù),就是所謂的指令了。3.配置完成后知道芯片處在哪個(gè)模式。并且知道它將要轉(zhuǎn)向哪個(gè)模式。4.通訊協(xié)議。5.觀察現(xiàn)象。

  好了,小牛們一定急切想知道自己的程序問(wèn)題出在哪里了,再小白一點(diǎn)的一定想急切的知道如何配置才能讓它工作。更小白一點(diǎn)的一定想知道這個(gè)芯片的各個(gè)模式之間是怎么聯(lián)系的。又是如何進(jìn)行相互轉(zhuǎn)化的。別急,一個(gè)一個(gè)說(shuō)。

  要說(shuō)什么最重要,你們不會(huì)想到其實(shí)是4.通訊協(xié)議!

  為什么呢,你們又知道在這里的通訊協(xié)議是作什么用的呢!∨e個(gè)簡(jiǎn)單的例子,我剛開(kāi)始設(shè)計(jì)的時(shí)候,一心想讓一個(gè)作為發(fā)送模塊,每隔一秒發(fā)送一次數(shù)據(jù),而另一個(gè)則作為接收模塊,不間斷的檢測(cè)收到數(shù)據(jù)沒(méi)有!∵@就是一個(gè)簡(jiǎn)單的通訊協(xié)議,它是我們的目標(biāo)。是我們的方向。當(dāng)然真正的通訊協(xié)議絕對(duì)不會(huì)這么簡(jiǎn)單的幾句話。它告訴你,你理想中的模塊應(yīng)該充當(dāng)什么角色。是接收?是發(fā)送?還是接收完了馬上發(fā)送。作為開(kāi)發(fā)階段,當(dāng)然是越簡(jiǎn)單的協(xié)議,正確性就越容易驗(yàn)證,廢話不說(shuō),那就按我說(shuō)的“通訊協(xié)議”來(lái)設(shè)計(jì)吧。

  先說(shuō)發(fā)送模式吧。

  要到發(fā)送模式,要經(jīng)歷幾個(gè)變化。第1,上電,上電完了芯片其實(shí)還是在powerDown模式,因?yàn)樾酒瑸榱耸‰,它需要通過(guò)軟件來(lái)控制開(kāi)機(jī)或關(guān)機(jī)。powerDown模式就是所謂的待機(jī)模式了。這個(gè)模式理所當(dāng)然是最省電的。它除了省電以外還能干嗎呢?配置!對(duì)最重要的配置。就是可以通過(guò) SPI口向它發(fā)送數(shù)據(jù),它是可以接收到的,并且可以正確寫(xiě)入到指定的寄存器中的。一般我們?cè)诔跏蓟幸婚_(kāi)始就可以配置了,而此時(shí)芯片正是處在這個(gè)模式。

  第2.我們的目標(biāo)是要把它配置的能發(fā)送出去數(shù)據(jù),而且能被目標(biāo)設(shè)備正確接收。所以這中間涉及的寄存器(當(dāng)然是2401里自帶的寄存器區(qū)了)有:

     1@發(fā)送到的目標(biāo)地址!≌f(shuō)地址其實(shí)是虛的,它就相當(dāng)于一個(gè)鑰匙和一把鎖一樣。當(dāng)你在接收設(shè)備里邊規(guī)定了一個(gè)地址以后,那么接收到的數(shù)據(jù)只有帶了這個(gè)地址的包才會(huì)被正確接收。所以說(shuō)這里的發(fā)送目標(biāo)地址就是接收設(shè)備里的本機(jī)地址。只要設(shè)計(jì)時(shí)兩個(gè)地址相同,就不會(huì)接收不到。

     2@接收到的地址!∵@個(gè)名字起的不是很好哈,有點(diǎn)誤導(dǎo)人。說(shuō)白了就是一個(gè)本機(jī)地址了。在純發(fā)射機(jī)里,它并不是必要的。因?yàn)樗鼜膩?lái)不接收數(shù)據(jù)~~~這里寫(xiě)上,是因?yàn)椋喊l(fā)射模式還有個(gè)東西,就是自動(dòng)應(yīng)答功能,(當(dāng)然也是通過(guò)配置才能啟用的,不配置則不會(huì)自動(dòng)應(yīng)答,也就不需要知道本機(jī)地址了)。

     3@說(shuō)到自動(dòng)應(yīng)答,那就先說(shuō)它吧。一般我們會(huì)想,發(fā)送出一幀數(shù)據(jù)后是不是應(yīng)該等待另一方回應(yīng)個(gè)數(shù)據(jù)呀?想法是好的,但我說(shuō)了,有通訊協(xié)議在控制。因?yàn)槲覀冞@里只想設(shè)計(jì)成一直發(fā)送而不管對(duì)方是否收到。所以自動(dòng)應(yīng)答可以不去配置,讓它開(kāi)機(jī)默認(rèn)即可。但實(shí)際上我們的通訊協(xié)議可能很復(fù)雜,肯定不會(huì)是一直在發(fā)送。并且,它發(fā)送完一幀后,確實(shí)應(yīng)該轉(zhuǎn)為接收模式來(lái)等待對(duì)方發(fā)送應(yīng)答數(shù)據(jù)過(guò)來(lái)。我們?nèi)藶榈漠?dāng)然可以自己來(lái)個(gè)模式跳轉(zhuǎn),但是有自動(dòng)應(yīng)答了,也就是說(shuō),當(dāng)你設(shè)定開(kāi)啟自動(dòng)應(yīng)答了,那么在它發(fā)送完一包數(shù)據(jù)后,芯片會(huì)立即轉(zhuǎn)為接收模式了! 对谶@里我也仍有一點(diǎn)沒(méi)理解,就是,當(dāng)它收到應(yīng)答后會(huì)變成什么模式呢,是自動(dòng)再回到發(fā)送模式還是停留在接收模式!贰

     4@有自動(dòng)應(yīng)答了,那么就不能少了自動(dòng)重發(fā)功能了。為什么呢。首先理解為什么會(huì)自動(dòng)重發(fā),就因?yàn)樗幵谧詣?dòng)應(yīng)答模式時(shí),通過(guò)接收數(shù)據(jù)來(lái)判定上次的數(shù)據(jù)是否有接收者成功接收了,就像我送出了一封信,如果你沒(méi)有回信我是不是會(huì)想你可能沒(méi)收到信,我需要再發(fā)一次。就是這個(gè)道理 。自動(dòng)重發(fā)寄存器8位被分成兩個(gè)4位的小區(qū)域,高4位存的是重發(fā)間隔時(shí)間,也就是說(shuō)總共可以設(shè)定為16種不同的間隔,在這個(gè)間隔時(shí)間過(guò)后仍沒(méi)有回應(yīng)才再次重發(fā)。低4位好說(shuō),就是存一個(gè)最大重發(fā)次數(shù)。則最大可以設(shè)為15,即重發(fā)15次后仍然沒(méi)回應(yīng)那就不理你了,不再重發(fā)了。并且還會(huì)產(chǎn)生一個(gè)中斷呢。最后再講中斷部分!∵@里應(yīng)該注意的是,當(dāng)自動(dòng)應(yīng)答功能禁止時(shí),就沒(méi)有自動(dòng)重發(fā)了,不管你設(shè)了重發(fā)多少次都不管用了。所以是互相影響的。還有就是重發(fā)次數(shù)設(shè)為0次,則相當(dāng)于禁自動(dòng)重發(fā)了,這不是顯然的么。嘿嘿。

     5@最基本的配置,,頻率。這個(gè)芯片不光能以2.4Ghz的載波發(fā)射呢,它的帶寬為2.4G----2.512G呢。這中間有一百多M的頻帶,可以劃分成2M一個(gè)的信道。這個(gè)寄存器中的值就標(biāo)明你想工作在哪個(gè)信道上啦,只有設(shè)置為同頻的設(shè)備才能接收的到很容易理解吧。比如你設(shè)為10信道,則10*2=20M即發(fā)送時(shí)所用的載波頻率就是2400+20=2420MHz。當(dāng)然也只有設(shè)為2420M的接收設(shè)備才能接收的到了。

     6@功率,數(shù)據(jù)速率。這是什么呢?原來(lái)2401里邊也有自動(dòng)增益控制部分,我們可以設(shè)定一個(gè)合適的功率來(lái)發(fā)射數(shù)據(jù),第一可以在能耗上有利,另一方面對(duì)通信距離的控制也是很重要的。比如我只想在2米內(nèi)能夠通信,但2401最大的通信距離可以達(dá)到上百米,顯然需要降發(fā)射功率來(lái)降低通信距離?蛇x的功率值有 0Dbm,-6dBm, -12dBm,-18dBm, 顯然0在這里是最大的發(fā)射功率了。開(kāi)發(fā)時(shí)盡可能設(shè)為0.如果設(shè)為0時(shí),接收者都接收不到數(shù)據(jù),那肯定是芯片壞了,就不用考慮降低功耗來(lái)通信了。這四檔功率,通信距離從遠(yuǎn)到近,從幾十米到幾cm.并且在通信過(guò)程中還可以動(dòng)態(tài)更改這個(gè)功率值,以達(dá)到最佳匹配的效果。數(shù)據(jù)速率是什么呢,剛開(kāi)始我跟SPI接口的速率搞混了,想著,一個(gè)4M的單片機(jī)跟芯片通信速率怎么可能到這么高的。其實(shí)不是,這個(gè)速率就是加在載波上的數(shù)據(jù)的碼率了。有兩個(gè)可選值,1Mb/s,2Mb/s.也就是說(shuō),1秒鐘能發(fā)送出去多少個(gè)高低電平。

     以上這些配置命令之后就可以通過(guò)簡(jiǎn)單的指令轉(zhuǎn)向發(fā)送模式了。下面就看一下,配置的偽指令吧:

    1. sendCommand(TxAddress_5) .因?yàn)榈刂肥?到5字節(jié)可選的,這里選擇了5字節(jié)的地址

    2. sendCommand(LocalAddress_5),本機(jī)地址如果想要開(kāi)啟自動(dòng)應(yīng)答則必需與發(fā)射地址相同,即LocalAddress==TxAddress..不開(kāi)啟則不需要相等。

    3. sendCommand(EnableAutoAck_0),因?yàn)樾酒詭Я?個(gè)通道,可以同時(shí)工作同時(shí)接收不同的數(shù)據(jù),所以這里的自動(dòng)應(yīng)答也有相應(yīng)的6個(gè)bit位來(lái)分別控制。這里只允許通道0自動(dòng)應(yīng)答。

    4. sendCommand(EnableAutoTransmit) .只要上邊一句配置開(kāi)了自動(dòng)應(yīng)答,這句就應(yīng)答生效。即自動(dòng)重發(fā).

    5.  sendCommand(RF_CH). 這一句設(shè)置發(fā)射頻率。即設(shè)定信道。一般默認(rèn)的就是0信道了,也即2.4G的載波。

    6.sendCommand(RF_Power). 設(shè)定發(fā)射速率,還有發(fā)射功率就設(shè)成0dBM吧。





    以上這些是發(fā)射模式的必要配置了。如果不涉及接收,那么現(xiàn)在就可以轉(zhuǎn)向發(fā)射模式。

    7.sendCommand(Config); 通過(guò) config寄存器中的開(kāi)機(jī)控制位 powerup=1,轉(zhuǎn)向空閑模式,config^0=0.轉(zhuǎn)向發(fā)射模式。

    8.sendCommand(TxBuffer);  填充發(fā)送數(shù)據(jù)到緩沖區(qū)里邊。

    8.CE=1;  這是一個(gè)引腳,用來(lái)控制從空閑模式向發(fā)送或接收模式跳轉(zhuǎn)的.僅將相應(yīng)位設(shè)為發(fā)送或接收模式不行,芯片現(xiàn)在只欠東風(fēng)了,就是CE=1并保持最少10us時(shí)間后。就會(huì)開(kāi)始發(fā)送數(shù)據(jù)了。

    一個(gè)幀數(shù)據(jù)發(fā)送完成后會(huì)產(chǎn)生中斷。這些中斷是可以屏蔽的,就像單片機(jī)的中斷允許控制一樣?刂莆辉赾onfig寄存器中。

    這里還可能產(chǎn)生另一個(gè)中斷,就是重發(fā)次數(shù)達(dá)到上限了,你設(shè)了重發(fā)3次,那么重發(fā)3次以后還沒(méi)收到應(yīng)答就產(chǎn)生中斷了。同樣也是可屏蔽的。



 下面說(shuō)接收模式配置吧。

  待續(xù)一下。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏15 分享淘帖 頂2 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:72886 發(fā)表于 2015-1-27 21:04 | 只看該作者
還在設(shè)計(jì)硬件,來(lái)看看nrf24l01好調(diào)不,看你們寫(xiě)的都腦大了,樓主繼續(xù)啊,請(qǐng)問(wèn)你的手冊(cè)也是英文的嗎?求一個(gè)中文的手冊(cè)。。謝謝
回復(fù)

使用道具 舉報(bào)

板凳
ID:68369 發(fā)表于 2015-2-26 21:45 | 只看該作者
樓主,想問(wèn)一下NRF24L01和5V單片機(jī)相連要串電阻嗎?串多大?
回復(fù)

使用道具 舉報(bào)

地板
ID:73002 發(fā)表于 2015-3-11 13:11 | 只看該作者
可以學(xué)習(xí)下。
回復(fù)

使用道具 舉報(bào)

5#
ID:74852 發(fā)表于 2015-3-19 10:50 | 只看該作者
liyongbin10 發(fā)表于 2015-2-26 21:45
樓主,想問(wèn)一下NRF24L01和5V單片機(jī)相連要串電阻嗎?串多大?

nrf最大承受電壓只有3.6v,建議還是用一個(gè)3.3v的恒壓芯片吧,電路也簡(jiǎn)單,加兩個(gè)電容就行了
回復(fù)

使用道具 舉報(bào)

6#
ID:73962 發(fā)表于 2015-3-19 20:19 | 只看該作者
挺深入淺出的科普帖子,贊一個(gè)!
不知道為啥,沒(méi)有續(xù)帖了?
期待下文。
回復(fù)

使用道具 舉報(bào)

7#
ID:37003 發(fā)表于 2015-3-24 17:01 | 只看該作者
很好的總結(jié)!
回復(fù)

使用道具 舉報(bào)

8#
ID:72611 發(fā)表于 2015-4-4 17:44 | 只看該作者
學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

9#
ID:84442 發(fā)表于 2015-7-1 09:59 | 只看該作者
樓主你好,我用51單片機(jī)控制2401,要設(shè)置1Mbps,發(fā)射功率為4dBm,請(qǐng)問(wèn)怎么寫(xiě)程序。
回復(fù)

使用道具 舉報(bào)

10#
ID:84485 發(fā)表于 2015-7-1 16:51 | 只看該作者
非常好
回復(fù)

使用道具 舉報(bào)

11#
ID:84485 發(fā)表于 2015-7-1 16:51 | 只看該作者
非常好
回復(fù)

使用道具 舉報(bào)

12#
ID:79615 發(fā)表于 2015-9-12 00:51 | 只看該作者
哇哇。樓主很好,很好的經(jīng)驗(yàn)!
回復(fù)

使用道具 舉報(bào)

13#
ID:104819 發(fā)表于 2016-8-28 10:48 | 只看該作者
非常好
回復(fù)

使用道具 舉報(bào)

14#
ID:91274 發(fā)表于 2016-9-3 11:09 | 只看該作者
學(xué)習(xí)中
回復(fù)

使用道具 舉報(bào)

15#
ID:91274 發(fā)表于 2016-9-3 11:10 | 只看該作者
沒(méi)有其他程序?
回復(fù)

使用道具 舉報(bào)

16#
ID:154544 發(fā)表于 2017-2-28 14:50 | 只看該作者
樓主好棒
回復(fù)

使用道具 舉報(bào)

17#
ID:169722 發(fā)表于 2017-4-11 12:17 | 只看該作者
wxfhw 發(fā)表于 2015-3-19 20:19
挺深入淺出的科普帖子,贊一個(gè)!
不知道為啥,沒(méi)有續(xù)帖了?
期待下文。

請(qǐng)問(wèn)下文在哪?我找不到
回復(fù)

使用道具 舉報(bào)

18#
ID:188912 發(fā)表于 2017-4-12 17:25 | 只看該作者
感謝有思路
回復(fù)

使用道具 舉報(bào)

19#
ID:193669 發(fā)表于 2017-4-25 23:53 | 只看該作者
親,有沒(méi)有兩個(gè)51之間通信的程序
回復(fù)

使用道具 舉報(bào)

20#
ID:220453 發(fā)表于 2017-7-18 09:46 | 只看該作者
謝謝樓主~
回復(fù)

使用道具 舉報(bào)

21#
ID:219204 發(fā)表于 2017-7-24 22:24 | 只看該作者
樓主快點(diǎn)更啊,我很需要您這種詳細(xì)的講解
回復(fù)

使用道具 舉報(bào)

22#
ID:203249 發(fā)表于 2017-9-4 16:39 | 只看該作者
講的很明白,兄弟,上個(gè)代碼分享就完美了
回復(fù)

使用道具 舉報(bào)

23#
ID:161939 發(fā)表于 2017-9-4 21:30 | 只看該作者
下一集呢樓主坐等更新啊
回復(fù)

使用道具 舉報(bào)

24#
ID:221300 發(fā)表于 2017-10-24 20:58 | 只看該作者
學(xué)子心 發(fā)表于 2015-7-1 09:59
**** 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽 ****

24L01最高發(fā)射功率只能有0dBm
回復(fù)

使用道具 舉報(bào)

25#
ID:251314 發(fā)表于 2017-11-20 09:20 | 只看該作者
總結(jié)的很好,我還像看看   前導(dǎo)碼、同步字這些,怎么就沒(méi)什么人問(wèn)呢?
回復(fù)

使用道具 舉報(bào)

26#
ID:134294 發(fā)表于 2017-11-21 19:49 | 只看該作者
14年的帖子,作者還沒(méi)續(xù)貼!
回復(fù)

使用道具 舉報(bào)

27#
ID:256288 發(fā)表于 2017-12-1 21:47 | 只看該作者
希望更新
回復(fù)

使用道具 舉報(bào)

28#
ID:266052 發(fā)表于 2017-12-24 15:10 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

29#
ID:52816 發(fā)表于 2018-7-15 16:45 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

30#
ID:307566 發(fā)表于 2018-10-30 22:10 | 只看該作者
牛皮啊,6666謝謝樓主
回復(fù)

使用道具 舉報(bào)

31#
ID:478236 發(fā)表于 2019-3-14 22:20 | 只看該作者
小白表示看不懂,哈哈哈,我是不是沒(méi)救了
回復(fù)

使用道具 舉報(bào)

32#
ID:443731 發(fā)表于 2019-10-28 16:42 | 只看該作者
liyongbin10 發(fā)表于 2015-2-26 21:45
樓主,想問(wèn)一下NRF24L01和5V單片機(jī)相連要串電阻嗎?串多大?

正常是3.3V,自己計(jì)算下唄。不難的
回復(fù)

使用道具 舉報(bào)

33#
ID:631965 發(fā)表于 2019-10-29 12:05 | 只看該作者
安全加密芯片,有意者歡迎咨詢
回復(fù)

使用道具 舉報(bào)

34#
ID:51142 發(fā)表于 2019-10-30 00:17 | 只看該作者
謝謝分享,學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

35#
ID:156302 發(fā)表于 2020-1-30 11:32 | 只看該作者
前來(lái)學(xué)習(xí)一下,謝謝分享。雖然好久的帖子了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表