1. 程式人生 > >nRF24L01微控制器通訊的總結--看了就會用了

nRF24L01微控制器通訊的總結--看了就會用了

1周時間,我從一個沒用過STC微控制器,不知道什麼叫SPI介面的“文盲”,把nRF24L01的整個通訊過程弄到完全沒有bug.。興奮之餘來小屁一下。給那些正在奮鬥著這個牛逼的晶片的小牛們小炫一下。希望有所幫助。屁話少說。正題:

  基本的東西我理解了,那就是:1.用5根線的SPI介面向2401傳送資料或指令。2.晶片在每次上電的時候都需要進行一番配置。這些配置資料,就是所謂的指令了。3.配置完成後知道晶片處在哪個模式。並且知道它將要轉向哪個模式。4.通訊協議。5.觀察現象。

  好了,小牛們一定急切想知道自己的程式問題出在哪裡了,再小白一點的一定想急切的知道如何配置才能讓它工作。更小白一點的一定想知道這個晶片的各個模式之間是怎麼聯絡的。又是如何進行相互轉化的。別急,一個一個說。


  要說什麼最重要,你們不會想到其實是4.通訊協議。 

  為什麼呢,你們又知道在這裡的通訊協議是作什麼用的呢。 舉個簡單的例子,我剛開始設計的時候,一心想讓一個作為傳送模組,每隔一秒傳送一次資料,而另一個則作為接收模組,不間斷的檢測收到資料沒有。 這就是一個簡單的通訊協議,它是我們的目標。是我們的方向。當然真正的通訊協議絕對不會這麼簡單的幾句話。它告訴你,你理想中的模組應該充當什麼角色。是接收?是傳送?還是接收完了馬上傳送。作為開發階段,當然是越簡單的協議,正確性就越容易驗證,廢話不說,那就按我說的“通訊協議”來設計吧。

  先說傳送模式吧。

  要到傳送模式,要經歷幾個變化。第1,上電,上電完了晶片其實還是在powerDown模式,因為晶片為了省電,它需要通過軟體來控制開機或關機。powerDown模式就是所謂的待機模式了。這個模式理所當然是最省電的。它除了省電以外還能幹嗎呢?配置!對最重要的配置。就是可以通過 SPI口向它傳送資料,它是可以接收到的,並且可以正確寫入到指定的暫存器中的。一般我們在初始化中一開始就可以配置了,而此時晶片正是處在這個模式。


  第2.我們的目標是要把它配置的能傳送出去資料,而且能被目標裝置正確接收。所以這中間涉及的暫存器(當然是2401裡自帶的暫存器區了)有:

     [email protected]傳送到的目標地址。 說地址其實是虛的,它就相當於一個鑰匙和一把鎖一樣。當你在接收裝置裡邊規定了一個地址以後,那麼接收到的資料只有帶了這個地址的包才會被正確接收。所以說這裡的傳送目標地址就是接收裝置裡的本機地址。只要設計時兩個地址相同,就不會接收不到。

     [email protected]接收到的地址。 這個名字起的不是很好哈,有點誤導人。說白了就是一個本機地址了。在純發射機裡,它並不是必要的。因為它從來不接收資料~~~這裡寫上,是因為:發射模式還有個東西,就是自動應答功能,(當然也是通過配置才能啟用的,不配置則不會自動應答,也就不需要知道本機地址了)。


     [email protected]說到自動應答,那就先說它吧。一般我們會想,傳送出一幀資料後是不是應該等待另一方迴應個數據呀?想法是好的,但我說了,有通訊協議在控制。因為我們這裡只想設計成一直髮送而不管對方是否收到。所以自動應答可以不去配置,讓它開機預設即可。但實際上我們的通訊協議可能很複雜,肯定不會是一直在傳送。並且,它傳送完一幀後,確實應該轉為接收模式來等待對方傳送應答資料過來。我們人為的當然可以自己來個模式跳轉,但是有自動應答了,也就是說,當你設定開啟自動應答了,那麼在它傳送完一包資料後,晶片會立即轉為接收模式了。 《在這裡我也仍有一點沒理解,就是,當它收到應答後會變成什麼模式呢,是自動再回到傳送模式還是停留在接收模式。》 

     [email protected]有自動應答了,那麼就不能少了自動重發功能了。為什麼呢。首先理解為什麼會自動重發,就因為它處在自動應答模式時,通過接收資料來判定上次的資料是否有接收者成功接收了,就像我送出了一封信,如果你沒有回信我是不是會想你可能沒收到信,我需要再發一次。就是這個道理 。自動重發暫存器8位被分成兩個4位的小區域,高4位存的是重發間隔時間,也就是說總共可以設定為16種不同的間隔,在這個間隔時間過後仍沒有迴應才再次重發。低4位好說,就是存一個最大重發次數。則最大可以設為15,即重發15次後仍然沒回應那就不理你了,不再重發了。並且還會產生一箇中斷呢。最後再講中斷部分。 這裡應該注意的是,當自動應答功能禁止時,就沒有自動重發了,不管你設了重發多少次都不管用了。所以是互相影響的。還有就是重發次數設為0次,則相當於禁自動重發了,這不是顯然的麼。嘿嘿。

     [email protected]最基本的配置,,頻率。這個晶片不光能以2.4Ghz的載波發射呢,它的頻寬為2.4G----2.512G呢。這中間有一百多M的頻帶,可以劃分成2M一個的通道。這個暫存器中的值就標明你想工作在哪個通道上啦,只有設定為同頻的裝置才能接收的到很容易理解吧。比如你設為10通道,則10*2=20M即傳送時所用的載波頻率就是2400+20=2420MHz。當然也只有設為2420M的接收裝置才能接收的到了。

     [email protected]功率,資料速率。這是什麼呢?原來2401裡邊也有自動增益控制部分,我們可以設定一個合適的功率來發射資料,第一可以在能耗上有利,另一方面對通訊距離的控制也是很重要的。比如我只想在2米內能夠通訊,但2401最大的通訊距離可以達到上百米,顯然需要降發射功率來降低通訊距離。可選的功率值有 0Dbm,-6dBm, -12dBm,-18dBm, 顯然0在這裡是最大的發射功率了。開發時儘可能設為0.如果設為0時,接收者都接收不到資料,那肯定是晶片壞了,就不用考慮降低功耗來通訊了。這四檔功率,通訊距離從遠到近,從幾十米到幾cm.並且在通訊過程中還可以動態更改這個功率值,以達到最佳匹配的效果。資料速率是什麼呢,剛開始我跟SPI介面的速率搞混了,想著,一個4M的微控制器跟晶片通訊速率怎麼可能到這麼高的。其實不是,這個速率就是加在載波上的資料的位元速率了。有兩個可選值,1Mb/s,2Mb/s.也就是說,1秒鐘能傳送出去多少個高低電平。

     以上這些配置命令之後就可以通過簡單的指令轉向傳送模式了。下面就看一下,配置的偽指令吧:

    1. sendCommand(TxAddress_5) .因為地址是3到5位元組可選的,這裡選擇了5位元組的地址

    2. sendCommand(LocalAddress_5),本機地址如果想要開啟自動應答則必需與發射地址相同,即LocalAddress==TxAddress..不開啟則不需要相等。

    3. sendCommand(EnableAutoAck_0),因為晶片自帶了6個通道,可以同時工作同時接收不同的資料,所以這裡的自動應答也有相應的6個bit位來分別控制。這裡只允許通道0自動應答。

    4. sendCommand(EnableAutoTransmit) .只要上邊一句配置開了自動應答,這句就應答生效。即自動重發.

    5.  sendCommand(RF_CH). 這一句設定發射頻率。即設定通道。一般預設的就是0通道了,也即2.4G的載波。

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





    以上這些是發射模式的必要配置了。如果不涉及接收,那麼現在就可以轉向發射模式。

    7.sendCommand(Config); 通過 config暫存器中的開機控制位 powerup=1,轉向空閒模式,config^0=0.轉向發射模式。

    8.sendCommand(TxBuffer);  填充發送資料到緩衝區裡邊。

    8.CE=1;  這是一個引腳,用來控制從空閒模式向傳送或接收模式跳轉的.僅將相應位設為傳送或接收模式不行,晶片現在只欠東風了,就是CE=1並保持最少10us時間後。就會開始傳送資料了。

    一個幀資料傳送完成後會產生中斷。這些中斷是可以遮蔽的,就像微控制器的中斷允許控制一樣。控制位在config暫存器中。

    這裡還可能產生另一箇中斷,就是重發次數達到上限了,你設了重發3次,那麼重發3次以後還沒收到應答就產生中斷了。同樣也是可遮蔽的。

