版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Good is good, but better carries it.精益求精,善益求善。NRF905參考程序參考教程包含多個(gè)實(shí)例和解釋-NRF905程序參考教程。本資料主要是將程序中各部分子程序的功能與NRF905的手冊(cè)相關(guān)聯(lián),使得各位同仁在每個(gè)子程序?yàn)槭裁催@么寫都在手冊(cè)中找到具體的體現(xiàn),特別是寄存器配置。內(nèi)涵完整參考程序,是100%可用程序。硬件的連接方法在參考程序之后,并介紹原理。本人最后只是為了提供給大家一個(gè)入門的資料或是引子罷了,至于如何應(yīng)用的巧妙那是后期編程巧妙的結(jié)果,目前只是給剛進(jìn)門的人士一個(gè)可以快速理解和掌握的淺顯易懂的教程罷了。本人疏忽之處還請(qǐng)見(jiàn)諒。按照慣例先展示作品拋磚引
2、玉:四路AD采集+溫度采集彩屏顯示信息數(shù)據(jù)GSM手機(jī)電話最近做的,音頻功放四路電機(jī)控制大功率led控制,不解釋。以前做的,舵機(jī)和攝像頭,不解釋。更早先的,VGA顯示,不解釋。已發(fā)送為例子。1.通過(guò)spi接口把寄存器相應(yīng)的值寫到905中2.把要發(fā)的數(shù)據(jù)寫到905中3.把狀態(tài)設(shè)置成發(fā)送4.數(shù)據(jù)被發(fā)出那么操作905就主要是前三步的問(wèn)題,那么請(qǐng)帶個(gè)這前三個(gè)問(wèn)題深入理解下面的相關(guān)解釋了。無(wú)線通信模塊的三個(gè)要素:Nrf905模式的配置Nrf905通過(guò)寄存器配置Nrf905需要spi通信配置寄存器先看模式配置:程序加解釋PWR_UPTRX_CETX_EN操作模式0XX斷電和SPI編程10X待機(jī)和SPI編程1
3、10射頻接收模式111射頻發(fā)送模式根據(jù)這個(gè)圖表,我們發(fā)覺(jué)有四種模式。撿重點(diǎn)的說(shuō)實(shí)現(xiàn)收發(fā)功能有兩種模式。這兩種模式在程序段中的實(shí)現(xiàn)是:設(shè)置成接受模式,程序中沒(méi)寫PWR_UP,如果他是低電平就變成斷電,所以個(gè)程序段默認(rèn)PWR_UP為高電平。voidSetRxMode(void)TXEN=0;TRX_CE=1;Delay(1);/delayformodechange(=650us)設(shè)置發(fā)送模式,這里會(huì)有疑問(wèn),在于TRX_CE=0;。這里給出的解釋是,如果我們直接寫TRX_CE=1;這樣模塊立即將其內(nèi)部所寫好的數(shù)據(jù)發(fā)送出去。而對(duì)于編程的人員來(lái)說(shuō)編出的程序五花八門,就比如說(shuō)這條,改程序員的意圖并不想讓設(shè)
4、置發(fā)送模式時(shí),數(shù)據(jù)就被立即發(fā)出,所以寫了TRX_CE=0;。如果看后面的完整程序,你會(huì)發(fā)現(xiàn)在發(fā)送時(shí),有TRX_CE=1;這一步。所以說(shuō),剛才那個(gè)圖表沒(méi)有問(wèn)題。這里可以認(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編程(通過(guò)spi通信配置905寄存器)。那么給出這個(gè)模式的應(yīng)用程序段:有這么做引腳賦予各種電平先不用管他,
5、我們看到PWR=1;TRX_CE=0;TXEN=0;這三個(gè),在待機(jī)spi模式中TXEN=x;即可以為任何值。說(shuō)明現(xiàn)在是待機(jī)且spi編程模式。程序段中其他引腳功能羅列下:Csn:spi的有效與否的引腳,低電平有效。如果只是單純的設(shè)置模式,該引腳并沒(méi)用處,只是后期程序的編寫,所以做下配置。Sck:spi的時(shí)鐘,現(xiàn)在只是設(shè)置模式,還沒(méi)開(kāi)始spi通信,所以付個(gè)低電平。DR:數(shù)據(jù)是否準(zhǔn)備好,現(xiàn)在沒(méi)有什么可準(zhǔn)備的。AD,CD也是一樣,等到spi通信的時(shí)候才需關(guān)系。這里做個(gè)引子吧。voidnRF905Init(void)CSN=1;/SpidisableSCK=0;/SpiclocklineinitlowD
6、R=0;/InitDRforinputAM=0;/InitAMforinputCD=0;/InitCDforinputPWR=1;/nRF905poweronTRX_CE=0;/SetnRF905instandbymodeTXEN=0;/setradioinRxmodeNrf905寄存器的配置配置905寄存器的意思是,通過(guò)spi傳輸一個(gè)值,放入905的寄存器中,這個(gè)值可以讓905傳輸數(shù)據(jù)時(shí),產(chǎn)生各種你想要的效果,類似于你用手調(diào)節(jié)耳機(jī)音量,你的手就相當(dāng)于配置耳機(jī)的寄存器。那么我先給出主要需配置的寄存器然后再解釋.如下面這個(gè)程序段: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ù)長(zhǎng)度為32字節(jié)0 xCC,0 xCC,0 xCC,0 xCC,/接收地址0 x58,/CRC充許,8位CRC校驗(yàn),外部時(shí)鐘信號(hào)不使能,16M晶振;0 x00,/配置命令/后面的講解中會(huì)說(shuō),所以大家從第二個(gè)開(kāi)始看。CH_NO的意思如下,通過(guò)以下解釋設(shè)置不同的值,可以讓905工作在不同頻段,這個(gè)需要的話再做詳解,不需要,可以照搬默認(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)的就引出以下這個(gè)寄存器HFREQ_PLL1使PLL工作于433或868/915MHz模式(默認(rèn)值=0).0工作于433MHz頻段1工作于868or915MHz頻段在這里給出個(gè)表格,如需更改該值可以參照:工作頻率HFREQ_PLLCH_NO430.0MHz0001001100433.1MHz0001101011433.2MHz0001101100434.7MHz0001111011862.0MHz1001010110868.2MHz1001110101868.4MHz1001110
9、110869.8MHz1001111101902.2MHz1100011111902.4MHz1100100000927.8MHz11100111110 x0c,/輸出功率為10db,不重發(fā),節(jié)電為正常模式這里做下說(shuō)明:我們拆分看看這段話。輸出功率為10db不重發(fā)節(jié)電為正常模式輸出功率為10db,這個(gè)對(duì)于的寄存器是:如下表,二進(jìn)制10db應(yīng)該是11PA_PWR2輸出功率(默認(rèn)值=00).“00”10dBm“01”2dBm“10”+6dBm“11”+10dBm不重發(fā),針對(duì)的寄存器是:不管怎么說(shuō),部分都不自動(dòng)重發(fā)(一般情況),故二進(jìn)制是0AUTO_RETRAN1如果TRX_CE和TXEN為高時(shí),自
10、動(dòng)重發(fā)(默認(rèn)值=0).0不重發(fā)1數(shù)據(jù)包重發(fā)節(jié)電為正常模式,針對(duì)的寄存器是:如下表,要是正常模式則二進(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é)如下面兩個(gè)表:收地址寬度: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ù)長(zhǎng)度為32字節(jié)這條命令是我擅自更改的,更改前是2字節(jié),如是0 x04這是32字節(jié)。這樣可以使905在一個(gè)數(shù)據(jù)包內(nèi)傳輸更多信息。那么我給出兩個(gè)寄存器。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)沒(méi)錯(cuò)但是程序中寫的是0 x04,仔細(xì)想想,也沒(méi)什么特別的問(wèn)題。這里我水平有限,不做說(shuō)明了。0 xCC,0 xCC,0 xCC,0 xCC,/接收地址一看就知道,地址被從新改了下,默認(rèn)地址是E7這種。RX_ADDRESS32發(fā)送地址標(biāo)識(shí),使用字節(jié)取決于RX_AFW(默認(rèn)值=E7E7E7E7h).0 x58,/CRC充許,8位CRC校驗(yàn),外部時(shí)鐘信號(hào)不使能,16M晶振CRC_EN1CRC校驗(yàn)可用(默認(rèn)值=1).0不可用1可用CRC_MODE1CRC模式選擇端(默認(rèn)值=1).08位116位UP
13、_CLK_EN1輸出時(shí)鐘可用(默認(rèn)值=1)0外面沒(méi)有可用的時(shí)鐘信號(hào)1外面有可用的時(shí)鐘信號(hào)XOF3晶振頻率端,必須與外部的晶振頻率相對(duì)應(yīng)(默認(rèn)值=100).0004MHz0018MHz01012MHz01116MHz10020MHz這塊看著有點(diǎn)亂的話,請(qǐng)繼續(xù)往后看。我們既然把相關(guān)寄存器的配置解釋了一邊,但是如果對(duì)于一個(gè)編程序的人,或者程序開(kāi)發(fā)來(lái)說(shuō),這樣的羅列雖然我們能弄懂每個(gè)寄存器是咋回事,但是實(shí)際編程并自己配置寄存器的話,難度是很大的。幸好,開(kāi)發(fā)手冊(cè)解決一切問(wèn)題,下面是一個(gè)表,表的后面我有解釋。寄存器內(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解釋:這是手冊(cè)中的一張表,假設(shè)寄存器的配置值是如圖給的這些。那么他的傳輸是從0字節(jié)開(kāi)始到9字節(jié)截止,按順序把16進(jìn)制碼傳進(jìn)去,你的工作就完成了。而你需要對(duì)那個(gè)寄存器進(jìn)行微小的改動(dòng),只需找到手冊(cè)相關(guān)寄存器的說(shuō)明進(jìn)行改動(dòng)就可以了。我們從上表中摘出一個(gè)小表看,小表如下:bit7notused,TX_AFW2:0,bit3notused,RX_AFW2:00100_0100bit7就是該值得第七位,第七位沒(méi)用上。TXAFW【2:0
16、】意思是有三位被這個(gè)寄存器用了。等等。通過(guò)這種字節(jié)的劃分,將寄存器的配置變成了傳多個(gè)2位十六進(jìn)制數(shù),使得寄存器的配置變得博大精深,新手上手困難。不過(guò)對(duì)于驅(qū)動(dòng)其他芯片也一樣,配置寄存器就是這樣配置的。像是某些器件如saa7113等芯片,配置寄存器時(shí),前面還有地址,弄得更加復(fù)雜。所以大家要通過(guò)學(xué)習(xí)nrf905了解芯片的驅(qū)動(dòng)方法這才是關(guān)鍵。spi通信:如何實(shí)現(xiàn)spi通信,在這個(gè)問(wèn)題上,如果說(shuō)正常學(xué)習(xí)應(yīng)該是,先知曉spi的協(xié)議,spi的時(shí)序,spi寫和讀的時(shí)序和協(xié)議。但是如果將其看成程序的話就比較方便。咱們用程序談這件事情。該程序段式spi的寫程序:從MOSI=(bit)(b&0 x80);我們分析下
17、。假設(shè)b=abcdefgh那b&0 x80就是abcdefgh&10000000可以想象a被提取了出來(lái)。至于bit,其實(shí)可以沒(méi)有,這里可以參考c51語(yǔ)言關(guān)于與有兩個(gè)做法,一個(gè)是&,另一個(gè)是&,即位與和整個(gè)值得與。之后我們觀察sck的變化,sck是spi的時(shí)鐘,我們發(fā)現(xiàn)從0到1然后回到0,這是sck的變化。在sck變到1之前,mosi已經(jīng)有了一個(gè)值,那么當(dāng)sck=1;的時(shí)候,也就是所謂的上升沿,mosi被寫入,這里可以認(rèn)為是寫入905的內(nèi)部了。b=1;這個(gè)語(yǔ)句等同于b=b1;意思是b左移一位的新值付給b,比如b=abcdefgh左移一位,那么b=bcdefgh0,再左移一位,那么b=cdefgh
18、00,以此類推左移8次之后b=00000000.因?yàn)槊恳瞥鲆晃?,就代表著移進(jìn)一位,移進(jìn)的是0。那么觀察一下0 x8010000000這個(gè)數(shù)10000000與上abcdefgh之后會(huì)提取出a左移之后,再次進(jìn)行與運(yùn)算,就會(huì)提取出b,循環(huán)往復(fù)abcdefgh就都提取出來(lái)了。并在每一次都把這個(gè)值付給了mosi。我想通過(guò)梳理,大家應(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_();是延時(shí),延時(shí)是一個(gè)指令周期的時(shí)間。說(shuō)白了,就是延時(shí)一段時(shí)間。ucharddata=0;這條語(yǔ)句意味著ddata是完全為0的。且注意一個(gè)事情ddata的定義是uchar,那么他的值最大能到0 xff。ddata|=MISO;等同于ddata=ddata|miso;miso是一個(gè)引腳的電平。經(jīng)過(guò)這條語(yǔ)句后ddata的最低位就是miso當(dāng)時(shí)的電平了,這時(shí)左移再次提取新的miso電平,當(dāng)八個(gè)電平都提取之后,ddata的值就提取完成了。同樣sck是spi時(shí)鐘,想提取下一個(gè)miso的值必須讓時(shí)鐘波動(dòng)一次。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的基本問(wèn)題講完了。那么我們把它串聯(lián)在一起。我們先宏觀的看下。以發(fā)送流程為例905現(xiàn)處于待機(jī)spi編程狀態(tài)向905中傳送寄存器值將905的狀態(tài)設(shè)置為發(fā)送狀態(tài)成功發(fā)出-待機(jī)狀態(tài)如果想再發(fā)個(gè)數(shù)據(jù),那么他的流程將變成將905的狀態(tài)設(shè)置為發(fā)送狀態(tài)成功發(fā)出待機(jī)狀態(tài)由此看來(lái)對(duì)同一個(gè)對(duì)象進(jìn)行發(fā)送,如果大家的設(shè)置都沒(méi)改的話,寄存器的值只需設(shè)置一次
21、。剩下的就是重復(fù)發(fā)送到待機(jī)這個(gè)環(huán)節(jié)了。那么在之前的問(wèn)題,大家都了解了,剩下的就是到把數(shù)據(jù)發(fā)送這一塊了。這里我分為三個(gè)部分說(shuō)這件事情。向905傳輸一個(gè)命令向905裝入待發(fā)送的數(shù)據(jù)、把數(shù)據(jù)發(fā)出去向905傳輸命令:這里定義了這些命令,先在語(yǔ)法上說(shuō)下#defineWC0 x00的意思等價(jià)于wc=0 x00;那么我們先解釋下這幾個(gè)命令,大家理解下。#defineWC0 x00#defineRC0 x10#defineWTP0 x20#defineRTP0 x21#defineWTA0 x22#defineRTA0 x23#defineRRP0 x24如下是wc的解釋:在講解配置寄存器是有個(gè)值我沒(méi)有講解先
22、在我告訴大家指令名稱指令格式操作W_CONFIG(WC)0000AAAA寫配置寄存器AAAA指明哪個(gè)字節(jié)。寫操作從哪個(gè)字節(jié)開(kāi)始取決于地址AAAAunsignedcharidataRFConf11=0 x00,/配置命令/。0 x00,/配置命令/這就意味著wc=0 x00,意思就是從0字節(jié)開(kāi)始進(jìn)行寫操作。舉個(gè)例子看下,0字節(jié)代表的是哪個(gè)寄存器,寄存器內(nèi)容射頻器配置寄存器(R/W)字節(jié)位內(nèi)容7:0,最高有效位7初始值0CH_NO7:00110_1100寫之后的操作就是開(kāi)始寫1字節(jié),這點(diǎn)上沒(méi)什么問(wèn)題最后寫到第九字節(jié)。前面有這個(gè)表的完整版,大家可以翻著看。#defineRC0 x10的解釋如下:這個(gè)
23、看表就知道不做解釋了跟wc意思差不多。R_CONFIG(RC)0001AAAA讀配置寄存器AAAA指明哪個(gè)字節(jié)。讀操作從哪個(gè)字節(jié)開(kāi)始取決于地址AAAA后幾個(gè)命令都好理解我就都列出來(lái)大家自己吸收下:那么到此,命令部分就說(shuō)完了,能用的就這幾個(gè)命令。向905裝入待發(fā)送數(shù)據(jù):向905裝入數(shù)據(jù)這件事情和剛才的命令結(jié)合著說(shuō)。先看以下程序段:SpiWrite(WTP);/Writepayloadcommandfor(i=0;i4;i+)SpiWrite(TxRxBufi);/Write32bytesTxdata先傳了wtp命令,之后把txrxbuf數(shù)組中的前4字節(jié)傳了進(jìn)去。那么執(zhí)行外這條之后,數(shù)據(jù)就被傳到9
24、05中了(還沒(méi)有進(jìn)行發(fā)送)。觀察此函數(shù),發(fā)現(xiàn)調(diào)用了spiwrite這個(gè)函數(shù),說(shuō)明裝入命令和裝入數(shù)據(jù)都是通過(guò)spi通信進(jìn)行傳輸?shù)摹S^察以下程序段:SpiWrite(WTA);/Writeaddresscommandfor(i=0;i4;i+)/Write4bytesaddressSpiWrite(TxAddressi);TxAddressi和SpiWrite(WTA);是其中的要素,wta是寫地址命令,那么TxAddressi就是地址咯,地址前面說(shuō)過(guò)了,程序中除了那個(gè)config數(shù)組中有地址的說(shuō)法,另外在程序段中被單獨(dú)列出的地方是codeTxAddress4=0 xcc,0 xcc,0 xcc,
25、0 xcc;那么通過(guò)這個(gè)程序段,功能就是把地址寫進(jìn)去。以上的兩個(gè)程序段完成了數(shù)據(jù)和地址的寫入,這時(shí)只要設(shè)置成發(fā)送狀態(tài),數(shù)據(jù)就可以被發(fā)出了。那么從現(xiàn)在開(kāi)始是重點(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ù)無(wú)線傳輸
27、出去。也就是說(shuō)這段程序看懂了,905就能發(fā)數(shù)了。我們看下,這個(gè)程序有兩個(gè)大段的紅色字體和兩個(gè)小段。大段的紅色字體前面已經(jīng)做過(guò)解釋,小段的紅色字體解釋為。在開(kāi)頭的幾頁(yè)提到過(guò)這個(gè)函數(shù):voidSetTxMode(void)其中有兩個(gè)引腳的電平為:TRX_CE=0;TXEN=1;(PWR_UP默認(rèn)高電平),且開(kāi)頭我給我一個(gè)表格,那么我把它再拿出來(lái)說(shuō)下。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)就是上面那段大程序,中恰好兩個(gè)小段紅字闡明。所以小紅字加上voidSetTxMode(void)的完整功能就是將905從準(zhǔn)備發(fā)射到發(fā)射的流程。至于在大段程序中CSN的值,注釋中已經(jīng)寫了spi是否有效的管腳。所以理解起來(lái)很容易,我就不解釋了。綜上所述,如果把我上面所講的所有東西全融合在一起,那么就是響當(dāng)當(dāng)?shù)?05發(fā)送數(shù)據(jù)的程序了。而對(duì)于905接收程序而言也是一樣,先要有相關(guān)命令,相關(guān)地址,并且用spi總線傳輸相關(guān)命令,并且用spi讀取接
29、收到的數(shù)據(jù)。這里我就不在多說(shuō)什么了,因?yàn)楦l(fā)送的區(qū)別不大,下面我給出程序:這個(gè)函數(shù)不像剛才的那個(gè)函數(shù)含有狀態(tài)的設(shè)置,我后面會(huì)說(shuō)的。那么程序的其他部分自己琢磨下。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ā)送和接收,但是我們目前面臨著一個(gè)很有意義的問(wèn)題,比如我現(xiàn)在發(fā)了一個(gè)數(shù)據(jù),那么無(wú)線電波在空氣中傳播的速度是光速,我們可以認(rèn)為對(duì)面的905瞬間得到了一個(gè)值,于是我們就將它讀取。但是當(dāng)我們發(fā)送數(shù)據(jù)時(shí),對(duì)面的905正由于mcu正在干別的事,或者用更通俗的話說(shuō),不是任何時(shí)候都能用接收函數(shù)接到數(shù)據(jù),只有當(dāng)數(shù)據(jù)被發(fā)送且傳到另一個(gè)905上,另一個(gè)905接收到了,這時(shí)我們讀接收到的數(shù)據(jù)才能讀出來(lái)。幸好存在一個(gè)功能,當(dāng)接收到數(shù)據(jù)后,905的DR會(huì)產(chǎn)生電平變化。所以當(dāng)dr產(chǎn)生變化的時(shí)候我們就開(kāi)始提取數(shù)據(jù),其他時(shí)候我們可以干別的。所以就有以下這個(gè)函數(shù):voidRX(void)SetRx
31、Mode();/SetnRF905inRxmodewhile(CheckDR()=0);Delay(10);RxPacket();我們看見(jiàn)三個(gè)子函數(shù)在其中,有兩個(gè)我已經(jīng)說(shuō)過(guò)了,但是我還想再說(shuō)一下,首先你想讓905接收數(shù)據(jù),那么必須先讓其處于接收狀態(tài)。當(dāng)接收到數(shù)據(jù),那么dr會(huì)變化,當(dāng)確實(shí)變化了我們才執(zhí)行RxPacket();這個(gè)函數(shù)提取數(shù)據(jù)。這個(gè)與發(fā)送函數(shù)的一個(gè)很大的區(qū)別在與狀態(tài)設(shè)置,發(fā)送狀態(tài)是一個(gè)很果斷的狀態(tài),就像你想什么時(shí)候說(shuō)話都可以,別人是否能聽(tīng)得見(jiàn)都可以說(shuō)話。但是接收狀態(tài)就像你的耳朵一樣,你不知道何時(shí)對(duì)方會(huì)說(shuō)話,那么你就必須長(zhǎng)期處于接收狀態(tài),否則你就聽(tīng)不到說(shuō)話,除非你知道他什么時(shí)候會(huì)說(shuō)話
32、,聽(tīng)不到說(shuō)話的含義就是數(shù)據(jù)丟失。長(zhǎng)期處于接收狀態(tài),并不是說(shuō)單片機(jī)不能干別的事,而是說(shuō)905不能干別的事。原因是單片機(jī)可以用中斷的方式得到DR引腳的變化。而這里為了程序的簡(jiǎn)單,我們直接用while等待也沒(méi)什么問(wèn)題,特此注明。如有中斷需要,請(qǐng)自己改動(dòng)。那么如何使用這些函數(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前面的兩個(gè)紅字子函數(shù)是905的初始化和寄存器配置。而在while內(nèi)部有兩個(gè)紅字子函數(shù),這兩個(gè)函數(shù)就實(shí)現(xiàn)了數(shù)據(jù)的發(fā)送。而while中的if語(yǔ)句中key是按鍵,當(dāng)key的按下與不按都會(huì)使TXRXBUF數(shù)組的前兩個(gè)字節(jié)產(chǎn)生一組值,這里你可以認(rèn)為咱們向TXRXBUF中寫入了數(shù)據(jù)。那么這樣,并在外面加了while語(yǔ)句就實(shí)現(xiàn)了循環(huán)發(fā)送按鍵值的功能。那么我們?cè)倏聪陆邮斩说闹骱瘮?shù)是什么樣子。接收部分只有三個(gè)子函數(shù),且我都講過(guò)了相關(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ù)長(zhǎng)度
38、為32字節(jié)0 xCC,0 xCC,0 xCC,0 xCC,/接收地址0 x58,/CRC充許,8位CRC校驗(yàn),外部時(shí)鐘信號(hào)不使能,16M晶振;codeTxAddress4=0 xcc,0 xcc,0 xcc,0 xcc;chartf;/-延時(shí)-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)/讀取最高位,保存至最末尾,通過(guò)左移位完成整個(gè)字節(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《焊接標(biāo)準(zhǔn)》教學(xué)大綱
- 廣西理論知識(shí)和業(yè)務(wù)規(guī)范考題
- 建筑裝飾材料與設(shè)計(jì)教案
- 家教教案(教師版)必修一第三章
- 玉溪師范學(xué)院《社會(huì)政策》2022-2023學(xué)年第一學(xué)期期末試卷
- 玉溪師范學(xué)院《馬克思主義經(jīng)典文獻(xiàn)導(dǎo)讀》2023-2024學(xué)年第一學(xué)期期末試卷
- 冀教版六年級(jí)下冊(cè)英語(yǔ)全冊(cè)教案
- 2下第二單元課件
- 2024年鹽業(yè)項(xiàng)目綜合評(píng)估報(bào)告
- 2023年微電子組件項(xiàng)目綜合評(píng)估報(bào)告
- 完整解讀新版《化學(xué)》新課標(biāo)2022年《義務(wù)教育化學(xué)課程標(biāo)準(zhǔn)(2022年版)》PPT課件
- 針織彈性面料基本知識(shí)
- 民法典關(guān)于監(jiān)護(hù)的規(guī)定解讀
- 便攜式氣體檢測(cè)儀使用方法(課堂PPT)
- EN779-2012一般通風(fēng)過(guò)濾器——過(guò)濾性能測(cè)定(中文版)
- 安全文明施工設(shè)施配置清單
- 幼兒園教研主題30篇
- 應(yīng)用隨機(jī)過(guò)程PPT課件
- 母版_安徽省中小學(xué)生轉(zhuǎn)學(xué)申請(qǐng)表
- 初中美術(shù)課說(shuō)課稿(課堂PPT)
- YY∕T 0106-2021 醫(yī)用診斷X射線機(jī)通用技術(shù)條件
評(píng)論
0/150
提交評(píng)論