欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

關于射頻芯片nRF24L01的一點知識(中文譯文)

作者:佚名   來源:本站原創   點擊數:  更新時間:2013年04月12日   【字體:

寫在前面的話:  

最近在做畢業設計,有一項任務是翻譯英文資料,要求翻譯成漢文約5K字。我以前從未做過翻譯工作,不過還是硬著頭皮做了下來。下面與大家分享一下我的譯文,如果大家能夠從我的譯文弄懂關于nRF24L01的一些知識,說明我的翻譯還是成功的;如果大家感到一頭霧水說明我還要繼續努力了。(當然要是IT相關的人才行,學文科的估計是看不懂的,嘿嘿)。對于nRF24L01,我是做畢設時要用才學習的,剛接觸,具體的我也不是很了解,所以才選了兩篇介紹nRF24L01的英文文章翻譯的。希望有高手不吝賜教!

 

 

第二章 :帶有增強型Shockburst的Sweet硬件鏈路層

引言

現在我有兩份有關學習24L01的放映片已經做好,而你仍然跟著我學習的話,這再好不過了!在這一章,我們將探討關于24L01的帶有增強型Shockburst的集成鏈路層。

 

開始之前應該了解的

在我們開始之前,你要知道這一章是建立在已經授完的第一章的基礎上的。事實上,對于每個主程序只有大約5行代碼或者更少是不同的。由于這個原因,如果你先打算讓這章代碼運行的話,最好在開始這章之前你已經將第一章的代碼運行過了。如果你只是想了解一些背景而不想要完全測試代碼,那么不考慮這些而繼續學習也是可以的。

差不多這一章與第一章的不同僅僅在于,在這一章,我們將用增強型的Shockburst模式去處理nRF24L01的硬件鏈路層。這種模式允許我們讓 24L01能自動的處理應答信號和重發數據。這種功能的實現不需要額外的硬件甚至不需要額外的代碼,這使得我們工作的鏈路層功能比以前更為強勁。唯一不好的是如果采用這種模式,鏈路的速度會稍微有所下降,但是只要你不需要24L01提供帶寬的每一個部分,增強型的Shockburst模式顯然是非常合適的。

 

Nutshell中的增強型Shockburst

你也許想知道增強型Shockburst到底是什么。它實質上是24L01硬件中可以被執行的一種模式,這種模式下系統會接受數據接收的應答信號,并且在數據丟失的情況下系統會自動的重發。當需要一個強勁的鏈路使得傳輸大部分數據的時候,增強型Shockburst模式可以將用戶從繁重的軟件工作中解脫出來。

如果你非常熟知英特網協議,那么使用增強型Shockburst模式很像使用TCP,而常規的Shockburst就像是網絡協議中的UDP。然而增強型 Shockburst并不像TCP那樣建立和關閉一個連接,它提供的是某種可以使你的數據順利傳輸的不完全擔保。和TCP類似,增強型 Shockburst對于沒有應答(這種應答是由接收端的增強型Shockburst發出的)的數據,會重發很多次直到達到它設置的最大重復次數而形成中斷標志。

有一些寄存器和控制增強型Shockburst模式有關。EN_AA寄存器通過置1和置0打開或者關閉每個數據通道的自動應答功能。當一個發送的數據沒有應答的時候,可以在SETUP_RETR寄存器的ARC區域設置你想要重發的次數(設置成0000代表不重發)。在SETUP_RETR寄存器的ARD區域可以設置兩次重發操作之間的時間間隔(數值越低,時間越短)。你可以利用CONFIG寄存器的MAX_RT中斷使能位將MAX_RT中斷的狀態傳達給 IRQ針腳。你也可以利用STATUS寄存器的MAX_RT位來判斷MAX_RT是否中斷。

增強型Shockburst的設置很簡單。首先,你需要確定在發射設備中,通道0的接收地址(在RX_ADDR_P0 寄存器)和你的發射地址(在TX_ADDR寄存器)要相同。這是因為是通過發射設備中的通道0來接收應答信號的。其次,你要確保發射設備的通道0的自動應答和接收端的某一個你用來接收信號的通道正常工作。最后,你要在發射端的SETUP_RETR寄存器中設置最大重復次數和重發延遲時間。

