NRF905參考程序參考教程包含多個實例和解釋復(fù)習(xí)進程_第1頁
NRF905參考程序參考教程包含多個實例和解釋復(fù)習(xí)進程_第2頁
NRF905參考程序參考教程包含多個實例和解釋復(fù)習(xí)進程_第3頁
NRF905參考程序參考教程包含多個實例和解釋復(fù)習(xí)進程_第4頁
NRF905參考程序參考教程包含多個實例和解釋復(fù)習(xí)進程_第5頁
已閱讀5頁,還剩62頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、Good is good, but better carries it.精益求精,善益求善。NRF905參考程序參考教程包含多個實例和解釋-NRF905程序參考教程。本資料主要是將程序中各部分子程序的功能與NRF905的手冊相關(guān)聯(lián),使得各位同仁在每個子程序為什么這么寫都在手冊中找到具體的體現(xiàn),特別是寄存器配置。內(nèi)涵完整參考程序,是100%可用程序。硬件的連接方法在參考程序之后,并介紹原理。本人最后只是為了提供給大家一個入門的資料或是引子罷了,至于如何應(yīng)用的巧妙那是后期編程巧妙的結(jié)果,目前只是給剛進門的人士一個可以快速理解和掌握的淺顯易懂的教程罷了。本人疏忽之處還請見諒。按照慣例先展示作品拋磚引

2、玉:四路AD采集+溫度采集彩屏顯示信息數(shù)據(jù)GSM手機電話最近做的,音頻功放四路電機控制大功率led控制,不解釋。以前做的,舵機和攝像頭,不解釋。更早先的,VGA顯示,不解釋。已發(fā)送為例子。1.通過spi接口把寄存器相應(yīng)的值寫到905中2.把要發(fā)的數(shù)據(jù)寫到905中3.把狀態(tài)設(shè)置成發(fā)送4.數(shù)據(jù)被發(fā)出那么操作905就主要是前三步的問題,那么請帶個這前三個問題深入理解下面的相關(guān)解釋了。無線通信模塊的三個要素:Nrf905模式的配置Nrf905通過寄存器配置Nrf905需要spi通信配置寄存器先看模式配置:程序加解釋PWR_UPTRX_CETX_EN操作模式0XX斷電和SPI編程10X待機和SPI編程1

3、10射頻接收模式111射頻發(fā)送模式根據(jù)這個圖表,我們發(fā)覺有四種模式。撿重點的說實現(xiàn)收發(fā)功能有兩種模式。這兩種模式在程序段中的實現(xiàn)是:設(shè)置成接受模式,程序中沒寫PWR_UP,如果他是低電平就變成斷電,所以個程序段默認(rèn)PWR_UP為高電平。voidSetRxMode(void)TXEN=0;TRX_CE=1;Delay(1);/delayformodechange(=650us)設(shè)置發(fā)送模式,這里會有疑問,在于TRX_CE=0;。這里給出的解釋是,如果我們直接寫TRX_CE=1;這樣模塊立即將其內(nèi)部所寫好的數(shù)據(jù)發(fā)送出去。而對于編程的人員來說編出的程序五花八門,就比如說這條,改程序員的意圖并不想讓設(shè)

4、置發(fā)送模式時,數(shù)據(jù)就被立即發(fā)出,所以寫了TRX_CE=0;。如果看后面的完整程序,你會發(fā)現(xiàn)在發(fā)送時,有TRX_CE=1;這一步。所以說,剛才那個圖表沒有問題。這里可以認(rèn)為是準(zhǔn)備發(fā)送模式,而不是發(fā)送模式,一旦TRX_CE=1;那么數(shù)據(jù)立即被發(fā)送。voidSetTxMode(void)TRX_CE=0;TXEN=1;Delay(1);/delayformodechange(=650us)關(guān)于圖表中前兩種模式中,實例程序所應(yīng)用的是第二種,即待機spi編程模式。不管應(yīng)用兩種的哪一種,都是為了spi編程(通過spi通信配置905寄存器)。那么給出這個模式的應(yīng)用程序段:有這么做引腳賦予各種電平先不用管他,

