nRF24L01發送接收調試應用筆記

24L01是收發雙方都需要編程的器件,這就對調試方法產生了一定的要求,如果兩塊一起調,那麼通訊不成功,根本不知道是發的問題還是收的問題,不隱晦的說,我當時也是沒理清調試思路才浪費了大半天時間看着模塊乾瞪眼。正確的方法應該是先調試發送方,能保證發送正確,再去調接收,這樣就可以有針對性的解決問題。

至於怎麼去調發送方,先說下發送方的工作流程:

 

·配置寄存器使芯片工作於發送模式後拉高CE端至少10us

·讀狀態寄存器STATUS

·判斷是否是發送完成標誌位置位

·清標誌

·清數據緩衝

 

網上的程序我也看過,大多都是成品,發送方發送-等應答-(自動重發)-觸發中斷。可是這樣的流程就已經把接收方給牽涉進來了,就是說一定要接收方正確收到數據並且回送應答信號之後發送方纔能觸發中斷,結束一次完整的發送。可是這跟我們的初衷不相符,我們想單獨調試發送,完全拋開接收,這樣就要去配置一些參數來取消自動應答,取消自動重發,讓發送方達到發出數據就算成功的目的。

       SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);           //失能通道0自動應答

       SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);    //失能接收通道0

SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);      //失能自動重發

(注:以下貼出的寄存器描述由於中文資料上有一個錯誤,故貼出原版英文資料)




有了以上這三個配置,發送方的流程就變成了發送-觸發中斷。這樣就拋開了接收方,可以專心去調試發送,可是怎麼樣才知道發送是否成功呢,要用到另外兩個寄存器,STATUS和FIFO_STATUS。



這樣就很清晰了,我們可以通過讀取STATUS的值來判斷是哪個事件觸發了中斷,寄存器4、5、6位分別對應自動重發完成中斷,數據發送完成中斷,數據接收完成中斷。也就是說,在之前的配置下,如果數據成功發送,那麼STATUS的值應該爲0x2e。這樣就可以作爲一個檢測標準,另外一個標準可以看FIFO_STATUS寄存器,第5位的描述:發送緩衝器滿標誌,1爲滿,0爲有可用空間;第4位的描述:發送緩衝器空標誌,1爲空,0爲有數據;同樣可以看到接收緩衝器的對應標誌。這樣在數據發送成功後,發送寄存器當然應該是空的,接收緩衝因爲在之前已經失能,所以也應該是空,也就是說成功發送之後的FIFO_STATUS寄存器值應該是0x11。

有了這兩個檢測標準,我們即使不用接收方也可以確定發送方是否成功發送。當發送方調試成功之後,在程序裏讓它一直髮送,然後我們就可以去調試接收方,思路是一樣的,同樣說下接收方工作流程先。

 

·配置寄存器使芯片工作於接收模式後拉高CE端至少130us

·讀狀態寄存器STATUS

·判斷是否是接收完成標誌位置位

·清標誌

·讀取數據緩衝區的數據

·清數據緩衝

 

然後在初始化配置寄存器的時候要和發送方保持一致,比較重要的是要失能自動應答,使能通道0接收:

       SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);           //失能通道0自動應答

SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);    //接收要使能接收通道0

這樣就可以了,接收方就可以進入接收模式去接收數據了,這次的調試就會靈活一些,因爲是接收數據,可以在接收方添加一個顯示設備把數據直觀的顯示出來,去對照看是否正確,當然還可以使用和發送方一樣的方法:觀察STATUS和FIFO_STATUS的值,對照寄存器描述,接收正確時STATUS的值應該是0x40,對於FIFO_STATUS的情況就多了些,因爲數據寬度的不同也會造成寄存器的值不一樣,24L01最大支持32字節寬度,就是說一次通訊最多可以傳輸32個字節的數據,在這種情況下,接收成功讀數據之前寄存器值應該爲0x12,讀數據之後就會變成0x11;如果數據寬度定義的小於32字節,那麼接收成功讀數據之前寄存器值應該爲0x10,讀數據之後就會變成0x11。這個看起來挺複雜,其實很清晰,大家可以試着分析下,對照數據手冊分析每個位的狀態就可以得到結果。

 

好了,到這裏對nRF24L01的調試基本上就算通了,但是要明白這些只是調試方法,最終的產品如果不加上應答和重發的話那麼數據的穩定性是很難保證的,所以在基本的通訊建立之後就要把發送的配置改爲:      

SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);             //使能接收通道0自動應答

       SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);      //使能接收通道0        

       SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a);      //自動重發10次,間隔500us

接收方的配置也要更改:

       SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);           //失能通道0自動應答

SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);    //接收要使能接收通道0

 

這樣發送和接收就進入了一個標準狀態,發送-等應答-(自動重發)-觸發中斷;接收-應答-觸發中斷,一切按部就班,程序里加上自己的應用部分就能實現很多功能了

感謝本文原作者

【來源於網絡 http://hi.baidu.com/ojtozxfrpzgjkqe/item/332abb15a8929afc9d778a19#713670-tieba-1-8751-ff0040df7e5ea8acd13e092599825e92】

發佈了27 篇原創文章 · 獲贊 28 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章