一旦增強型Shockburst模式設置完畢后,一切都變得明朗了,因為所有的操作都是自動完成的。你真正要做的是你要觀察MAX_RT中斷或者觀察 TX_DS中斷,因為某一時刻你得到的是二者之一的結果,而二者不會同時中斷。如果數據被發送并且接收到了應答信號,然后TX_DS就會中斷。如果沒有收到數據發送成功的應答信號,在達到設置的最大重發次數之前,MAX_RT也會中斷。

在這里,增強型Shockburst模式和常規Shockburst模式有一個非常重要的區別需要引起注意。在增強型Shockburst模式中,如果數據被成功發送,TX_DS中斷后,像在常規Shockburst模式下一樣,TX FIFO中的數據就會被清除;然而,如果數據被發送后沒有收到應答信號,然后MAX_RT中斷,但是數據并不會從TX FIFO中清除。換句話說,如果你想要重發數據,你只需重置CE就可以重發了。然而,如果你想要丟棄這個數據,在你加載任何新的數據之前,你必須清除TX FIFO。否則,24L01會嘗試發送原本未發送成功的數據和你后來加載的要發送的數據,這樣會擾亂你的發送進程。

 

本章我所用的硬件

本章我用的硬件和在第一章里用的是一樣的。沒有任何增減,只要你在學第一章的時候讓硬件工作,那么在這一章里你肯定可以讓它工作。

 

本章軟件描述

情況和需要的硬件類似,本章所需要的軟件和第一章的是一樣的,如果你已經運行過了,那么在本章中,你將有非常清晰的思路。

 

本地主文件:maintutorial2local.c

假如你看過第一章,那么這個文件對你來說極其熟悉。除了要加上用來支持增強型Shockburst的代碼外,操作方式和在運行第一章程序時一樣。

在進入主程序之前的部分是相同的。仍然要調用Initialize()函數,但是考慮到增強型Shockburst模式的使用,這里會稍有不同:當我們調用nrf24l01_intialize_debug()函數的時候,可以給第三個參數賦值,這樣就可以使數據通道0工作在增強型Shockburst模式下。

現在我們來進入程序的主循環。在這我們接收從USART來的數據,然后就像第一章我們做的那樣把字節發送出去。然而,這里就是程序的不同之處。當你使用增強型Shockburst模式,你必須留意MAX_RT中斷,這個中斷會被加入到檢查數據是否發送成功的while循環中。在增強型Shockburst 模式下傳輸數據,如果數據沒有傳輸成功,TX_DS是不會中斷的。這就是你為什么兩個中斷都要觀察。

有一點還需要另外說明。當我們檢測MAX_RT是否中斷的時候,如果沒有中斷我們就像第一章那樣處理數據;然而,如果中斷了,這表示數據沒有被成功的接收,我們添加一個調試字符“*”來反映這種信息。當數據從本地單位發出后如果沒有收到應答信號,通過那種方式我們可以判斷出在接收端是否數據被傳輸到了遠程單位。正如我上面討論的那樣,當MAX_RT中斷后,數據仍留在TX FIFO。由于這個原因,我們調用nrf24l01_flush_tx()函數來清除數據。最后我們清除中斷,讓循環繼續,這樣我們就可以繼續接受來自 USART的數據了。

 

遠程主文件:maintutorial2remote.c

就像本地主文件一樣,遠程主文件和第一章用的基本一樣,它也是只在其中加入了使增強型Shockburst模式啟動并運行的部分。

在主程序之前的所有聲明和定義和第一章中的遠程主文件是一樣的。進入主程序,我們也要調用Initialize()函數,但是考慮到增強型 Shockburst模式的使用,這里會稍有不同:當我們調用nrf24l01_intialize_debug()函數的時候,可以給第三個參數賦值來啟動增強型Shockburst模式,這和在本地主文件中的情況是一樣的。

調用Initialize()函數后。我們進入主程序循環。在這,我們等待并接收數據。一旦接收到數據,我們通過RF鏈路將數據發送。一旦我們將數據發送后,我們必須注意TX_DS和MAX_RT中斷,保證它們沒有被屏蔽。無論數據被成功的發送或者發送失敗被忽略(TX_DS和MAX_RT都能夠正常中斷),我們清除中斷,程序又回到循環的開始。

 