5、我們看到PWR=1;TRX_CE=0;TXEN=0;這三個,在待機spi模式中TXEN=x;即可以為任何值。說明現(xiàn)在是待機且spi編程模式。程序段中其他引腳功能羅列下:Csn:spi的有效與否的引腳,低電平有效。如果只是單純的設(shè)置模式,該引腳并沒用處,只是后期程序的編寫,所以做下配置。Sck:spi的時鐘,現(xiàn)在只是設(shè)置模式,還沒開始spi通信,所以付個低電平。DR:數(shù)據(jù)是否準(zhǔn)備好,現(xiàn)在沒有什么可準(zhǔn)備的。AD,CD也是一樣,等到spi通信的時候才需關(guān)系。這里做個引子吧。voidnRF905Init(void)CSN=1;/SpidisableSCK=0;/SpiclocklineinitlowD

6、R=0;/InitDRforinputAM=0;/InitAMforinputCD=0;/InitCDforinputPWR=1;/nRF905poweronTRX_CE=0;/SetnRF905instandbymodeTXEN=0;/setradioinRxmodeNrf905寄存器的配置配置905寄存器的意思是,通過spi傳輸一個值,放入905的寄存器中,這個值可以讓905傳輸數(shù)據(jù)時,產(chǎn)生各種你想要的效果,類似于你用手調(diào)節(jié)耳機音量,你的手就相當(dāng)于配置耳機的寄存器。那么我先給出主要需配置的寄存器然后再解釋.如下面這個程序段:unsignedcharidataRFConf11=0 x00,/

7、配置命令/0 x4c,/CH_NO,配置頻段在430MHZ0 x0c,/輸出功率為10db,不重發(fā),節(jié)電為正常模式0 x44,/地址寬度設(shè)置,為4字節(jié)0 x04,0 x04,/接收發(fā)送有效數(shù)據(jù)長度為32字節(jié)0 xCC,0 xCC,0 xCC,0 xCC,/接收地址0 x58,/CRC充許,8位CRC校驗,外部時鐘信號不使能,16M晶振;0 x00,/配置命令/后面的講解中會說,所以大家從第二個開始看。CH_NO的意思如下,通過以下解釋設(shè)置不同的值,可以讓905工作在不同頻段,這個需要的話再做詳解,不需要,可以照搬默認(rèn)值,或者程序。CH_NO9和HFREQ_PLL一起進行平率設(shè)置(默認(rèn)值=001

8、101100b=108d).fRF=(422.4+CH_NOd/10)*(1+HFREQ_PLLd)MHz于是乎相關(guān)的就引出以下這個寄存器HFREQ_PLL1使PLL工作于433或868/915MHz模式(默認(rèn)值=0).0工作于433MHz頻段1工作于868or915MHz頻段在這里給出個表格,如需更改該值可以參照:工作頻率HFREQ_PLLCH_NO430.0MHz0001001100433.1MHz0001101011433.2MHz0001101100434.7MHz0001111011862.0MHz1001010110868.2MHz1001110101868.4MHz1001110

9、110869.8MHz1001111101902.2MHz1100011111902.4MHz1100100000927.8MHz11100111110 x0c,/輸出功率為10db,不重發(fā),節(jié)電為正常模式這里做下說明:我們拆分看看這段話。輸出功率為10db不重發(fā)節(jié)電為正常模式輸出功率為10db,這個對于的寄存器是:如下表,二進制10db應(yīng)該是11PA_PWR2輸出功率(默認(rèn)值=00).“00”10dBm“01”2dBm“10”+6dBm“11”+10dBm不重發(fā),針對的寄存器是:不管怎么說,部分都不自動重發(fā)(一般情況),故二進制是0AUTO_RETRAN1如果TRX_CE和TXEN為高時,自

10、動重發(fā)(默認(rèn)值=0).0不重發(fā)1數(shù)據(jù)包重發(fā)節(jié)電為正常模式,針對的寄存器是:如下表,要是正常模式則二進制是0RX_RED_PWR1接收方式節(jié)能,工作電流1.6mA.靈敏度降低(默認(rèn)值=0).0正常工作1節(jié)能模式那么如下結(jié)論:輸出功率為10db-11不重發(fā)-0節(jié)電為正常模式-0按順序?qū)憚t是:1100-000011000 x0C0 x44,/地址寬度設(shè)置,為4字節(jié)如下面兩個表:收地址寬度:4字節(jié)的2進制是100RX_AFW3接收地址寬度(默認(rèn)值=100).0011byteRX地址1004byteRX地址發(fā)地址寬度:4字節(jié)的2進制是100TX_AFW3發(fā)送地址寬度(default=100).0011b