相關推薦

nRF24L01微控制器通訊總結--

1周時間,我從一個沒用過STC微控制器,不知道什麼叫SPI介面的“文盲”,把nRF24L01的整個通訊過程弄到完全沒有bug.。興奮之餘來小屁一下。給那些正在奮鬥著這個牛逼的晶片的小牛們小炫一下。希望有所幫助。屁話少說。正題:  基本的東西我理解了,那就是:1.用5根線的S

fish_redux使用詳解---

**說句心裡話,這篇文章,來來回回修改了很多次,如果認真看完這篇文章,還不會寫fish_redux,請在評論裡噴我。** ## 前言 來學學難搞的fish_redux框架吧,這個框架,官方的文件真是一言難盡,比flutter_bloc官網的文件真是遜色太多了,但是一旦知道怎麼寫,頁面堆起來也是非常爽呀,結

Linux戶和權限管理

CQ user In zhong bit 學習 pass table Go 前言 只有光頭才能變強 回顧前面: 看完這篇Linux基本的操作就會了 沒想到上一篇能在知乎獲得千贊呀,Linux也快期末考試了,也有半個月沒有寫文章了。這篇主要將Linux下的用戶和權限知

Echart使用,

最簡單的demo參照官網http://echarts.baidu.com/tutorial.html#5%20%E5%88%86%E9%92%9F%E4%B8%8A%E6%89%8B%20ECharts jquery載入: <script type="text/javascript"