程序輸出

在圖一里,你可以看到終端的窗口里的程序正在運行。24L01互相之間距離很近(大約是6英寸),所以有極高的數據發送成功率。事實上只有一個數據沒有發送成功。這個數據在程序的第三行第三個字節的“*”處,而這個星號代表發生了MAX_RT 中斷。

 

  圖一:終端的輸出窗口

 

結論

現在,你應該對增強型Shockburst有了更深刻的了解。如果你有任何問題,可以在合適的時候發Email給我:brennen@diyembedded.com


 

第三章:多通道通信

                          

 

引言

在這一章,我將向你們展示怎么樣設置nRF24L01來利用它的六個數據通道進行通信。這對你們中的要做網狀網絡和其他應用的人來講是很急迫的。和以前的要求一樣,在繼續學習之前,你要熟知前面的章節(尤其是第零章、第一章)。

 

數據通道的構架

通道的概念非常容易理解。每一個通道實質上就是一個接受數據的地址(當處于接受模式時)。這就意味著24L01可以同時成為六個不同的數據接受者。

你會問,這對你有什么好處呢?雖然有一些多通道通信的用途,但是我能立即想起來的卻不多。你可以將一個通道設置成數據通道,同時你可以將另一個設置成控制通道。你也可能讓一個接受通道有不同的功能,讓它完成相當于它接受數據的那個通道的工作。你的想象也僅限于此。

當你使用多通道時有幾點要時刻注意。首先,所有的通道到用相同的RF信道(無論用哪個信道都可以在RF_CH寄存器中設置)。如果你使用增強型 Shockburst模式。為了收到應答信號,發送端的發送地址和通道0的接受地址(分別存在TX_ADDR和RX_ADDR_P0寄存器中)必須相同。這是一項繁瑣的工作,因為你想要將數據發往不同的地址必須要改變兩個地址。但是如果使用nRF24L01程序庫,若你準備改變發送地址,則只需要幾行代碼就可以改變RX_ADDR_P0寄存器中的地址。正如旁白所言,在本章并不使用增強型Shockburst模式但一樣可以將問題解釋的盡可能清楚。

 

多輸入多輸出

在本章,所有的設置和在第一章或者第二章中是一樣的。這包括將一個計算機網絡的節點(uC 和 24L01))連接到你PC機上的型號為9600-N-1的串口,并且沒有流量控制。其他的節點基本上是獨立的。

在本章,我們的目標是測試遠程單位的每一個從本地單元發來的數據,并且把統計結果顯示出來。在操作中,本地單元會將它的發射地址和遠程單元通道0的接收地址設置成一樣的。然后發送一個字節,等待接收方將字節發回。如果返回字節和發送字節是一樣的,那么就可以說我們的測試是成功的。這樣的操作會連續做5次,整個進程是對24L01的其它五個通道進行測試,結果都會被記錄下來。最后,全部的統計結果會按照進行計算,24L01會將每個數據通道傳輸的結果和全部得分顯示在屏幕上。

 

本章我所用的硬件

本章我用的硬件和在第一章里用的是一樣的。沒有任何增減,只要你在學第一章的時候讓硬件工作,那么在這一章里你肯定可以讓它工作。

本章軟件描述

情況和需要的硬件類似,本章所需要的軟件和第一章的是一樣的,如果你已經運行過了,那么在本章中,你將有非常清晰的思路。

本地主文件:maintutorial2local.c

這個是本地單位的主驅動文件。這個文件是在第一章的主文件的基礎上編制而成。因為要使用多通道通信,所以文件中有相當一部分是需要修改的。

首先,頭文件和宏定義是一樣的。從程序的34行開始,我們會添加一些新的代碼。第一個要添加的是Ping()函數。它會按照剛才我們敘述的那樣工作:向發送端發送一個字節的數據,然后等待對方回發。除了用發送字節0xFF的操作代替讀取從UART傳來的數據的操作外,其他的本程序的內容和第一章的內容是一樣的。在程序的36行和37行要進行一些設置,包括:進行測試的次數,每個通道進行測試的次數,以及在兩個測試之間的時間間隔。