11、yteTX地址1004byteTX地址于是乎:100并上100,可認(rèn)為是0100并上0100,可認(rèn)為是4并上4,則可認(rèn)為是0 x44.0 x04,0 x04,/接收發(fā)送有效數(shù)據(jù)長度為32字節(jié)這條命令是我擅自更改的,更改前是2字節(jié),如是0 x04這是32字節(jié)。這樣可以使905在一個數(shù)據(jù)包內(nèi)傳輸更多信息。那么我給出兩個寄存器。RX_PW6接收數(shù)據(jù)寬度(默認(rèn)=100000).0000011byte接收數(shù)據(jù)寬度0000102byte接收數(shù)據(jù)寬度10000032byte接收數(shù)據(jù)寬度TX_PW6發(fā)送數(shù)據(jù)寬度(默認(rèn)=100000).0000011byte發(fā)送數(shù)據(jù)寬度0000102byte發(fā)送數(shù)據(jù)寬度.100

12、00032byte發(fā)送數(shù)據(jù)寬度這里要把碼補全,100000001000000 x40這里實際是0 x40一點沒錯但是程序中寫的是0 x04,仔細想想,也沒什么特別的問題。這里我水平有限,不做說明了。0 xCC,0 xCC,0 xCC,0 xCC,/接收地址一看就知道,地址被從新改了下,默認(rèn)地址是E7這種。RX_ADDRESS32發(fā)送地址標(biāo)識,使用字節(jié)取決于RX_AFW(默認(rèn)值=E7E7E7E7h).0 x58,/CRC充許,8位CRC校驗,外部時鐘信號不使能,16M晶振CRC_EN1CRC校驗可用(默認(rèn)值=1).0不可用1可用CRC_MODE1CRC模式選擇端(默認(rèn)值=1).08位116位UP

13、_CLK_EN1輸出時鐘可用(默認(rèn)值=1)0外面沒有可用的時鐘信號1外面有可用的時鐘信號XOF3晶振頻率端,必須與外部的晶振頻率相對應(yīng)(默認(rèn)值=100).0004MHz0018MHz01012MHz01116MHz10020MHz這塊看著有點亂的話,請繼續(xù)往后看。我們既然把相關(guān)寄存器的配置解釋了一邊,但是如果對于一個編程序的人,或者程序開發(fā)來說,這樣的羅列雖然我們能弄懂每個寄存器是咋回事,但是實際編程并自己配置寄存器的話,難度是很大的。幸好,開發(fā)手冊解決一切問題,下面是一個表,表的后面我有解釋。寄存器內(nèi)容射頻器配置寄存器(R/W)字節(jié)位內(nèi)容7:0,最高有效位7初始值0CH_NO7:00110_

14、11001bit7:6notused,AUTO_RETRAN,RX_RED_PWR,PA_PWR1:0,HFREQ_PLL,CH_NO80000_00002bit7notused,TX_AFW2:0,bit3notused,RX_AFW2:00100_01003bit7:6notused,RX_PW5:00010_00004bit7:6notused,TX_PW5:00010_00005RX_ADDRESS(deviceidentity)byte0E76RX_ADDRESS(deviceidentity)byte1E77RX_ADDRESS(deviceidentity)byte2E78RX_

15、ADDRESS(deviceidentity)byte3E79CRC_MODE,CRC_EN,XOF2:0,UP_CLK_EN,UP_CLK_FREQ1:01110_0111解釋:這是手冊中的一張表,假設(shè)寄存器的配置值是如圖給的這些。那么他的傳輸是從0字節(jié)開始到9字節(jié)截止,按順序把16進制碼傳進去,你的工作就完成了。而你需要對那個寄存器進行微小的改動,只需找到手冊相關(guān)寄存器的說明進行改動就可以了。我們從上表中摘出一個小表看,小表如下:bit7notused,TX_AFW2:0,bit3notused,RX_AFW2:00100_0100bit7就是該值得第七位,第七位沒用上。TXAFW【2:0

