基于2.4GHz射頻通信的多功能鼠標(biāo)設(shè)計(jì)
2.2 無(wú)線發(fā)射部分
nRF24L01的工作原理如下:發(fā)射數(shù)據(jù)時(shí),首先將nRF24L01配置為發(fā)射模式,接著把接收節(jié)點(diǎn)地址TX_ADDR和有效數(shù)據(jù)TX_PLD按照時(shí)序由SPI口寫(xiě)入nRF24L01緩存區(qū)。TX_PLD必須在CSN為低時(shí)連續(xù)寫(xiě)入,而TX_ADDR在發(fā)射時(shí)寫(xiě)入一次即可。然后,CE置為高電平并保持至少10μs,延遲130μs后發(fā)射數(shù)據(jù)。若自動(dòng)應(yīng)答開(kāi)啟,那么nRF24L01在發(fā)射數(shù)據(jù)后立即進(jìn)入接收模式,接收應(yīng)答信號(hào)(自動(dòng)應(yīng)答接收地址應(yīng)該與接收節(jié)點(diǎn)地址TX_ADDR一致)。如果收到應(yīng)答,則認(rèn)為此次通信成功,TX_DS置高,同時(shí)TX_PLD從TX FIFO中清除;若未收到應(yīng)答,則自動(dòng)重新發(fā)射該數(shù)據(jù)(自動(dòng)重發(fā)已開(kāi)啟),若重發(fā)次數(shù)(ARC)達(dá)到上限,MAX_RT置高,TXFIFO中數(shù)據(jù)保留以便再次重發(fā)。MAX_RT或TX_DS置高時(shí),使IRQ變低,產(chǎn)生中斷,通知MCU。發(fā)射成功時(shí),若CE為低,則nRF24L01進(jìn)入待機(jī)模式1;若發(fā)送堆棧中有數(shù)據(jù)且CE為高,則進(jìn)入下一次發(fā)射;若發(fā)送堆棧中無(wú)數(shù)據(jù)且CE為高,則進(jìn)入待機(jī)模式2。
接收數(shù)據(jù)時(shí),首先將nRF24L01配置為接收模式,接著延遲130μs進(jìn)入接收狀態(tài)等待數(shù)據(jù)的到來(lái)。當(dāng)接收方檢測(cè)到有效的地址和CRC時(shí),就將數(shù)據(jù)包存儲(chǔ)在RXFIFO中,同時(shí)中斷標(biāo)志位RX_DR置高,IRQ變低,產(chǎn)生中斷,通知MCU取數(shù)據(jù)。若此時(shí)自動(dòng)應(yīng)答開(kāi)啟,接收方則同時(shí)進(jìn)入發(fā)射狀態(tài)回傳應(yīng)答信號(hào)。接收成功時(shí),若CE變低,則nRF24L01進(jìn)入待機(jī)模式1。
nRF24L01有發(fā)射、接收、待機(jī)和掉電4種工作模式,可以通過(guò)配置寄存器來(lái)設(shè)置其工作狀態(tài),如表1所列。
待機(jī)模式1(Standby-I)主要用于降低電流損耗(在該模式下,晶體振蕩器仍然工作)。待機(jī)模式2(Standby-II)是當(dāng)FIFO寄存器為空且CE=1時(shí)進(jìn)入此模式。待機(jī)模式下,所有配置字仍然保留。在掉電模式(PowerDown)下電流損耗最小,同時(shí)nRF24L01也不工作,但其所有配置寄存器的值仍然保留。
無(wú)線發(fā)射部分上電初始化時(shí),進(jìn)行了如下配置:
①CONFIG寄存器的低4位置1,分別為16位CRC校驗(yàn),芯片上電和接收模式;
②SETUP_AW(地址寬度)寄存器配置地址寬度為5字節(jié);
③SETUP_RETR(自動(dòng)重發(fā))寄存器配置為自動(dòng)重發(fā)延時(shí)500μs,重發(fā)5次;
④RF_CH(RF頻道)寄存器配置為工作頻道2 400MHz;
⑤RF_SETUP(RF設(shè)置)寄存器配置為發(fā)射功率0 dBm,Air Data Rate為1 MHz;
⑥將地址寫(xiě)入地址寄存器。
在配置寄存器時(shí)應(yīng)注意一點(diǎn):在寫(xiě)nRF24L01的寄存器時(shí),它必須工作在掉電模式或待機(jī)模式。而在nRF24L01上電達(dá)到1.9 V以后,要經(jīng)過(guò)10.3 ms的上電復(fù)位然后再進(jìn)入掉電模式。這是一個(gè)不確定狀態(tài)。在此狀態(tài)下,對(duì)寄存器的寫(xiě)操作是無(wú)法完成的,因此必須加上一個(gè)合適的延時(shí),使程序?qū)RF24L01的配置操作在掉電模式或待機(jī)模式下進(jìn)行。
當(dāng)光傳感器或按鍵等有操作時(shí),主控制器將讀入的信號(hào)寫(xiě)入nRF24L01的TX_PLD,然后由芯片自動(dòng)生成報(bào)頭和CRC校驗(yàn)碼,并發(fā)送出去。當(dāng)收到應(yīng)答信號(hào)(ACK)后,程序中所設(shè)置的標(biāo)志位success置1,清除TX FIFO隊(duì)列中的數(shù)據(jù),可以進(jìn)行下一次數(shù)據(jù)的寫(xiě)入了;若未收到應(yīng)答信號(hào)(ACK),則標(biāo)志位success置0,繼續(xù)重發(fā),且新的數(shù)據(jù)無(wú)法寫(xiě)入。
2.3 讀光傳感器位移值
讀光傳感器的位移值,其實(shí)就是讀它對(duì)應(yīng)的寄存器。在ADNS-5030的內(nèi)部寄存器中,地址為0x02的Motion寄存器用于表示是否有位移。其最高位若為0,則無(wú)位移;最高位若為1,則有位移。另外,使用到的兩個(gè)寄存器的地址是0x03和Ox04的DeltaX和DeltaY。這兩個(gè)寄存器的值分別表示X軸和Y軸方向上的位移。最高位表示位移的方向,1為負(fù)方向,0為正方向,低7位表示位移量。
評(píng)論