在主函數中,我們通過定義一些變量來計算次數、存儲每個通道的成功測試的結果、當前的發送地址以及總共的成功測試。仍然要調用Initialize() 函數,對本地24L01的設置和第一章的是一樣的(包括發送地址,發送數據一個字節,常規Shockburst模式)。

調用Initialize() 函數后,我們要修改一下主程序循環。首先,我們將每個通道成功測試次數設置為0。然后打出一條信息,讓用戶知道我們已經開始檢測了。

接下來的循環是用來執行對每個通道的檢測的。循環要執行六次,每一次檢測一個通道。首先,switch語句設定了要重復的次數,在每次重復的時候讓本地單位的發射地址和遠程單位的接收通道的地址一致。通道0和通道1的地址都需要進行設定,但是對于通道2-5只需要對最低有效位(LSB)進行設置,因為它們地址的高位和通道1是一樣的,而通道1的地址已經加載到了TX_ADDR寄存器中。發送地址設置完成后,檢測通道的次數賦值在變量NUM_PINGS中(默認值是5)。如果測試成功一次,計數的變量就會加1。最后通道檢測的統計結果會顯示出來。

一旦所有的通道檢測完畢后,我們打出一條信息來說明對于總共的測試共有多少次是成功的。然后我們將變量PING_DELAY中的延時時間增加用LED來顯示循環結束。重復執行主循環即可。

 

遠程主文件:maintutorial3remote.c

和第二章的遠程主文件一樣,maintutorial3remote.c和第一章所用的主文件基本類似。唯一的不同是在這里我們使得六個數據通道都能夠工作,這樣可以進行多通道通信。

這些差異表現在程序的71行到91行。首先要調用nrf24l01_initialize()函數。在調用函數的第一行,我們對CONFIG寄存器進行設置:以字節為單位的循環冗余校驗,選定上電模式,接收模式。第二行取值為真時,RX功能就能夠立即啟動。第三行設置各通道為非自動應答,第四行開通所有通道。除了RX_PW_P*寄存器,剩余的寄存器都保持在它們的默認初態。將它們設置成能接收一個字節的數據存量,這樣就能用它們接收數據了。

如果你沒有學習過第一章,這里有一個對程序的詳細說明。等到24L01接收到數據程序就開始工作。接收數據完畢后,它會向本地單位的通道0回發數據。然后程序回到循環的開始繼續等待數據。

遠程單位可以通過所有的通道接收數據,對數據處理的差異根據接收數據通道的不同而不同(當然在這里這個例子不會演示)。程序中是這樣實現的,函數 nrf24l01_read_rx_payload()會返回狀態寄存器的值,值中包含當前通信數據的數據通道的數量。將這個值賦給函數 nrf24l01_get_rx_pipe_from_status(),這樣就可以根據發送來的數據返回給變量pipe一個數值。考慮下面的這個例子:

unsigned char data, status, pipe;

status = nrf24l01_read_rx_payload(&data, 1);

pipe = nrf24l01_get_rx_pipe_from_status(status);

switch(pipe)

{

case 0://process case 0

break;

case 1://process case 1

break;

case 2://process case 2

break;

default://process any other pipe

}

這段代碼可以讀取發送過來的數據(假定它是存在的,所以你應該編制代碼來確保RX FIFO寄存器中有數據)和狀態寄存器中的狀態值。然后就得到了基于狀態寄存器的通道編號,用switch語句就可處理這些數據。我很喜歡用switch語句來處理離散的數值問題。當然,你也可以用if語句或者C語言中的其它結構語句。

程序輸出

在圖一里,你可以看到終端的窗口里的程序正在運行。24L01互相之間距離很近(大約是6英寸),所以有極高的數據發送成功率(和第一章、第二章的情況一樣)。可以看到對通道的所有測試結果。

 

圖一:終端輸出窗口

結論

現在,你應該對24L01提供的六個數據通道進行多通道通信有了更深刻的了解。如果你有任何問題,可以在合適的時候發Email給我:brennen@diyembedded.com

關閉窗口

相關文章