16、】意思是有三位被這個寄存器用了。等等。通過這種字節(jié)的劃分,將寄存器的配置變成了傳多個2位十六進制數(shù),使得寄存器的配置變得博大精深,新手上手困難。不過對于驅(qū)動其他芯片也一樣,配置寄存器就是這樣配置的。像是某些器件如saa7113等芯片,配置寄存器時,前面還有地址,弄得更加復(fù)雜。所以大家要通過學(xué)習(xí)nrf905了解芯片的驅(qū)動方法這才是關(guān)鍵。spi通信:如何實現(xiàn)spi通信,在這個問題上,如果說正常學(xué)習(xí)應(yīng)該是,先知曉spi的協(xié)議,spi的時序,spi寫和讀的時序和協(xié)議。但是如果將其看成程序的話就比較方便。咱們用程序談這件事情。該程序段式spi的寫程序:從MOSI=(bit)(b&0 x80);我們分析下

17、。假設(shè)b=abcdefgh那b&0 x80就是abcdefgh&10000000可以想象a被提取了出來。至于bit,其實可以沒有,這里可以參考c51語言關(guān)于與有兩個做法,一個是&,另一個是&,即位與和整個值得與。之后我們觀察sck的變化,sck是spi的時鐘,我們發(fā)現(xiàn)從0到1然后回到0,這是sck的變化。在sck變到1之前,mosi已經(jīng)有了一個值,那么當(dāng)sck=1;的時候,也就是所謂的上升沿,mosi被寫入,這里可以認(rèn)為是寫入905的內(nèi)部了。b=1;這個語句等同于b=b1;意思是b左移一位的新值付給b,比如b=abcdefgh左移一位,那么b=bcdefgh0,再左移一位,那么b=cdefgh

18、00,以此類推左移8次之后b=00000000.因為每移出一位,就代表著移進一位,移進的是0。那么觀察一下0 x8010000000這個數(shù)10000000與上abcdefgh之后會提取出a左移之后,再次進行與運算,就會提取出b,循環(huán)往復(fù)abcdefgh就都提取出來了。并在每一次都把這個值付給了mosi。我想通過梳理,大家應(yīng)該能看懂了,至于spi的通信協(xié)議,大家可以參考下網(wǎng)上資料,我想看懂了程序,再看看資料應(yīng)該能徹底明白了。voidSpiWrite(ucharb)uchari=8;while(i-)Delay(10);SCK=0;MOSI=(bit)(b&0 x80);b=1;Delay(10)

19、;SCK=1;Delay(10);SCK=0;讀Spi程序段:_nop_();_nop_();是延時,延時是一個指令周期的時間。說白了,就是延時一段時間。ucharddata=0;這條語句意味著ddata是完全為0的。且注意一個事情ddata的定義是uchar,那么他的值最大能到0 xff。ddata|=MISO;等同于ddata=ddata|miso;miso是一個引腳的電平。經(jīng)過這條語句后ddata的最低位就是miso當(dāng)時的電平了,這時左移再次提取新的miso電平,當(dāng)八個電平都提取之后,ddata的值就提取完成了。同樣sck是spi時鐘,想提取下一個miso的值必須讓時鐘波動一次。ucha

20、rSpiRead(void)uchari=8;ucharddata=0;while(i-)ddata=1;SCK=0;_nop_();_nop_();ddata|=MISO;SCK=1;_nop_();_nop_();SCK=0;returnddata;到此為止,905的基本問題講完了。那么我們把它串聯(lián)在一起。我們先宏觀的看下。以發(fā)送流程為例905現(xiàn)處于待機spi編程狀態(tài)向905中傳送寄存器值將905的狀態(tài)設(shè)置為發(fā)送狀態(tài)成功發(fā)出-待機狀態(tài)如果想再發(fā)個數(shù)據(jù),那么他的流程將變成將905的狀態(tài)設(shè)置為發(fā)送狀態(tài)成功發(fā)出待機狀態(tài)由此看來對同一個對象進行發(fā)送,如果大家的設(shè)置都沒改的話,寄存器的值只需設(shè)置一次

