版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Good is good, but better carries it.精益求精,善益求善。NRF905參考程序參考教程包含多個實(shí)例和解釋-NRF905程序參考教程。本資料主要是將程序中各部分子程序的功能與NRF905的手冊相關(guān)聯(lián),使得各位同仁在每個子程序?yàn)槭裁催@么寫都在手冊中找到具體的體現(xiàn),特別是寄存器配置。內(nèi)涵完整參考程序,是100%可用程序。硬件的連接方法在參考程序之后,并介紹原理。本人最后只是為了提供給大家一個入門的資料或是引子罷了,至于如何應(yīng)用的巧妙那是后期編程巧妙的結(jié)果,目前只是給剛進(jìn)門的人士一個可以快速理解和掌握的淺顯易懂的教程罷了。本人疏忽之處還請見諒。按照慣例先展示作品拋磚引
2、玉:四路AD采集+溫度采集彩屏顯示信息數(shù)據(jù)GSM手機(jī)電話最近做的,音頻功放四路電機(jī)控制大功率led控制,不解釋。以前做的,舵機(jī)和攝像頭,不解釋。更早先的,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待機(jī)和SPI編程1
3、10射頻接收模式111射頻發(fā)送模式根據(jù)這個圖表,我們發(fā)覺有四種模式。撿重點(diǎn)的說實(shí)現(xiàn)收發(fā)功能有兩種模式。這兩種模式在程序段中的實(shí)現(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)于圖表中前兩種模式中,實(shí)例程序所應(yīng)用的是第二種,即待機(jī)spi編程模式。不管應(yīng)用兩種的哪一種,都是為了spi編程(通過spi通信配置905寄存器)。那么給出這個模式的應(yīng)用程序段:有這么做引腳賦予各種電平先不用管他,
5、我們看到PWR=1;TRX_CE=0;TXEN=0;這三個,在待機(jī)spi模式中TXEN=x;即可以為任何值。說明現(xiàn)在是待機(jī)且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é)耳機(jī)音量,你的手就相當(dāng)于配置耳機(jī)的寄存器。那么我先給出主要需配置的寄存器然后再解釋.如下面這個程序段: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校驗(yàn),外部時鐘信號不使能,16M晶振;0 x00,/配置命令/后面的講解中會說,所以大家從第二個開始看。CH_NO的意思如下,通過以下解釋設(shè)置不同的值,可以讓905工作在不同頻段,這個需要的話再做詳解,不需要,可以照搬默認(rèn)值,或者程序。CH_NO9和HFREQ_PLL一起進(jìn)行平率設(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,這個對于的寄存器是:如下表,二進(jìn)制10db應(yīng)該是11PA_PWR2輸出功率(默認(rèn)值=00).“00”10dBm“01”2dBm“10”+6dBm“11”+10dBm不重發(fā),針對的寄存器是:不管怎么說,部分都不自動重發(fā)(一般情況),故二進(jìn)制是0AUTO_RETRAN1如果TRX_CE和TXEN為高時,自
10、動重發(fā)(默認(rèn)值=0).0不重發(fā)1數(shù)據(jù)包重發(fā)節(jié)電為正常模式,針對的寄存器是:如下表,要是正常模式則二進(jìn)制是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進(jìn)制是100RX_AFW3接收地址寬度(默認(rèn)值=100).0011byteRX地址1004byteRX地址發(fā)地址寬度:4字節(jié)的2進(jìn)制是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ù)寬度這里要把碼補(bǔ)全,100000001000000 x40這里實(shí)際是0 x40一點(diǎn)沒錯但是程序中寫的是0 x04,仔細(xì)想想,也沒什么特別的問題。這里我水平有限,不做說明了。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校驗(yàn),外部時鐘信號不使能,16M晶振CRC_EN1CRC校驗(yàn)可用(默認(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這塊看著有點(diǎn)亂的話,請繼續(xù)往后看。我們既然把相關(guān)寄存器的配置解釋了一邊,但是如果對于一個編程序的人,或者程序開發(fā)來說,這樣的羅列雖然我們能弄懂每個寄存器是咋回事,但是實(shí)際編程并自己配置寄存器的話,難度是很大的。幸好,開發(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進(jìn)制碼傳進(jìn)去,你的工作就完成了。而你需要對那個寄存器進(jìn)行微小的改動,只需找到手冊相關(guān)寄存器的說明進(jìn)行改動就可以了。我們從上表中摘出一個小表看,小表如下:bit7notused,TX_AFW2:0,bit3notused,RX_AFW2:00100_0100bit7就是該值得第七位,第七位沒用上。TXAFW【2:0
16、】意思是有三位被這個寄存器用了。等等。通過這種字節(jié)的劃分,將寄存器的配置變成了傳多個2位十六進(jìn)制數(shù),使得寄存器的配置變得博大精深,新手上手困難。不過對于驅(qū)動其他芯片也一樣,配置寄存器就是這樣配置的。像是某些器件如saa7113等芯片,配置寄存器時,前面還有地址,弄得更加復(fù)雜。所以大家要通過學(xué)習(xí)nrf905了解芯片的驅(qū)動方法這才是關(guān)鍵。spi通信:如何實(shí)現(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,其實(shí)可以沒有,這里可以參考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.因?yàn)槊恳瞥鲆晃唬痛碇七M(jìn)一位,移進(jìn)的是0。那么觀察一下0 x8010000000這個數(shù)10000000與上abcdefgh之后會提取出a左移之后,再次進(jìn)行與運(yùn)算,就會提取出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)處于待機(jī)spi編程狀態(tài)向905中傳送寄存器值將905的狀態(tài)設(shè)置為發(fā)送狀態(tài)成功發(fā)出-待機(jī)狀態(tài)如果想再發(fā)個數(shù)據(jù),那么他的流程將變成將905的狀態(tài)設(shè)置為發(fā)送狀態(tài)成功發(fā)出待機(jī)狀態(tài)由此看來對同一個對象進(jìn)行發(fā)送,如果大家的設(shè)置都沒改的話,寄存器的值只需設(shè)置一次
21、。剩下的就是重復(fù)發(fā)送到待機(jī)這個環(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é)開始進(jìn)行寫操作。舉個例子看下,0字節(jié)代表的是哪個寄存器,寄存器內(nèi)容射頻器配置寄存器(R/W)字節(jié)位內(nèi)容7:0,最高有效位7初始值0CH_NO7:00110_1100寫之后的操作就是開始寫1字節(jié),這點(diǎn)上沒什么問題最后寫到第九字節(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é)傳了進(jìn)去。那么執(zhí)行外這條之后,數(shù)據(jù)就被傳到9
24、05中了(還沒有進(jìn)行發(fā)送)。觀察此函數(shù),發(fā)現(xiàn)調(diào)用了spiwrite這個函數(shù),說明裝入命令和裝入數(shù)據(jù)都是通過spi通信進(jìn)行傳輸?shù)?。觀察以下程序段:SpiWrite(WTA);/Writeaddresscommandfor(i=0;i4;i+)/Write4bytesaddressSpiWrite(TxAddressi);TxAddressi和SpiWrite(WTA);是其中的要素,wta是寫地址命令,那么TxAddressi就是地址咯,地址前面說過了,程序中除了那個config數(shù)組中有地址的說法,另外在程序段中被單獨(dú)列出的地方是codeTxAddress4=0 xcc,0 xcc,0 xcc,
25、0 xcc;那么通過這個程序段,功能就是把地址寫進(jìn)去。以上的兩個程序段完成了數(shù)據(jù)和地址的寫入,這時只要設(shè)置成發(fā)送狀態(tài),數(shù)據(jù)就可以被發(fā)出了。那么從現(xiàn)在開始是重點(diǎn)部分,就是以上兩段程序的組合,并加以延伸。仔細(xì)看下面這段程序,主要關(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待機(jī)和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,那么就實(shí)現(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ù)。這里我就不在多說什么了,因?yàn)楦l(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)確實(shí)變化了我們才執(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),并不是說單片機(jī)不能干別的事,而是說905不能干別的事。原因是單片機(jī)可以用中斷的方式得到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ù)就實(shí)現(xiàn)了數(shù)據(jù)的發(fā)送。而while中的if語句中key是按鍵,當(dāng)key的按下與不按都會使TXRXBUF數(shù)組的前兩個字節(jié)產(chǎn)生一組值,這里你可以認(rèn)為咱們向TXRXBUF中寫入了數(shù)據(jù)。那么這樣,并在外面加了while語句就實(shí)現(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;上面所講的一切就能實(shí)現(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校驗(yàn),外部時鐘信號不使能,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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 石河子大學(xué)《園林建筑設(shè)計(jì)》2021-2022學(xué)年第一學(xué)期期末試卷
- 大學(xué)學(xué)校辭職報告11篇
- dark green dress造句不同意思
- 石河子大學(xué)《水工建筑物》2022-2023學(xué)年第一學(xué)期期末試卷
- 石河子大學(xué)《籃球》2022-2023學(xué)年第一學(xué)期期末試卷
- 沈陽理工大學(xué)《數(shù)字圖像處理》2023-2024學(xué)年期末試卷
- 沈陽理工大學(xué)《機(jī)器人技術(shù)及應(yīng)用》2023-2024學(xué)年第一學(xué)期期末試卷
- 經(jīng)濟(jì)法基礎(chǔ)(下)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 2018年四川遂寧中考滿分作文《爭取》3
- 股權(quán)合同 英文 模板
- 企業(yè)旗桿維修合同范例
- 《市場營銷》教案全套 蔣世軍(第1-12周)認(rèn)識市場營銷 -數(shù)字營銷與直播電商
- 2025屆河南省信陽第一高級中學(xué)高二物理第一學(xué)期期末綜合測試模擬試題含解析
- 珍愛生命,拒絕“死亡游戲”主題班會教案(3篇)
- 排洪渠道清淤施工方案
- 北科大巖石力學(xué)-李長洪1.2-巖石的力學(xué)性質(zhì)
- 國開(河北)2024年秋《現(xiàn)代產(chǎn)權(quán)法律制度專題》形考作業(yè)1-4答案
- 新商科“專業(yè)-產(chǎn)業(yè)雙鏈融通式”人才培養(yǎng)模式探究
- 民用無人機(jī)操控員執(zhí)照(CAAC)考試復(fù)習(xí)重點(diǎn)題庫500題(含答案)
- 中國法律史-第一次平時作業(yè)-國開-參考資料
- EPC項(xiàng)目投標(biāo)人承包人工程經(jīng)濟(jì)的合理性分析、評價
評論
0/150
提交評論