|
1周時間,我從一個沒用過STC單片機,不知道什么叫SPI接口的“文盲”,把nRF24L01的整個通信過程弄到完全沒有bug.。興奮之余來小屁一下。給那些正在奮斗著這個牛逼的芯片的小牛們小炫一下。希望有所幫助。屁話少說。正題:
基本的東西我理解了,那就是:1.用5根線的SPI接口向2401發(fā)送數(shù)據(jù)或指令。2.芯片在每次上電的時候都需要進行一番配置。這些配置數(shù)據(jù),就是所謂的指令了。3.配置完成后知道芯片處在哪個模式。并且知道它將要轉(zhuǎn)向哪個模式。4.通訊協(xié)議。5.觀察現(xiàn)象。
好了,小牛們一定急切想知道自己的程序問題出在哪里了,再小白一點的一定想急切的知道如何配置才能讓它工作。更小白一點的一定想知道這個芯片的各個模式之間是怎么聯(lián)系的。又是如何進行相互轉(zhuǎn)化的。別急,一個一個說。
要說什么最重要,你們不會想到其實是4.通訊協(xié)議!
為什么呢,你們又知道在這里的通訊協(xié)議是作什么用的呢!∨e個簡單的例子,我剛開始設(shè)計的時候,一心想讓一個作為發(fā)送模塊,每隔一秒發(fā)送一次數(shù)據(jù),而另一個則作為接收模塊,不間斷的檢測收到數(shù)據(jù)沒有!∵@就是一個簡單的通訊協(xié)議,它是我們的目標(biāo)。是我們的方向。當(dāng)然真正的通訊協(xié)議絕對不會這么簡單的幾句話。它告訴你,你理想中的模塊應(yīng)該充當(dāng)什么角色。是接收?是發(fā)送?還是接收完了馬上發(fā)送。作為開發(fā)階段,當(dāng)然是越簡單的協(xié)議,正確性就越容易驗證,廢話不說,那就按我說的“通訊協(xié)議”來設(shè)計吧。
先說發(fā)送模式吧。
要到發(fā)送模式,要經(jīng)歷幾個變化。第1,上電,上電完了芯片其實還是在powerDown模式,因為芯片為了省電,它需要通過軟件來控制開機或關(guān)機。powerDown模式就是所謂的待機模式了。這個模式理所當(dāng)然是最省電的。它除了省電以外還能干嗎呢?配置!對最重要的配置。就是可以通過 SPI口向它發(fā)送數(shù)據(jù),它是可以接收到的,并且可以正確寫入到指定的寄存器中的。一般我們在初始化中一開始就可以配置了,而此時芯片正是處在這個模式。
第2.我們的目標(biāo)是要把它配置的能發(fā)送出去數(shù)據(jù),而且能被目標(biāo)設(shè)備正確接收。所以這中間涉及的寄存器(當(dāng)然是2401里自帶的寄存器區(qū)了)有:
1@發(fā)送到的目標(biāo)地址!≌f地址其實是虛的,它就相當(dāng)于一個鑰匙和一把鎖一樣。當(dāng)你在接收設(shè)備里邊規(guī)定了一個地址以后,那么接收到的數(shù)據(jù)只有帶了這個地址的包才會被正確接收。所以說這里的發(fā)送目標(biāo)地址就是接收設(shè)備里的本機地址。只要設(shè)計時兩個地址相同,就不會接收不到。
2@接收到的地址!∵@個名字起的不是很好哈,有點誤導(dǎo)人。說白了就是一個本機地址了。在純發(fā)射機里,它并不是必要的。因為它從來不接收數(shù)據(jù)~~~這里寫上,是因為:發(fā)射模式還有個東西,就是自動應(yīng)答功能,(當(dāng)然也是通過配置才能啟用的,不配置則不會自動應(yīng)答,也就不需要知道本機地址了)。
3@說到自動應(yīng)答,那就先說它吧。一般我們會想,發(fā)送出一幀數(shù)據(jù)后是不是應(yīng)該等待另一方回應(yīng)個數(shù)據(jù)呀?想法是好的,但我說了,有通訊協(xié)議在控制。因為我們這里只想設(shè)計成一直發(fā)送而不管對方是否收到。所以自動應(yīng)答可以不去配置,讓它開機默認(rèn)即可。但實際上我們的通訊協(xié)議可能很復(fù)雜,肯定不會是一直在發(fā)送。并且,它發(fā)送完一幀后,確實應(yīng)該轉(zhuǎn)為接收模式來等待對方發(fā)送應(yīng)答數(shù)據(jù)過來。我們?nèi)藶榈漠?dāng)然可以自己來個模式跳轉(zhuǎn),但是有自動應(yīng)答了,也就是說,當(dāng)你設(shè)定開啟自動應(yīng)答了,那么在它發(fā)送完一包數(shù)據(jù)后,芯片會立即轉(zhuǎn)為接收模式了! 对谶@里我也仍有一點沒理解,就是,當(dāng)它收到應(yīng)答后會變成什么模式呢,是自動再回到發(fā)送模式還是停留在接收模式!贰
4@有自動應(yīng)答了,那么就不能少了自動重發(fā)功能了。為什么呢。首先理解為什么會自動重發(fā),就因為它處在自動應(yīng)答模式時,通過接收數(shù)據(jù)來判定上次的數(shù)據(jù)是否有接收者成功接收了,就像我送出了一封信,如果你沒有回信我是不是會想你可能沒收到信,我需要再發(fā)一次。就是這個道理 。自動重發(fā)寄存器8位被分成兩個4位的小區(qū)域,高4位存的是重發(fā)間隔時間,也就是說總共可以設(shè)定為16種不同的間隔,在這個間隔時間過后仍沒有回應(yīng)才再次重發(fā)。低4位好說,就是存一個最大重發(fā)次數(shù)。則最大可以設(shè)為15,即重發(fā)15次后仍然沒回應(yīng)那就不理你了,不再重發(fā)了。并且還會產(chǎn)生一個中斷呢。最后再講中斷部分。 這里應(yīng)該注意的是,當(dāng)自動應(yīng)答功能禁止時,就沒有自動重發(fā)了,不管你設(shè)了重發(fā)多少次都不管用了。所以是互相影響的。還有就是重發(fā)次數(shù)設(shè)為0次,則相當(dāng)于禁自動重發(fā)了,這不是顯然的么。嘿嘿。
5@最基本的配置,,頻率。這個芯片不光能以2.4Ghz的載波發(fā)射呢,它的帶寬為2.4G----2.512G呢。這中間有一百多M的頻帶,可以劃分成2M一個的信道。這個寄存器中的值就標(biāo)明你想工作在哪個信道上啦,只有設(shè)置為同頻的設(shè)備才能接收的到很容易理解吧。比如你設(shè)為10信道,則10*2=20M即發(fā)送時所用的載波頻率就是2400+20=2420MHz。當(dāng)然也只有設(shè)為2420M的接收設(shè)備才能接收的到了。
6@功率,數(shù)據(jù)速率。這是什么呢?原來2401里邊也有自動增益控制部分,我們可以設(shè)定一個合適的功率來發(fā)射數(shù)據(jù),第一可以在能耗上有利,另一方面對通信距離的控制也是很重要的。比如我只想在2米內(nèi)能夠通信,但2401最大的通信距離可以達到上百米,顯然需要降發(fā)射功率來降低通信距離?蛇x的功率值有 0Dbm,-6dBm, -12dBm,-18dBm, 顯然0在這里是最大的發(fā)射功率了。開發(fā)時盡可能設(shè)為0.如果設(shè)為0時,接收者都接收不到數(shù)據(jù),那肯定是芯片壞了,就不用考慮降低功耗來通信了。這四檔功率,通信距離從遠(yuǎn)到近,從幾十米到幾cm.并且在通信過程中還可以動態(tài)更改這個功率值,以達到最佳匹配的效果。數(shù)據(jù)速率是什么呢,剛開始我跟SPI接口的速率搞混了,想著,一個4M的單片機跟芯片通信速率怎么可能到這么高的。其實不是,這個速率就是加在載波上的數(shù)據(jù)的碼率了。有兩個可選值,1Mb/s,2Mb/s.也就是說,1秒鐘能發(fā)送出去多少個高低電平。
以上這些配置命令之后就可以通過簡單的指令轉(zhuǎn)向發(fā)送模式了。下面就看一下,配置的偽指令吧:
1. sendCommand(TxAddress_5) .因為地址是3到5字節(jié)可選的,這里選擇了5字節(jié)的地址
2. sendCommand(LocalAddress_5),本機地址如果想要開啟自動應(yīng)答則必需與發(fā)射地址相同,即LocalAddress==TxAddress..不開啟則不需要相等。
3. sendCommand(EnableAutoAck_0),因為芯片自帶了6個通道,可以同時工作同時接收不同的數(shù)據(jù),所以這里的自動應(yīng)答也有相應(yīng)的6個bit位來分別控制。這里只允許通道0自動應(yīng)答。
4. sendCommand(EnableAutoTransmit) .只要上邊一句配置開了自動應(yīng)答,這句就應(yī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); 通過 config寄存器中的開機控制位 powerup=1,轉(zhuǎn)向空閑模式,config^0=0.轉(zhuǎn)向發(fā)射模式。
8.sendCommand(TxBuffer); 填充發(fā)送數(shù)據(jù)到緩沖區(qū)里邊。
8.CE=1; 這是一個引腳,用來控制從空閑模式向發(fā)送或接收模式跳轉(zhuǎn)的.僅將相應(yīng)位設(shè)為發(fā)送或接收模式不行,芯片現(xiàn)在只欠東風(fēng)了,就是CE=1并保持最少10us時間后。就會開始發(fā)送數(shù)據(jù)了。
一個幀數(shù)據(jù)發(fā)送完成后會產(chǎn)生中斷。這些中斷是可以屏蔽的,就像單片機的中斷允許控制一樣?刂莆辉赾onfig寄存器中。
這里還可能產(chǎn)生另一個中斷,就是重發(fā)次數(shù)達到上限了,你設(shè)了重發(fā)3次,那么重發(fā)3次以后還沒收到應(yīng)答就產(chǎn)生中斷了。同樣也是可屏蔽的。
下面說接收模式配置吧。
待續(xù)一下。
|
|