21、。剩下的就是重復(fù)發(fā)送到待機這個環(huán)節(jié)了。那么在之前的問題,大家都了解了,剩下的就是到把數(shù)據(jù)發(fā)送這一塊了。這里我分為三個部分說這件事情。向905傳輸一個命令向905裝入待發(fā)送的數(shù)據(jù)、把數(shù)據(jù)發(fā)出去向905傳輸命令:這里定義了這些命令,先在語法上說下#defineWC0 x00的意思等價于wc=0 x00;那么我們先解釋下這幾個命令,大家理解下。#defineWC0 x00#defineRC0 x10#defineWTP0 x20#defineRTP0 x21#defineWTA0 x22#defineRTA0 x23#defineRRP0 x24如下是wc的解釋:在講解配置寄存器是有個值我沒有講解先

22、在我告訴大家指令名稱指令格式操作W_CONFIG(WC)0000AAAA寫配置寄存器AAAA指明哪個字節(jié)。寫操作從哪個字節(jié)開始取決于地址AAAAunsignedcharidataRFConf11=0 x00,/配置命令/。0 x00,/配置命令/這就意味著wc=0 x00,意思就是從0字節(jié)開始進行寫操作。舉個例子看下,0字節(jié)代表的是哪個寄存器,寄存器內(nèi)容射頻器配置寄存器(R/W)字節(jié)位內(nèi)容7:0,最高有效位7初始值0CH_NO7:00110_1100寫之后的操作就是開始寫1字節(jié),這點上沒什么問題最后寫到第九字節(jié)。前面有這個表的完整版,大家可以翻著看。#defineRC0 x10的解釋如下:這個

23、看表就知道不做解釋了跟wc意思差不多。R_CONFIG(RC)0001AAAA讀配置寄存器AAAA指明哪個字節(jié)。讀操作從哪個字節(jié)開始取決于地址AAAA后幾個命令都好理解我就都列出來大家自己吸收下:那么到此,命令部分就說完了,能用的就這幾個命令。向905裝入待發(fā)送數(shù)據(jù):向905裝入數(shù)據(jù)這件事情和剛才的命令結(jié)合著說。先看以下程序段:SpiWrite(WTP);/Writepayloadcommandfor(i=0;i4;i+)SpiWrite(TxRxBufi);/Write32bytesTxdata先傳了wtp命令,之后把txrxbuf數(shù)組中的前4字節(jié)傳了進去。那么執(zhí)行外這條之后,數(shù)據(jù)就被傳到9

24、05中了(還沒有進行發(fā)送)。觀察此函數(shù),發(fā)現(xiàn)調(diào)用了spiwrite這個函數(shù),說明裝入命令和裝入數(shù)據(jù)都是通過spi通信進行傳輸?shù)?。觀察以下程序段:SpiWrite(WTA);/Writeaddresscommandfor(i=0;i4;i+)/Write4bytesaddressSpiWrite(TxAddressi);TxAddressi和SpiWrite(WTA);是其中的要素,wta是寫地址命令,那么TxAddressi就是地址咯,地址前面說過了,程序中除了那個config數(shù)組中有地址的說法,另外在程序段中被單獨列出的地方是codeTxAddress4=0 xcc,0 xcc,0 xcc,

25、0 xcc;那么通過這個程序段,功能就是把地址寫進去。以上的兩個程序段完成了數(shù)據(jù)和地址的寫入,這時只要設(shè)置成發(fā)送狀態(tài),數(shù)據(jù)就可以被發(fā)出了。那么從現(xiàn)在開始是重點部分,就是以上兩段程序的組合,并加以延伸。仔細看下面這段程序,主要關(guān)注紅字部分。程序之后有我的相關(guān)解釋。voidTxPacket(uchar*TxRxBuf)uchari;/Config905();CSN=0;SpiWrite(WTP);/Writepayloadcommandfor(i=0;i4;i+)SpiWrite(TxRxBufi);/Write32bytesTxdata/SpienableforwriteaspicommandC

