NRF24L01

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

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