nrf24l01使用與除錯經驗總結
最近的專案用到了NRF晶片,進過幾天的奮戰總算是將所有的坑都填滿了。
--------------------------------------------------------華麗的分割線(以下介紹NRF特性)---------------------------------------------------------------------
主要特性
工作在 2.4GHz ISM 頻段
調製方式:GFSK/FSK
資料速率:2Mbps/1Mbps/250Kbps
超低關斷功耗:<0.7uA
超低待機功耗:<15uA
快速啟動時間: <130uS
內部整合高 PSRR LDO
寬電源電壓範圍:1.9-3.6V
數字 IO 電壓: 3.3V/5V
低成本晶振:16MHz±60ppm
接收靈敏度:<-83dBm @2MHz
最高發射功率:7dBm
接收電流(2Mbps):<15mA
發射電流(2Mbps):<12mA(0dBm)
10MHz 四線 SPI 模組
內部整合智慧 ARQ 基帶協議引擎
收發資料硬體中斷輸出
支援 1bit RSSI 輸出
極少外圍器件,降低系統應用成本
QFN20 封裝或 COB 封裝
--------------------------------------------------------華麗的分割線(以下介紹NRF通訊時序)---------------------------------------------------------------
注意:C代表了命令,S表示暫存器值,D表示資料
寫資料:SPI寫命令+暫存器地址----->SPI寫入資料
讀資料:SPI寫暫存器地址(可以使用讀命令+暫存器地址)----->SPI讀取資料
不論是讀取或者寫入資料,甚至是讀/寫len長度的資料都要先寫暫存器地址;
--------------------------------------------------------華麗的分割線(以下介紹NRF工作模式)---------------------------------------------------------------
總的來說時候就三個模式:
1.待機模式
2.傳送模式
3.接受模式
具體各個模式介紹參考資料手冊。。。
--------------------------------------------------------華麗的分割線(以下介紹NRF傳送資料格式)---------------------------------------------------------
nrf傳送資料是以包來發送。
其中前導碼和CRC不用管。具體我們來看看中間三部分:
地址:
地址也就是接收到通道的地址,如果是能了自動應答,那麼我們得將傳送地址(TX_ADDR) 和
接受應答訊號的通道地址(RX_ADDR_P0)設定為一樣的。
地址這裡必須搞清楚:
傳送流程:傳送方根據傳送地址(TX_ADDR)傳送到接收方(RX_ADDR_P0)接收方收到資料後以接收通道的地址(RX_ADDR_P0)為傳送地址傳送應答訊號給傳送方(這個應答訊號為自動傳送不需要人為傳送)。
例如:傳送方TX_ADDR=0x10=接收方接收通道地址(以通道0為例:RX_ADDR_P0)=傳送端接收通道地址(以通道0為例:RX_ADDR_P0), 總的來說就是接受方傳送地址和接受應答訊號的通道地址和接受方地址要一致。
多機組網只需要使能接收方全部通道並且分配好地址就ok了。
對於地址的分配要注意:
通道0和通道1的地址為5位元組可隨意給值。
其他2~5高4位元組與通道1高四位元組相同(通用高4位元組)我們只能修改他的左後一個位元組地址
例如:
const u8 RX0_ADDRESS[5]={0x10,0x10,0x10,0x10,0xAA}; //接收地址
const u8 RX1_ADDRESS[5]={0x11,0x10,0x10,0x10,0xFF}; //接收地址
const u8 RX2_ADDRESS[5]={0x12,0x10,0x10,0x10,0xFF}; //接收地址
const u8 RX3_ADDRESS[5]={0x13,0x10,0x10,0x10,0xFF}; //接收地址
const u8 RX4_ADDRESS[5]={0x14,0x10,0x10,0x10,0xFF}; //接收地址
const u8 RX5_ADDRESS[5]={0x15}; //接收地址
其實有資料手冊我們知道同道1有40位同道2只有8位所以我們在給同道2~5定義地址的時候可以定義為一個位元組(上述通道5)亦可以為了統一定義為5位元組(通道2~4)但是要注意:定義為5位元組也好1位元組也好我們在配置模式的時候通道2~5在寫入地址的時候自能寫入1位元組而不能寫入5位元組(會該導致接收不到資料-------這時刻巨坑)
對於包控制字:
這一部分主要是在配置模式的時候配置相應暫存器即可。
負載資料:
nrf有兩個32位元組的fifo暫存器用來存放負載資料的
傳送負載資料暫存器:W_TX_PAYLOAD(也就是命令,本人習慣叫他暫存器)
接收負載資料暫存器:R_RX_PAYLOAD(也就是命令,本人習慣叫他暫存器)
傳送/接收資料過程:配置好模式-----傳送/接收資料都是對W_TX_PAYLOAD/R_RX_PAYLOAD暫存器進行讀寫完成資料的傳送。
傳送/接收完成都會產生中斷,IRQ會輸出低電平(原先為高電平,重點)
注意:博主在通過IRQ中斷收發資料過程中遇到stm32io配置為上拉輸入和IRQ引腳連線會導致有的時候進入不了中斷
原因:IRQ的下拉能力太弱了會被io控偶的上拉電阻強制拉高,也就是說產生IRQ中斷由於上拉電阻影響IRQ回一直置高(巨坑)。
補救方法:將io配合為浮空輸入即可完美解決。。。。。
查閱資料得到:
通道0具有接收和傳送能力,然而其他2~5智慧接收(重點)
--------------------------------------------------------華麗的分割線(以下介紹NRF配置過程)---------------------------------------------------------
模式配置(在配置模式的時候完成地址的配置和欄位字的配置):
傳送模式:
1.寫入傳送地址和接受應答通道地址
2.使能應答通道
3.使能接收地址
4.設定自動重發時間和重發次數
5.設定通訊頻道
6.設定發射引數(功率,增益等)
7.設定模式(傳送還是接受)
注意在配置傳送或者接受時候要先讓其工作再待機模式即CE要先置0.
接受模式:
1.接收通道地址
2.接收通道有效資料寬度
3.使能通道自動應答
4.使能接受通道地址
5.設定通訊頻道
6.設定引數
7.配置工作模式
資料的傳送和接受:
傳送一包資料:
1.向fifo中寫入資料,等待IRQ傳送完成中斷
2.讀取狀態暫存器中的值
3.將讀取到的狀態暫存器中的值寫入狀態暫存器
4,.判斷之前讀取到的狀態暫存器中得值判斷是傳送完成還是傳送失敗
5.清空fifo暫存器
讀取一包資料:
1.讀取狀態暫存器中的值
2.將讀取到的狀態暫存器中的值寫入狀態暫存器
4.判斷狀態暫存器中得值,是否接受成功(成功就讀取fifo中的資料,並且清空fifo)
總結:通訊成功三個相同
1.傳送接收應答地址相同(包括應答地址)
2.傳送接收頻道相同(通道)
3.傳送接收頻率相同
注意:這個晶片不光能以2.4Ghz的載波發射呢,它的頻寬為2.4G----2.512G呢。這中間有一百多M的頻帶,可以劃分成2M一個的通道。這個暫存器中的值就標明你想工作在哪個通道上啦,只有設定為同頻的裝置才能接收的到很容易理解吧。比如你設為10通道,則10*2=20M即傳送時所用的載波頻率就是2400+20=2420MHz。當然也只有設為2420M的接收裝置才能接收的到了。
轉載請標明原貼出處:https://blog.csdn.net/zj490044512
要原始碼可聯絡博主