昨天下午終于找出時(shí)間把nRF24l01P的數(shù)據(jù)手冊(cè)全部看完了。 其實(shí)這份文檔的編寫方式對(duì)于初學(xué)者尤其我這種外行來(lái)說(shuō)不太友好,而且有些地方的敘述不全面或者太分散,閱讀時(shí)總要前后反復(fù)翻閱甚至還要專門做個(gè)筆記。 總的說(shuō)來(lái),新一代nRF24L01P與上一代nRF24L01相比寄存器沒(méi)有太大的變化,但是有幾個(gè)關(guān)于通信管道和ACK的寄存器的配置還是與上一代不同的。另外,個(gè)人理解shockburst和enhanced shockburst的區(qū)別就在于enhanced shockburst可以在接收機(jī)回復(fù)ACK時(shí)掛上1到32字節(jié)的數(shù)據(jù)包,這樣就實(shí)現(xiàn)了所謂的“全雙工”通信。然而實(shí)際探查這項(xiàng)功能發(fā)現(xiàn)它的作用其實(shí)有限,因?yàn)槭茿CK附加數(shù)據(jù)包,因此它的傳輸可靠性無(wú)法由射頻芯片的校驗(yàn)重發(fā)機(jī)制保證,只能在接收機(jī)軟件上做改進(jìn),而這有時(shí)還不如讓接收發(fā)送機(jī)依照發(fā)送次序輪流進(jìn)入發(fā)送/接收狀態(tài)來(lái)的方便。只適合回傳一些實(shí)時(shí)性要求高,對(duì)傳輸可靠性要求不嚴(yán)格的數(shù)據(jù)。 所謂知易行難,在著手做最基礎(chǔ)的SPI通信時(shí)就接連遇到了問(wèn)題。首先是AVR的硬SPI無(wú)輸出。經(jīng)過(guò)查找,最終問(wèn)題是SPI設(shè)定為主機(jī)時(shí),SS口要么設(shè)置為輸出,要么設(shè)置為輸入時(shí)接上拉,否則當(dāng)SS為輸入又懸空或者低電平就會(huì)進(jìn)入從機(jī)模式,自然沒(méi)有輸出。這個(gè)問(wèn)題解決了,接下來(lái)遇到了一個(gè)更基本的問(wèn)題,SPI的通信機(jī)制。一般說(shuō)來(lái)另外兩種常見的通信方式中,UART是有收、發(fā)兩個(gè)數(shù)據(jù)寄存器,I2C則是通過(guò)數(shù)據(jù)包頭來(lái)區(qū)分接收和發(fā)送的數(shù)據(jù)。而SPI只有一個(gè)SPDR寄存器,而且只有寫入的時(shí)候啟動(dòng)SPI產(chǎn)生SCK信號(hào),怎么去讀MISO的數(shù)據(jù)?要自己做外部中斷讀取嗎?后來(lái)才明白,SPI的主機(jī)和從機(jī)各自的一個(gè)SPDR通過(guò)MOSI和MISO串聯(lián)成一個(gè)類似環(huán)形的大移位寄存器。主機(jī)的SPDR中的數(shù)據(jù)從MOSI每移除一位,從機(jī)就在相同的SCK上升沿或下降沿通過(guò)MISO將一位數(shù)據(jù)發(fā)送給主機(jī)。這樣,當(dāng)SCK八個(gè)周期后,主機(jī)中的SPDR的數(shù)據(jù)全部移出了而被從機(jī)發(fā)送來(lái)的數(shù)據(jù)填充,從機(jī)則反之,這樣,在一字節(jié)的通信結(jié)束后再讀取SPDR,所返回的數(shù)據(jù)也就是從機(jī)發(fā)送來(lái)的數(shù)據(jù)。 解決了這個(gè)問(wèn)題后與nRF24L01P的通信也就變得簡(jiǎn)單了,先將SS拉低,告知nRF24L01P即將啟動(dòng)SPI通信,當(dāng)通過(guò)MOSI第一次向射頻芯片寫入任何字節(jié)時(shí),MISO上都會(huì)有一個(gè)字節(jié)傳送給主機(jī),這個(gè)就是芯片默認(rèn)的0X07狀態(tài)寄存器里的數(shù)據(jù),如果我們?cè)诘谝淮螌懭胱x取0X01寄存器的數(shù)據(jù),那么0X01寄存器的數(shù)據(jù)只有在下一字節(jié)的通信中才會(huì)通過(guò)MISO回傳給主機(jī),而發(fā)起下一輪字節(jié)通信就需要主機(jī)繼續(xù)發(fā)送數(shù)據(jù),那么問(wèn)題來(lái)了,讀命令已經(jīng)發(fā)送了,那么接下來(lái)我該發(fā)送什么。在nRF24L01P的數(shù)據(jù)手冊(cè)中給出的建議是發(fā)送0XFF,這個(gè)命令對(duì)射頻芯片沒(méi)有任何意義,其實(shí)也可以再隨便發(fā)送其他任意一個(gè)數(shù),只是為了避免產(chǎn)生不必要的麻煩而發(fā)送0XFF.發(fā)送0X00也可以,而且網(wǎng)上的絕大多數(shù)例程都是這樣用的,但是這實(shí)際上是讀0X00寄存器指令。讀取完畢后,將SS拉高,本輪通信結(jié)束。當(dāng)下一次SS再次拉低時(shí),一切又重新開始。也就是如果上一輪通信的最后MOSI上發(fā)送的是0X00,在這一輪第一次發(fā)送指令時(shí)MISO上移入的并不是0X00寄存器的狀態(tài),而依舊是默認(rèn)的0X07狀態(tài)寄存器的狀態(tài)。 有些繞,但是仔細(xì)看手冊(cè)就會(huì)發(fā)現(xiàn)原來(lái)規(guī)則很簡(jiǎn)單。學(xué)習(xí)就是一個(gè)先將書本學(xué)厚,再將書本學(xué)薄的過(guò)程。 此外,MISO和IRQ信號(hào)雖然理論上和實(shí)際試驗(yàn)都可以達(dá)到AVR的0.7VDD的高電平檢測(cè)電壓,但是在實(shí)際應(yīng)用時(shí)必須要做3.3V到5V的電平轉(zhuǎn)換,否則極容易被干擾。而且對(duì)芯片的初始化也要等到開機(jī)后500毫秒在進(jìn)行,以免因?yàn)樾酒想姾筮未穩(wěn)定工作而配置不正常,事實(shí)也的確證明,芯片從上電到穩(wěn)定的確存在一個(gè)比較長(zhǎng)的時(shí)間。 但近年來(lái)國(guó)產(chǎn)芯片的替代品出來(lái)后,有理由項(xiàng)目國(guó)產(chǎn)芯片在支持產(chǎn)品本身需求的前提下,的卻能降低成本。NRF24L01P的國(guó)產(chǎn)替代SI24R1也是有一同測(cè)試,確實(shí)是還可以。 |