Bootstrap中的datetimepicker用法,只一眼全懂

today boot lsp 簡單使用 key trap 寫法 put col 本文實例為大家分享了bootstrap datetimepicker日期插件的簡單使用,供大家參考,具體內容如下 首先在文件頭部引入必要的文件: 1 2 <link re

【轉】BBC解剖一個200斤女子,完你生命去減肥!

一個 是否 ID 中國 RM 過度 中國人口 理學 enter 此文有部分血腥的解剖畫面,如果無法忍受可以現在關掉頁面!   最近BBC有一部紀錄片震驚全球,   他們用最直觀的方式告訴你肥胖有對可怕,   紀錄片的名字叫——解剖肥胖!▼   紀錄片中,兩位解剖病理學專家

Word圖片大小總是對不齊,如何統一圖片的大小位置,一眼

還在為圖片大小位置不統一而發愁嗎,這樣做出來的word文件不美觀圖片看起來也是大小不一很不協調。今天就教大家幾個簡單的處理圖片的辦法,快來學習吧! 修改圖片預設環繞方式 大家在word中插入圖片的時候有沒有遇到這樣的麻煩,插入的圖片無法移動,必須要手動設定一下環繞方式才可以移動圖片,這樣做太費事

配環境配的心累,及時寫點部落格挺好,稍微一下記起來

影象檢測不錯的部落格講了maskrcnn https://blog.csdn.net/l297969586/article/details/71159675 labelme:用anaconda3+python3 ubuntu+gtx980+cuda8+cudnn6+tensorflow3