26、SN=1;Delay(1);/SpidisableCSN=0;/SpienableforwriteaspicommandSpiWrite(WTA);/Writeaddresscommandfor(i=0;i4;i+)/Write4bytesaddressSpiWrite(TxAddressi);CSN=1;/SpidisableTRX_CE=1;/SetTRX_CEhigh,startTxdatatransmissionDelay(1);/while(DR!=1);TRX_CE=0;/SetTRX_CElow上面這段程序,如果被main調(diào)用了之后,出現(xiàn)的效果是將txrxbuf數(shù)組中的數(shù)無線傳輸

27、出去。也就是說這段程序看懂了,905就能發(fā)數(shù)了。我們看下,這個程序有兩個大段的紅色字體和兩個小段。大段的紅色字體前面已經(jīng)做過解釋,小段的紅色字體解釋為。在開頭的幾頁提到過這個函數(shù):voidSetTxMode(void)其中有兩個引腳的電平為:TRX_CE=0;TXEN=1;(PWR_UP默認(rèn)高電平),且開頭我給我一個表格,那么我把它再拿出來說下。PWR_UPTRX_CETX_EN操作模式0XX斷電和SPI編程10X待機和SPI編程110射頻接收模式111射頻發(fā)送模式如此圖發(fā)射模式,TRX_CE和TX_EN全為1是發(fā)送狀態(tài)但是在voidSetTxMode(void)中TRX_CE=0;所以他不屬

28、于發(fā)送也不屬于接收狀態(tài),但只要TRX_CE=1;也就是全為1,那么就實現(xiàn)了發(fā)送狀態(tài),數(shù)據(jù)就被發(fā)送了。而在程序voidTxPacket(uchar*TxRxBuf)就是上面那段大程序,中恰好兩個小段紅字闡明。所以小紅字加上voidSetTxMode(void)的完整功能就是將905從準(zhǔn)備發(fā)射到發(fā)射的流程。至于在大段程序中CSN的值,注釋中已經(jīng)寫了spi是否有效的管腳。所以理解起來很容易,我就不解釋了。綜上所述,如果把我上面所講的所有東西全融合在一起,那么就是響當(dāng)當(dāng)?shù)?05發(fā)送數(shù)據(jù)的程序了。而對于905接收程序而言也是一樣,先要有相關(guān)命令,相關(guān)地址,并且用spi總線傳輸相關(guān)命令,并且用spi讀取接

29、收到的數(shù)據(jù)。這里我就不在多說什么了,因為跟發(fā)送的區(qū)別不大,下面我給出程序:這個函數(shù)不像剛才的那個函數(shù)含有狀態(tài)的設(shè)置,我后面會說的。那么程序的其他部分自己琢磨下。voidRxPacket(void)uchari;Delay(1);/TRX_CE=0;/SetnRF905instandbymodeDelay(100);TRX_CE=0;CSN=0;/SpienableforwriteaspicommandDelay(1);SpiWrite(RRP);for(i=0;i4;i+)TxRxBufi=SpiRead();/ReaddataandsavetobufferCSN=1;Delay(10);TR

30、X_CE=1;那么這樣就完成了發(fā)送和接收,但是我們目前面臨著一個很有意義的問題,比如我現(xiàn)在發(fā)了一個數(shù)據(jù),那么無線電波在空氣中傳播的速度是光速,我們可以認(rèn)為對面的905瞬間得到了一個值,于是我們就將它讀取。但是當(dāng)我們發(fā)送數(shù)據(jù)時,對面的905正由于mcu正在干別的事,或者用更通俗的話說,不是任何時候都能用接收函數(shù)接到數(shù)據(jù),只有當(dāng)數(shù)據(jù)被發(fā)送且傳到另一個905上,另一個905接收到了,這時我們讀接收到的數(shù)據(jù)才能讀出來。幸好存在一個功能,當(dāng)接收到數(shù)據(jù)后,905的DR會產(chǎn)生電平變化。所以當(dāng)dr產(chǎn)生變化的時候我們就開始提取數(shù)據(jù),其他時候我們可以干別的。所以就有以下這個函數(shù):voidRX(void)SetRx

