NRF24L01

一、簡介
NRF24L01 是 NORDIC 公司最近生產的一款無線通信通信芯片,采用 FSK 調制,內部
集成 NORDIC 自己的 Enhanced Short Burst 協議。可以實現點對點或是 1 對 6 的無線通信。無線通信速度可以達到 2M(bps)。NORDIC 公司提供通信模塊的 GERBER 文件,可以直接加工生產。嵌入式工程師或是單片機愛好者只需要為單片機系統預留 5 個 GPIO,1 個中斷輸入引腳,就可以很容易實現無線通信的功能,非常適合用來為 MCU 系統構建無線通信功能。
二、引腳功能描述

VCC 腳接電壓范圍為2.0V~3.6V 之間,不能在這個區間之外,超過 3.6V 將會燒毀模塊。推薦電壓 3.3V 左右。除電源 VCC 和接地端,其余腳都可以直接和普通的 5V 單片機 IO口直接相連,無需電平轉換。當然對3V左右的單片機更加適用了。
程序設計
一、對 24L01 的程序編程的基本思路如下:
1) 置 CSN 為低,使能芯片,配置芯片各個參數。(過程見 3.Tx 與 Rx 的配置過程)
配置參數在 Power Down 狀態中完成。
2) 如果是 Tx 模式,填充 Tx FIFO。
3) 配置完成以后,通過 CE 與 CONFIG 中的 PWR_UP 與 PRIM_RX 參數確定 24L01
要切換到的狀態。
Tx Mode:PWR_UP=1; PRIM_RX=0; CE=1 (保持超過 10us 就可以);
Rx Mode: PWR_UP=1; PRIM_RX=1; CE=1;
4) IRQ 引腳會在以下三種情況變低:
Tx FIFO 發完并且收到 ACK(使能 ACK 情況下)
Rx FIFO 收到數據
達到最大重發次數
將 IRQ 接到外部中斷輸入引腳,通過中斷程序進行處理。
二、Tx 與 Rx 的配置過程
1、Tx 模式初始化過程:
1)寫 Tx 節點的地址 TX_ADDR
2)寫 Rx 節點的地址(主要是為了使能 Auto Ack) RX_ADDR_P0
3)使能 AUTO ACK EN_AA
4)使能 PIPE 0 EN_RXADDR
5)配置自動重發次數 SETUP_RETR
6)選擇通信頻率 RF_CH
7)配置發射參數(低噪放大器增益、發射功率、無線速率) RF_SETUP
8 ) 選擇通道 0 有效數據寬度 Rx_Pw_P0
9)配置 24L01 的基本參數以及切換工作模式 CONFIG。
2、Rx 模式初始化過程:
1)寫 Rx 節點的地址 RX_ADDR_P0
2)使能 AUTO ACK EN_AA
3)使能 PIPE 0 EN_RXADDR
4)選擇通信頻率 RF_CH
5) 選擇通道 0 有效數據寬度 Rx_Pw_P0
6)配置發射參數(低噪放大器增益、發射功率、無線速率) RF_SETUP
7)配置 24L01 的基本參數以及切換工作模式 CONFIG。
三、基本程序函數
下面主要介紹幾個重要程序函數,其它的程序函數需要的可以留言獲取
1、nRF24L01+接收模式初始化
void nRF24L01P_RX_Mode(void)
{
CE = 0;
nRF24L01P_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 接收設備接收通道0使用和發送設備相同的發送地址
nRF24L01P_Write_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自動應答
nRF24L01P_Write_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0
nRF24L01P_Write_Reg(WRITE_REG + RF_CH, 40); // 選擇射頻通道0x40
nRF24L01P_Write_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // 接收通道0選擇和發送通道相同有效數據寬度
nRF24L01P_Write_Reg(WRITE_REG + RF_SETUP, 0x0f); // 數據傳輸率2Mbps,發射功率0dBm,低噪聲放大器增益(nRF24L01+忽略該位)
nRF24L01P_Write_Reg(WRITE_REG + CONFIG, 0x0f); // CRC使能,16位CRC校驗,上電,接收模式
nRF24L01P_Write_Reg(WRITE_REG + STATUS, 0xff); //清除所有的中斷標志位
CE = 1; // 拉高CE啟動接收設備
}
2、nRF24L01+發送模式初始化
void nRF24L01P_TX_Mode(void)
{
CE = 0;
nRF24L01P_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 寫入發送地址
nRF24L01P_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 為了應答接收設備,接收通道0地址和發送地址相同
nRF24L01P_Write_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自動應答
nRF24L01P_Write_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0
nRF24L01P_Write_Reg(WRITE_REG + SETUP_RETR, 0x0a); // 自動重發延時等待250us+86us,自動重發10次
nRF24L01P_Write_Reg(WRITE_REG + RF_CH, 40); // 選擇射頻通道0x40
nRF24L01P_Write_Reg(WRITE_REG + RF_SETUP, 0x0f); // 數據傳輸率2Mbps,發射功率0dBm,低噪聲放大器增益(nRF24L01+忽略該位)
nRF24L01P_Write_Reg(WRITE_REG + CONFIG, 0x0e); // CRC使能,16位CRC校驗,上電
//CE = 1;
}
3、
/********************************************************
函數功能:讀取接收數據
入口參數:rxbuf:接收數據存放首地址
返回 值:0:接收到數據
1:沒有接收到數據
*********************************************************/
u8 nRF24L01P_RxPacket(u8 *rxbuf)
{
u8 stat
state = nRF24L01P_Read_Reg(STATUS); //讀取狀態寄存器的值
nRF24L01P_Write_Reg(WRITE_REG+STATUS,state); //清除RX_DS中斷標志
if(state & RX_DR) //接收到數據
{
nRF24L01P_Read_Buf(RD_RX_PLOAD,rxbuf,TX_PLOAD_WIDTH); //讀取數據
nRF24L01P_Write_Reg(FLUSH_RX,0xff); //清除RX FIFO寄存器
return 0;
}
return 1; //沒收到任何數據
}
4、
/********************************************************
函數功能:發送一個數據包
入口參數:txbuf:要發送的數據
返回 值:0x10:達到最大重發次數,發送失敗
0x20:發送成功
0xff:發送失敗
*********************************************************/
u8 nRF24L01P_TxPacket(u8 *txbuf)
{
u8 state;
CE=0; //CE拉低,使能24L01配置
nRF24L01P_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH); //寫數據到TX FIFO,32個字節
CE=1; //CE置高,使能發送
while(IRQ == 1); //等待發送完成
state=nRF24L01P_Read_Reg(STATUS); //讀取狀態寄存器的值
nRF24L01P_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中斷標志
if(state&MAX_RT) //達到最大重發次數
{
nRF24L01P_Write_Reg(FLUSH_TX,0xff); //清除TX FIFO寄存器
return MAX_RT;
}
if(state&TX_DS) //發送完成
{
return TX_DS;
}
return 0XFF; //發送失敗
}
通信測試
1、兩個NRF24L01的目標地址和接收地址需要設置成一樣的,
發送和接收程序下面這個函數里面的地址必須是一樣的
u8 code TX_ADDRESS[TX_ADR_WIDTH] = {0x11,0x22,0x33,0x44,0x55}; // 定義一個靜態發送地址
2、通信頻率需要設置成一樣的,RF_CH是選擇頻率寄存器,
頻率計算公式是2400+“RF_CH”,單位是MHZ;接收和發射函數里面設置的RF_CH值是40,所以實際通信頻率是2400+40=2.440GHZ
3、數據傳輸速率也需要設置成一樣的,
一、兩個51單片機控制NRF24L01互相通信
1、51單片機和NRF24L01接線
| STC89C52RC | NRF24L01 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| CSN | P1_5 |
| CE | P1_4 |
| MOSI | P1_3 |
| SCK | P1_2 |
| IRQ | P1_1 |
| MISO | P1_0 |
2、發送程序
u8 a = 0;
int main(void)
{
UART_Init();
nRF24L01P_Init();
while(1)
{
u8 buf[32] = {0};
buf[0] = 0xAA;
nRF24L01P_TX_Mode();
a = nRF24L01P_TxPacket(buf);
Delay(200);
UART_SendByte(a);
buf[0] = 0;
}
}
3、接收程序
int main(void)
{
u8 buf[32] = {0};
nRF24L01P_Init();
UART_Init();
nRF24L01P_RX_Mode();
while(1)
{
buf[0] = 0;
nRF24L01P_RxPacket(buf);
UartSendStr(buf);
Delay(200);
buf[0] = 0;
}
}
實驗現象
下圖,右邊的20是發送成功標志,左邊AA是發送的數據
一、51單片機控制NRF24L01與NRF24L01轉TTL串口模塊通信
1、NRF24L01轉TTL串口模塊
接收參數和發射參數需要設置成一樣的才能通訊
2、發射程序
int a = 0;
int main(void)
{
UART_Init();
nRF24L01P_Init();
while(1)
{
u8 buf[32] = {" NRF24L01 Testrn"};
nRF24L01P_TX_Mode();
a = nRF24L01P_TxPacket(buf);
UART_SendByte(a);
Delay(200);
}
}
3、現象
總結
NRF24L01模塊不支持熱插拔,熱插拔會損壞模塊;代碼調試的過程還有些小BUG,希望得到大佬指點,需要工程的在下方留言
審核編輯 黃宇
-
TTL
+關注
關注
7文章
557瀏覽量
74856 -
nRF24L01
+關注
關注
17文章
332瀏覽量
75421
發布評論請先 登錄
nrf24l01無線模塊傳輸距離分析
nRF24L01無線模塊使用教程之經典使用程序詳細資料合集免費下載
nRF24L01無線2.4G通信模塊的詳細研究資料說明
NRF24L01的模塊資料和C語言程序和使用與開發攻略合集免費下載
51驅動NRF24L01通信,NRF24L01與TTL轉NRF24L01模塊通信
評論