如何實現對函式的隱藏,

      當你寫了一個函式可以實現某些功能時,你要給其他人使用,卻不想讓別人看到你寫的函式的內容,這時你就可以通過對函式內容進行隱藏來達到目的,函式提供了對過程的封裝和細節的隱藏,那麼今天我們就來看看如何對函式進行隱藏:   這裡以上篇部落格寫的Sw

呼叫函式時,到底什麼時候要指標接收,不難理解(Swap交換函式為例)

在這裡我通過講解一個交換函式來講解一下什麼時候傳參需要用指標接收。   這裡先看一段程式碼,很多初學者對指標掌握不夠,經常會寫出這樣的程式碼: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include&

只要認真玩抖音,你的人生很快過去

我們使用時間的方式就是我們塑造自己的方式 ——羅振宇《時間的朋友》 不知道大家是否瞭解一個概念,叫「瓜子理論」,我摘抄了一下百度百科對它的定義 1、無論人們喜歡與否,很容易拿起第一顆瓜子; 2、一旦吃上第一顆,就會吃起第二顆、第三顆……停不下來;

檔案上傳七牛雲伺服器()

2018年11月13日星期日 隨筆 筆記 1、上傳檔案到七牛雲 註冊登陸到七牛雲,需要認證資訊才能建立個人儲存空間; 儲存區域介紹 最近更新時間:2018-09-09 15:49:21 儲存區域 地域簡稱 上傳域名

vue 移動端,頁面左右頁面切換效果(切換過程中出現白屏效果,布吉島怎麼優化,後來釋出前

<transition name="left"> <router-view v-if="getCms" class="Router"/> </transition> data() { names: 'left' } watch: { '$route'(to,

vue 移動端,頁面左右頁面切換效果(切換過程中出現白屏效果,布吉島怎麽優化,後來發布前

names out name watch bsp etc () nsf his <transition name="left"> <router-view v-if="getCms" class="Router"/> </transition

你的Scrum迭代夠精益嗎?全明白

Scrum與產品創新VUCA時代的產品產品(Product)是用來滿足人們需求和慾望的物體或無形的載體(服務)。虛擬產品和服務將會越來越多佔據人們的時間。然而產品研發中,需求文件永遠沒法完全被理解,實際使用者在看到實物之後可能都不知道自己要什麼,充滿互動的系統(軟體系統,以及近在眼前的AI人工智慧、VR虛擬現

Unity3D協程(Demo) 理解差不多

 voidStart()     {        Debug.Log("1");         St

iO開發 -Masonry學習,讓你一,一能上手專案

在這裡問下大家,用的約束方式是哪種?近年來,約束這件事情在開發中的分量越來越重,不同機型的問世,使得原來使用係數的開發人員苦不堪言,一開始約束的使用讓很多人很不習慣,網上給出的Demo也層出不全,沒有人真正告訴你該怎麼來寫一個tableview,怎麼來寫一個scrollView,這對於不

檔案下載的三種方式,這裡已經足夠

檔案下載一(不支援斷點續傳) 這種下載方式用的場合比較少,邏輯比較複雜,程式碼量也比較大。 主要的處理在兩個代理方法中 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLRes

完了成佛

一、人之所以痛苦,在於追求錯誤的東西。  二、與其說是別人讓你痛苦,不如說自己的修養不夠。  三、如果你不給自己煩惱,別人也永遠不可能給你煩惱。因為你自己的內心,你放不下。 四、好好的管教你自己,不要管別人。  五、不寬恕眾生,不原諒眾生,是苦了你自己。  六、別說

正則表示式實踐(

    匹配字母a可以 regex=a,匹配字母b可以 regex=b,匹配字母a或者b可以 regex=a|b,這個正則引入一個特殊字元“|”,專業名稱為“或”,你也可以叫它“豎線”,它表示“或”的意思。匹配字母a或者b或者c可以 regex=a|b|c,匹配字母a或者b或者c或者d可以 regex=a|b