1. 程式人生 > >基於STM32驅動2.4G模組除錯之路

基於STM32驅動2.4G模組除錯之路

/*  * 您好,歡迎您來到2.4G調式的世界  * 調式之路是非常艱辛和枯燥的  * 如果你沒有一鼓作氣的決心和毅力!  * 請不要來調式,時間不會陪您打魚晒網 */ 雙方配置確保一致(地址,資料位長度,通訊頻率等) 請嚴格按照資料的傳送與接收時間來控制(傳送控制時間和接收控制時間) 在模組傳送資料或者接收資料時儘量不要被打斷(關閉中斷) 如果你用的是SWD介面下載除錯,那麼這裡請注意,SWD可能會影響2.4G模組的正常工作。

下面是除錯的基本方法:            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);  // 失能自動重發 

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

這樣就很清晰了,我們可以通過讀取STATUS的值來判斷是哪個事件觸發了中斷,暫存器4、5、6位分別對應自動重發完成中斷, 資料傳送完成中斷,資料接收完成中斷。也就是說,在之前的配置下,如果資料成功傳送,那麼STATUS的值應該為0x2e。 這樣就可以作為一個檢測標準,另外一個標準可以看FIFO_STATUS暫存器,第5位的描述:傳送緩衝器滿標誌,1為滿,0為有可用空間; 第4位的描述:傳送緩衝器空標誌,1為空,0為有資料;同樣可以看到接收緩衝器的對應標誌。這樣在資料傳送成功後,傳送暫存器當然應該是空的, 接收緩衝因為在之前已經失能,所以也應該是空,也就是說成功傳送之後的FIFO_STATUS暫存器值應該是0x11。 有了這兩個檢測標準,我們即使不用接收方也可以確定傳送方是否成功傳送。當傳送方除錯成功之後, 在程式裡讓它一直髮送,然後我們就可以去除錯接收方,思路是一樣的,同樣說下接收方工作流程先。

配置暫存器使晶片工作於接收模式後拉高CE端至少130us 讀狀態暫存器STATUS 判斷是否是接收完成標誌位置位 清標誌 讀取資料緩衝區的資料 清資料緩衝0先0

然後在初始化配置暫存器的時候要和傳送方保持一致,比較重要的是要失能自動應答,使能通道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

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