31、Mode();/SetnRF905inRxmodewhile(CheckDR()=0);Delay(10);RxPacket();我們看見三個子函數(shù)在其中,有兩個我已經(jīng)說過了,但是我還想再說一下,首先你想讓905接收數(shù)據(jù),那么必須先讓其處于接收狀態(tài)。當(dāng)接收到數(shù)據(jù),那么dr會變化,當(dāng)確實變化了我們才執(zhí)行RxPacket();這個函數(shù)提取數(shù)據(jù)。這個與發(fā)送函數(shù)的一個很大的區(qū)別在與狀態(tài)設(shè)置,發(fā)送狀態(tài)是一個很果斷的狀態(tài),就像你想什么時候說話都可以,別人是否能聽得見都可以說話。但是接收狀態(tài)就像你的耳朵一樣,你不知道何時對方會說話,那么你就必須長期處于接收狀態(tài),否則你就聽不到說話,除非你知道他什么時候會說話

32、,聽不到說話的含義就是數(shù)據(jù)丟失。長期處于接收狀態(tài),并不是說單片機不能干別的事,而是說905不能干別的事。原因是單片機可以用中斷的方式得到DR引腳的變化。而這里為了程序的簡單,我們直接用while等待也沒什么問題,特此注明。如有中斷需要,請自己改動。那么如何使用這些函數(shù),也就是宏觀上程序如何控制905的,我們看下主函數(shù):voidmain(void)nRF905Init();Config905();while(1)if(KEY0=0)TxRxBuf0=0 x11;if(KEY0=1)TxRxBuf0=0 x22;if(KEY1=0)TxRxBuf1=0 x11;if(KEY1=1)TxRxBuf1

33、=0 x22;SetTxMode();/SetnRF905inTxmodeTxPacket(TxRxBuf);/SenddatabynRF905前面的兩個紅字子函數(shù)是905的初始化和寄存器配置。而在while內(nèi)部有兩個紅字子函數(shù),這兩個函數(shù)就實現(xiàn)了數(shù)據(jù)的發(fā)送。而while中的if語句中key是按鍵,當(dāng)key的按下與不按都會使TXRXBUF數(shù)組的前兩個字節(jié)產(chǎn)生一組值,這里你可以認(rèn)為咱們向TXRXBUF中寫入了數(shù)據(jù)。那么這樣,并在外面加了while語句就實現(xiàn)了循環(huán)發(fā)送按鍵值的功能。那么我們再看下接收端的主函數(shù)是什么樣子。接收部分只有三個子函數(shù),且我都講過了相關(guān)功能,這里就不贅述了。voidmain

34、(void)nRF905Init();Config905();while(1)RX();if(TxRxBuf0=0 x22)in1=1;in2=1;if(TxRxBuf0=0 x33)in1=1;in2=0;if(TxRxBuf1=0 x22)in3=1;in4=1;if(TxRxBuf1=0 x33)in3=1;in4=0;上面所講的一切就能實現(xiàn)905的收發(fā)了,那我把示例給大家。其中子函數(shù)在收發(fā)程序中都是編寫的一模一樣所以我就給出一份接收函數(shù),如想得到接收函數(shù),把剛才講的發(fā)送主函數(shù)粘上就成了。#include#include#include#include/-#defineuintunsig

35、nedint#defineucharunsignedchar/-#defineBYTE_BIT00 x01#defineBYTE_BIT10 x02#defineBYTE_BIT20 x04#defineBYTE_BIT30 x08#defineBYTE_BIT40 x10#defineBYTE_BIT50 x20#defineBYTE_BIT60 x40#defineBYTE_BIT70 x80/-bdataunsignedcharDATA_BUF;#defineDATA7(DATA_BUF&BYTE_BIT7)!=0)#defineDATA0(DATA_BUF&BYTE_BIT0)!=0)

36、sbitflag=DATA_BUF7;sbitflag1=DATA_BUF0;/-發(fā)送數(shù)據(jù)緩沖區(qū)-#defineTxRxBuf_Len4unsignedcharTxRxBufTxRxBuf_Len=0 x29,0 x30,0 x31,0 x32,;/-NRF905控制IO-sbitTXEN=P10;sbitTRX_CE=P32;sbitPWR=P11;/-NRF905SPI接口-sbitMISO=P16;sbitMOSI=P15;sbitSCK=P17;sbitCSN=P13;/-nrf905狀態(tài)標(biāo)志-sbitAM=P14;sbitDR=P33;sbitCD=P12;/-sbitin4=P34

37、;sbitin3=P35;sbitin2=P36;sbitin1=P37;/-/-nrf905控制指令-#defineWC0 x00#defineRC0 x10#defineWTP0 x20#defineRTP0 x21#defineWTA0 x22#defineRTA0 x23#defineRRP0 x24/-NRF905寄存器配置-unsignedcharidataRFConf11=0 x00,/配置命令/0 x4c,/CH_NO,配置頻段在430MHZ0 x0c,/輸出功率為10db,不重發(fā),節(jié)電為正常模式0 x44,/地址寬度設(shè)置,為4字節(jié)0 x04,0 x04,/接收發(fā)送有效數(shù)據(jù)長度

38、為32字節(jié)0 xCC,0 xCC,0 xCC,0 xCC,/接收地址0 x58,/CRC充許,8位CRC校驗,外部時鐘信號不使能,16M晶振;codeTxAddress4=0 xcc,0 xcc,0 xcc,0 xcc;chartf;/-延時-staticvoidDelay(ucharn)uinti;while(n-)for(i=0;i80;i+);/-SPI讀函數(shù)-unsignedcharSpiRead(void)unsignedcharj;for(j=0;j8;j+)DATA_BUF=DATA_BUF1;SCK=1;if(MISO)/讀取最高位,保存至最末尾,通過左移位完成整個字節(jié)DATA

39、_BUF|=BYTE_BIT0;elseDATA_BUF&=BYTE_BIT0;SCK=0;returnDATA_BUF;/-SPI寫函數(shù)-voidSpiWrite(unsignedcharsend)unsignedchari;DATA_BUF=send;for(i=0;i8;i+)if(DATA7)/總是發(fā)送最高位MOSI=1;elseMOSI=0;SCK=1;DATA_BUF=DATA_BUF1;SCK=0;/-初始化nRF905-voidnRF905Init(void)CSN=1;/SpidisableSCK=0;/SpiclocklineinitlowDR=0;/InitDRforin

40、putAM=0;/InitAMforinputCD=0;/InitCDforinputPWR=1;/nRF905poweronTRX_CE=0;/SetnRF905instandbymodeTXEN=0;/setradioinRxmode/-初始化寄存器-voidConfig905(void)uchari;CSN=0;/Spienableforwriteaspicommand/SpiWrite(WC);/Writeconfigcommand寫放配置命令for(i=0;i11;i+)/Writeconfigrationwords寫放配置字SpiWrite(RFConfi);CSN=1;/Disa

41、bleSpi/-發(fā)送數(shù)據(jù)打包-voidTxPacket(uchar*TxRxBuf)uchari;/Config905();CSN=0;SpiWrite(WTP);/Writepayloadcommandfor(i=0;i4;i+)SpiWrite(TxRxBufi);/Write32bytesTxdata/SpienableforwriteaspicommandCSN=1;Delay(1);/SpidisableCSN=0;/SpienableforwriteaspicommandSpiWrite(WTA);/Writeaddresscommandfor(i=0;i=650us)/-設(shè)置發(fā)送

42、狀態(tài)-voidSetRxMode(void)TXEN=0;TRX_CE=1;Delay(1);/delayformodechange(=650us)/-判斷數(shù)據(jù)接收狀態(tài)-unsignedcharCheckDR(void)/檢查是否有新數(shù)據(jù)傳入DataReadyif(DR=1&TRX_CE=1&TXEN=0)/Delay(50);return1;elsereturn0;/-讀NRF905接收數(shù)據(jù)-voidRxPacket(void)uchari;Delay(1);/TRX_CE=0;/SetnRF905instandbymodeDelay(100);TRX_CE=0;CSN=0;/SpienableforwriteaspicommandDelay(1);SpiWrite(RRP);for(i=0;i4;i+)TxRxBufi=SpiRead();/ReaddataandsavetobufferCSN=1;Delay(10);TRX_CE=1;/-數(shù)據(jù)接收-voidRX(void

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論