導航:首頁 > 編程語言 > nrf24l01寫程序

nrf24l01寫程序

發布時間:2023-08-09 19:27:17

㈠ nRF24l01無線模塊 程序里有個頭文件:#include<api.h> 誰知道,麻煩給下。

// BYTE type definition
#ifndef _BYTE_DEF_
#define _BYTE_DEF_
typedef unsigned char BYTE;
#endif /* _BYTE_DEF_ */
// Define interface to nRF24L01
/*#ifndef _SPI_PIN_DEF_
#define _SPI_PIN_DEF_
// Define SPI pins
/*sbit SCK = P0^0; // Master Out, Slave In pin (output)
sbit MISO = P0^1; // Master In, Slave Out pin (input)
sbit MOSI = P0^2; // Serial Clock pin, (output)
sbit CSN = P0^3; // Slave Select pin, (output to CSN, nRF24L01)
// Define CE & IRQ pins
sbit CE = P0^4; // Chip Enable pin signal (output)
sbit IRQ = P0^5; // Interrupt signal, from nRF24L01 (input)
#endif*/
// Macro to read SPI Interrupt flag
//#define WAIT_SPIF (!(SPI0CN & 0x80)) // SPI interrupt flag(礐 platform dependent)
// Declare SW/HW SPI modes
//#define SW_MODE 0x00
//#define HW_MODE 0x01
// Define nRF24L01 interrupt flag's
//#define MAX_RT 0x10 // Max #of TX retrans interrupt
//#define TX_DS 0x20 // TX data sent interrupt
//#define RX_DR 0x40 // RX data received
//#define SPI_CFG 0x40 // SPI Configuration register value
//#define SPI_CTR 0x01 // SPI Control register values
//#define SPI_CLK 0x00 // SYSCLK/2*(SPI_CLK+1) == > 12MHz / 2 = 6MHz
//#define SPI0E 0x02 // SPI Enable in XBR0 register
//****************************************************************//
// SPI(nRF24L01) commands
#define READ_REG 0x00 // Define read command to register
#define WRITE_REG 0x20 // Define write command to register
#define RD_RX_PLOAD 0x61 // Define RX payload register address
#define WR_TX_PLOAD 0xA0 // Define TX payload register address
#define FLUSH_TX 0xE1 // Define flush TX register command
#define FLUSH_RX 0xE2 // Define flush RX register command
#define REUSE_TX_PL 0xE3 // Define reuse TX payload register command
#define NOP 0xFF // Define No Operation, might be used to read status register
//***************************************************//
// SPI(nRF24L01) registers(addresses)
#define CONFIG 0x00 // 'Config' register address
#define EN_AA 0x01 // 'Enable Auto Acknowledgment' register address
#define EN_RXADDR 0x02 // 'Enabled RX addresses' register address
#define SETUP_AW 0x03 // 'Setup address width' register address
#define SETUP_RETR 0x04 // 'Setup Auto. Retrans' register address
#define RF_CH 0x05 // 'RF channel' register address
#define RF_SETUP 0x06 // 'RF setup' register address
#define STATUS 0x07 // 'Status' register address
#define OBSERVE_TX 0x08 // 'Observe TX' register address
#define CD 0x09 // 'Carrier Detect' register address
#define RX_ADDR_P0 0x0A // 'RX address pipe0' register address
#define RX_ADDR_P1 0x0B // 'RX address pipe1' register address
#define RX_ADDR_P2 0x0C // 'RX address pipe2' register address
#define RX_ADDR_P3 0x0D // 'RX address pipe3' register address
#define RX_ADDR_P4 0x0E // 'RX address pipe4' register address
#define RX_ADDR_P5 0x0F // 'RX address pipe5' register address
#define TX_ADDR 0x10 // 'TX address' register address
#define RX_PW_P0 0x11 // 'RX payload width, pipe0' register address
#define RX_PW_P1 0x12 // 'RX payload width, pipe1' register address
#define RX_PW_P2 0x13 // 'RX payload width, pipe2' register address
#define RX_PW_P3 0x14 // 'RX payload width, pipe3' register address
#define RX_PW_P4 0x15 // 'RX payload width, pipe4' register address
#define RX_PW_P5 0x16 // 'RX payload width, pipe5' register address
#define FIFO_STATUS 0x17 // 'FIFO Status Register' register address
//***************************************************************//
// FUNCTION's PROTOTYPES //
/****************************************************************
void SPI_Init(BYTE Mode); // Init HW or SW SPI
BYTE SPI_RW(BYTE byte); // Single SPI read/write
BYTE SPI_Read(BYTE reg); // Read one byte from nRF24L01
BYTE SPI_RW_Reg(BYTE reg, BYTE byte); // Write one byte to register 'reg'
BYTE SPI_Write_Buf(BYTE reg, BYTE *pBuf, BYTE bytes); // Writes multiply bytes to one register
BYTE SPI_Read_Buf(BYTE reg, BYTE *pBuf, BYTE bytes); // Read multiply bytes from one register
//*****************************************************************/

㈡ NRF24L01發射與接收程序——51單片機

#include <reg52.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned char uint;
//****************************************NRF24L01埠定義***************************************
sbit MISO =P1^5;
sbit MOSI =P1^4;
sbit SCK =P1^3;
sbit CE =P1^1;
sbit CSN =P1^2;
sbit IRQ =P1^6;
//************************************按鍵***************************************************
sbit KEY1=P2^6;
sbit KEY2=P2^5;
//************************************數碼管位選*********************************************
sbit led1=P2^4;
sbit led2=P3^5;
//*********************************************NRF24L01*************************************
#define TX_ADR_WIDTH 5 // 5 uints TX address width
#define RX_ADR_WIDTH 5 // 5 uints RX address width
#define TX_PLOAD_WIDTH 20 // 20 uints TX payload
#define RX_PLOAD_WIDTH 20 // 20 uints TX payload
uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址
uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址
//***************************************NRF24L01寄存器指令*******************************************************
#define READ_REG 0x00 // 讀寄存器指令
#define WRITE_REG 0x20 // 寫寄存器指令
#define RD_RX_PLOAD 0x61 // 讀取接收數據指令
#define WR_TX_PLOAD 0xA0 // 寫待發數據指令
#define FLUSH_TX 0xE1 // 沖洗發送 FIFO指令
#define FLUSH_RX 0xE2 // 沖洗接收 FIFO指令
#define REUSE_TX_PL 0xE3 // 定義重復裝載數據指令
#define NOP 0xFF // 保留
//*************************************SPI(nRF24L01)寄存器地址****************************************************
#define CONFIG 0x00 // 配置收發狀態,CRC校驗模式以及收發狀態響應方式
#define EN_AA 0x01 // 自動應答功能設置
#define EN_RXADDR 0x02 // 可用信道設置
#define SETUP_AW 0x03 // 收發地址寬度設置
#define SETUP_RETR 0x04 // 自動重發功能設置
#define RF_CH 0x05 // 工作頻率設置
#define RF_SETUP 0x06 // 發射速率、功耗功能設置
#define STATUS 0x07 // 狀態寄存器
#define OBSERVE_TX 0x08 // 發送監測功能
#define CD 0x09 // 地址檢測
#define RX_ADDR_P0 0x0A // 頻道0接收數據地址
#define RX_ADDR_P1 0x0B // 頻道1接收數據地址
#define RX_ADDR_P2 0x0C // 頻道2接收數據地址
#define RX_ADDR_P3 0x0D // 頻道3接收數據地址
#define RX_ADDR_P4 0x0E // 頻道4接收數據地址
#define RX_ADDR_P5 0x0F // 頻道5接收數據地址
#define TX_ADDR 0x10 // 發送地址寄存器
#define RX_PW_P0 0x11 // 接收頻道0接收數據長度
#define RX_PW_P1 0x12 // 接收頻道0接收數據長度
#define RX_PW_P2 0x13 // 接收頻道0接收數據長度
#define RX_PW_P3 0x14 // 接收頻道0接收數據長度
#define RX_PW_P4 0x15 // 接收頻道0接收數據長度
#define RX_PW_P5 0x16 // 接收頻道0接收數據長度
#define FIFO_STATUS 0x17 // FIFO棧入棧出狀態寄存器設置
//**************************************************************************************
void Delay(unsigned int s);
void inerDelay_us(unsigned char n);
void init_NRF24L01(void);
uint SPI_RW(uint uchar);
uchar SPI_Read(uchar reg);
void SetRX_Mode(void);
uint SPI_RW_Reg(uchar reg, uchar value);
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
void nRF24L01_TxPacket(unsigned char * tx_buf);
//*****************************************長延時*****************************************
void Delay(unsigned int s)
{
unsigned int i;
for(i=0; i<s; i++);
for(i=0; i<s; i++);
}
//******************************************************************************************
uint bdata sta; //狀態標志
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
/******************************************************************************************
/*延時函數
/******************************************************************************************/
void inerDelay_us(unsigned char n)
{
for(;n>0;n--)
_nop_();
}
//****************************************************************************************
/*NRF24L01初始化
//***************************************************************************************/
void init_NRF24L01(void)
{
inerDelay_us(100);
CE=0; // chip enable
CSN=1; // Spi disable
SCK=0; //
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 寫本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 寫接收端地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 頻道0自動 ACK應答允許
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允許接收地址只有頻道0,如果需要多頻道可以參考Page21
SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 設置信道工作為2.4GHZ,收發必須一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //設置接收數據長度,本次設置為32位元組
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //設置發射速率為1MHZ,發射功率為最大值0dB
}
/****************************************************************************************************
/*函數:uint SPI_RW(uint uchar)
/*功能:NRF24L01的SPI寫時序
/****************************************************************************************************/
uint SPI_RW(uint uchar)
{
uint bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
{
MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI
uchar = (uchar << 1); // shift next bit into MSB..
SCK = 1; // Set SCK high..
uchar |= MISO; // capture current MISO bit
SCK = 0; // ..then set SCK low again
}
return(uchar); // return read uchar
}
/****************************************************************************************************
/*函數:uchar SPI_Read(uchar reg)
/*功能:NRF24L01的SPI時序
/****************************************************************************************************/
uchar SPI_Read(uchar reg)
{
uchar reg_val;

CSN = 0; // CSN low, initialize SPI communication...
SPI_RW(reg); // Select register to read from..
reg_val = SPI_RW(0); // ..then read registervalue
CSN = 1; // CSN high, terminate SPI communication

return(reg_val); // return register value
}
/****************************************************************************************************/
/*功能:NRF24L01讀寫寄存器函數
/****************************************************************************************************/
uint SPI_RW_Reg(uchar reg, uchar value)
{
uint status;

CSN = 0; // CSN low, init SPI transaction
status = SPI_RW(reg); // select register
SPI_RW(value); // ..and write value to it..
CSN = 1; // CSN high again

return(status); // return nRF24L01 status uchar
}
/****************************************************************************************************/
/*函數:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用於讀數據,reg:為寄存器地址,pBuf:為待讀出數據地址,uchars:讀出數據的個數
/****************************************************************************************************/
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;

CSN = 0; // Set CSN low, init SPI tranaction
status = SPI_RW(reg); // Select register to write to and read status uchar

for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
pBuf[uchar_ctr] = SPI_RW(0); //

CSN = 1;

return(status); // return nRF24L01 status uchar
}
/*********************************************************************************************************
/*函數:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用於寫數據:為寄存器地址,pBuf:為待寫入數據地址,uchars:寫入數據的個數
/*********************************************************************************************************/
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;

CSN = 0; //SPI使能
status = SPI_RW(reg);
for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
SPI_RW(*pBuf++);
CSN = 1; //關閉SPI
return(status); //
}
/****************************************************************************************************/
/*函數:void SetRX_Mode(void)
/*功能:數據接收配置
/****************************************************************************************************/
void SetRX_Mode(void)
{
CE=0;
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收發完成中斷響應,16位CRC ,主接收
CE = 1;
inerDelay_us(130);
}
/******************************************************************************************************/
/*函數:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
/*功能:數據讀取後放如rx_buf接收緩沖區中
/******************************************************************************************************/
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{
unsigned char revale=0;
sta=SPI_Read(STATUS); // 讀取狀態寄存其來判斷數據接收狀況
if(RX_DR) // 判斷是否接收到數據
{
CE = 0; //SPI使能
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
revale =1; //讀取數據完成標志
}
SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到數據後RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清楚中斷標志
return revale;
}
/***********************************************************************************************************
/*函數:void nRF24L01_TxPacket(unsigned char * tx_buf)
/*功能:發送 tx_buf中數據
/**********************************************************************************************************/
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
CE=0; //StandBy I模式
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 裝載接收端地址
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 裝載數據
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收發完成中斷響應,16位CRC,主發送
CE=1; //置高CE,激發數據發送
inerDelay_us(10);
}
//************************************主函數************************************************************
void main(void)
{
unsigned char tf =0;
unsigned char TxBuf[20]={0}; //
unsigned char RxBuf[20]={0};
init_NRF24L01() ;
led1=1;led2=1;
P0=0x00;
TxBuf[1] = 1 ;
TxBuf[2] = 1 ;
nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data
Delay(6000);
P0=0xBF;
while(1)
{
//測試程序
}

㈢ 單片機nrf24l01無線模塊程序

你好:

stc52、pic16f877a、arm9、linux驅動程序的nrf常式我都有。

根據你說的四個按鍵做遙控車的程序相當簡單,配置好nrf後,在main函數里一直掃描鍵盤是否按下就行,類似如下:


然後在接收端判斷為何數據,做出相應的動作即可。

希望我的回答能幫助到你。

㈣ 求NRF24L01多對一通信的程序!!!

/ *********************************發送程序************** *************************************** /
#包括

#包括

的typedef unsigned int類型UINT;

typedef的無符號字元型UCHAR;

#定義TX_ADDR_WITDH / /發送地址寬度設置為5個字部分

#定義RX_ADDR_WITDH 5 / /接收地址寬度設置為5個位元組

#定義TX_DATA_WITDH 8 / /

#定義RX_DATA_WITDH 8

/ ******* ************************************************** *********

/ / nRF24L01的指令格式:

************************** ***************************************** /

#定義R_REGISTER銷售0X00 / /讀取寄存器

#定義W_REGISTER 0X20 / /寫寄存器

#定義R_RX_PLOAD 0x61 / /讀取位元組的RX FIFO數據1-32,完成讀取數據時,數據將被清除,應用接收到的模式

#DEFINE W_TX_PLOAD 0XA0 / /寫TX FIFO中的數據,1-32位元組寫操作開始位元組0傳輸模式

#定義FLUSH_TX 0XE1 / /清除TX FIFO寄存器,應用於使用傳輸模式

#定義FLUSH_RX 0XE2 / /清除RX FIFO寄存器,用於在接收模式

#定義REUSE_TX_PL 0XE3 / /重新使用一包有效數據當CE為高,數據包的 BR />#定義不斷重新啟動0xFF的/ / NOP無操作可以用來讀取狀態寄存器

/ ********************* *********************************************

/ / nRF24L01的寄存器地址

**************** ******** /

#定義配置為0x00,/ /配置寄存器

#定義EN_AA 0X01 / /自動響應函數存儲

#定義EN_RX_ADDR 0X02 / /接收通道啟用注冊

#定義SETUP_AW 0X03 / /地址寬度設置寄存器

#定義SETUP_RETR 0x04的/ /自動重發設置寄存器

#定義RF_CH 0X05 / / RF信道頻率設置寄存器

#定義RF_SETUP 0X06 / / RF設置寄存器

#定義狀態為0x07 / /狀態寄存器的

#定義OBSERVE_TX 0X08 / /發送檢測寄存器#定義0X09 / / CD載波檢測寄存器

#定義RX_ADDR_P0 0X0A / /數據的通道0接收地址寄存器

#定義RX_ADDR_P1 0X0B / /數據通道接收地址寄存器

#定義RX_ADDR_P2 0X0C / /數據通道2接收地址寄存器

#定義RX_ADDR_P3 0X0D / /數據的通道3接收地址寄存器

#定義RX_ADDR_P4 0X0E通道接收地址寄存器

#定義RX_ADDR_P5 0X0F / / /數據數據路徑5 /接收地址寄存器

#定義TX_ADDR為0x10,/ /發送地址寄存器

#定義和RX_PW_P0 0x11 / /數據通道0的數據寬度設置寄存器

#定義RX_PW_P1 0X12 / /數據通道1有效數據寬度設置寄存器

#定義RX_PW_P2 0X13 / /數據通道的有效數據寬度設置寄存器

#定義RX_PW_P3 0X14 / /數據通道3有效數據寬度設置寄存器

#定義RX_PW_P4 0X15 / /數據通道4有效數據寬度設置寄存器#定義RX_PW_P5 0X16 / /數據通道的有效數據寬度設置寄存器

#定義FIFO_STATUS 0X17 / / FIFO狀態寄存器

/ / *** ************************************************** ****************************

UCHAR站; / /狀態變數

#定義RX_DR(STA 0X40 )/ /接收成功

#定義TX_DS(站地址0x20)/ /成功發射中斷標志

#定義MAX_RT(STA 0X10)/ /轉播溢出中斷標志 SBIT CE = P2 ^ 0;

SBIT IRQ = P1 ^ 0;

SBIT CSN = P2 ^ 1

SBIT MOSI = P2 ^ 3;

SBIT MISO = P2 ^ 4;

SBIT SCK = P2 ^ 2;

/ / SBIT LED的= P0 ^ 0;

SBIT鍵= P3 ^ 2;

UCHAR代碼TX_ADDR [] = {0X34,0x43,為0x10,0X10,0X01};

代碼TX_BUFFER UCHAR [] = {0XFE,會將0xfd,0xFB的,0XF7,0xef,0xDF的,為0xBF,0X00};

UCHAR RX_BUFFER [RX_DATA_WITDH];

無效_delay_us(UINT)

{

UINT I,J;

(J = 0; J <X; J + +)

就(i = 0; <12 + +);

}

無效_delay_ms(UINT)

{

UINT I,J;

(J = 0; <X; + +)<(= 0; <120; + +);

}

/ * nRF24L01的初始化* /

無效nRF24L01_Init的(無效) /> {

CE = 0 ;/ /待機模式我

CSN = 1;

SCK = 0;

IRQ = 1;

}
> / * SPI時序函數* /

:UCHAR SPI_RW(UCHAR位元組)

{

UCHAR I;

就(i = 0; <8; + +)/ / 8個位元組的8位循環寫

{

(位元組0X80)/ /如果數據位是1

MOSI = 1 ;/ /寫入nRF24L01的1

其他/ /否則,寫0

MOSI = 0;

位元組<< = 1 ;/ /低一個移動的最高位

SCK = 1 ;/ / SCK拉,寫數據,而讀一個數據

(MISO)

位元組| = 0X01;

SCK = 0 ;/ / SCK低

}

;/ /返回返回位元組讀取一個位元組 BR />}

/ * SPI寫寄存器一個位元組函數* /

/ * REG:寄存器地址* /

/ *值:一個位元組(值)* /

UCHAR章第:UCHAR SPI_W_Reg(UCHAR值)

{

UCHAR狀態;/ /返回狀態

CSN = 0 ;/ / SPI片選

狀態= SPI_RW(REG); / /寫寄存器地址,和讀取狀態

SPI_RW(值);/ /寫一個位元組

CSN = 1 ;/ /

返回狀態;/ /返回狀態
>}

/ * SPI讀位元組* /

,UCHAR章第:UCHAR SPI_R_byte()

{

UCHAR reg_value

CSN = 0 ;/ / SPI片選

SPI_RW(REG);/ /寫解決,

reg_value = SPI_RW(0);/ /讀取寄存器值

CSN = 1;

返回reg_value ;/ /返回值

讀取}

/ * SPI讀取RXFIFO寄存器數據* /

/ * REG:寄存器地址* /

/ * Dat_Buffer:用來保持讀取數據* / / *,DLEN:數據長度* /

:UCHAR SPI_R_DBuffer(UCHAR REG,UCHAR * Dat_Buffer中,UCHAR DLEN),

UCHAR狀態,我

CSN = 0 ;/ / SPI片選

= SPI_RW(REG);/ /寫狀態寄存器地址,狀態

就(i = 0; <DLEN,我+ +) { Dat_Buffer [I] = SPI_RW(0);/ /存儲數據

}

CSN = 1;

返回狀態;

}

/ * SPI寫入TXFIFO寄存器數據* /

/ * REG:寫寄存器地址* /

/ * TX_Dat_Buffer:存儲要發送的數據* /

/ *,DLEN:數據長度* /

UCHAR SPI_W_DBuffer(UCHAR注冊UCHAR * TX_Dat_Buffer,UCHAR DLEN)

{

UCHAR狀態,我

CSN = 0 ;/ / SPI片選,開始計時

狀態= SPI_RW(REG);

(I = 0; <DLEN,I + +)

{

SPI_RW的(TX_Dat_Buffer [I]) ;/ /發送數據

}

CSN = 1;

返回狀態;

}

/ *設置發送模式* /

無效nRF24L01_Set_TX_Mode的(UCHAR * TX_DATA),

{

CE = 0 ;/ /待機(寫寄存器之前一定要進入待機模式或掉電模式)

SPI_W_DBuffer(W_REGISTER + TX_ADDR TX_ADDR TX_ADDR_WITDH);/ *寫寄存器指令+接收節點地址+地址寬度* / SPI_W_DBuffer(W_REGISTER中+ RX_ADDR_P0 TX_ADDR,TX_ADDR_WITDH);/ *為了接收信號的設備的答案,一樣的接收通道0地址和發送地址* /

SPI_W_DBuffer(W_TX_PLOAD TX_Data的TX_DATA_WITDH);/ *寫有效數據地址+有效數據+有效的數據寬度* /

SPI_W_Reg(W_REGISTER + EN_AA 0X01的) ;/ *接收通道0的自動應答* /

SPI_W_Reg(W_REGISTER + EN_RX_ADDR,0X01);/ *使能接收通道0 * /

SPI_W_Reg(0X0A W_REGISTER + SETUP_RETR)的;/ *自動重發,延緩美國250US +86轉播10 * /

SPI_W_Reg(W_REGISTER + RF_CH,0);/ *(2400 +40)MHZ選擇RF通道0X40 * /

SPI_W_Reg(W_REGISTER + RF_SETUP 0X07) ;/ * 1Mbps的速率,發射功率:0 dBm時,低雜訊放大器增益* /

SPI_W_Reg(W_REGISTER + CONFIG 0x0E的);/ *發送模式,上電,16位CRC,CRC可以* /

CE = 1 ;/ /開始發射

_delay_ms(5);/ * CE高水平持續時間起碼10US * /

}

UCHAR的Check_Rec的(無效)

UCHAR狀態;

STA = SPI_R_byte(R_REGISTER,STATUS);

如果(RX_DR)

CE = 0; BR /> SPI_R_DBuffer(R_RX_PLOAD RX_BUFFER,RX_DATA_WITDH)的;

狀態= 1;

}

SPI_W_Reg(W_REGISTER +狀態,255);返回狀態

}

/ *檢測應答信號* /

:UCHAR Check_Ack(無效)

{

STA = SPI_R_byte(R_REGISTER +狀態);/ *讀取存儲* / (TX_DS | | MAX_RT)/ *如果TX_DS或MAX_RT 1,清除中斷和清晰的TX_FIFO寄存器的值* /

{ SPI_W_Reg(W_REGISTER +狀態,0XFF);

CSN = 0;

SPI_RW(FLUSH_TX);/ *如果沒有人只能一次數據,我們應該注意* /

CSN = 1;

返回0;

}

其他

返回1;

}

無效的主要(無效)

UCHAR I;

P0 = P1 = 0xff的0xff的; / /初始化IO埠

P2 = 0XFF;

P3的= 0XFF;

_delay_us(100);

nRF24L01_Init();/ /每個人的初始化,而(1)

{

(主要== 0)

{/> _delay_ms(10); />如果(按鍵== 0)

{

(I = 0; <TX_DATA_WITDH; + +)/ /發送數據

{

nRF24L01_Set_TX_Mode(TX_BUFFER [I]);/ /發送數據

(Check_Ack,());/ /等待發送完成

/ / LED =LED;

}

}

} }

}

/ ------------------------------------- ---------接收程序--------------------------------------- ----- /

#包括

#包括有

#定義UINT無符號整型

#定義UCHAR無符號字元型 #定義TX_ADDR_WITDH 5 / /寬度設置發送地址位元組

#定義RX_ADDR_WITDH 5

#定義TX_DATA_WITDH 5 8

#定義RX_DATA_WITDH 8 <BR / / ***** ****************************************** ******* ************

/ / nRF24L01的指令格式如下:

************************ ******************************************* /

#定義R_REGISTER 0X00 / /讀取寄存器

#定義W_REGISTER 0X20 / /寫寄存器

#定義R_RX_PLOAD 0x61 / / RX FIFO讀取數據1-32位元組,完整讀取數據時,數據將被清除,適用於接收

#模式定義W_TX_PLOAD 0XA0 / /寫TX FIFO有效數據1-32位元組,用於在發送模式

#定義FLUSH_TX 0XE1 / /清除TX FIFO寄存器0位元組開始寫操作,發送模式

#定義FLUSH_RX 0XE2 / /清除RX FIFO寄存器,用於在接收模式

#定義REUSE_TX_PL 0XE3 / /重新使用上一包有效數據當CE為高,包被不斷重新啟動

#定義NOP 0xFF的/ /空操作,可以用來讀取狀態寄存器

/ ****************** ************************************************ / / nRF24L01的寄存器地址

********* ******** /

#定義的CONFIG 0X00 / /配置寄存器

ID:定義EN_AA $ 0X01 / /「自動接聽」功能注冊

#定義EN_RX_ADDR 0X02 / /接收通道使能寄存器

#定義SETUP_AW 0X03 / /地址寬度設置注冊

#定義SETUP_RETR 0x04的/ /自動重發設置寄存器

#定義0X05 RF_CH的/ / RF信道頻率設置寄存器

#定義RF_SETUP 0X06 / / RF設置寄存器

#定義狀態的0X07 / /狀態寄存器<BR /#定義OBSERVE_TX 0X08 / /發送測試寄存器

#定義CD 0X09 / /載波檢測寄存器

#定義RX_ADDR_P0 0X0A / /數據的通道0接收地址寄存器

#定義RX_ADDR_P1 0X0B / /數據信道接收地址注冊

#定義RX_ADDR_P2 0X0C / /數據通道2接收地址寄存器

#定義RX_ADDR_P3 0X0D / /數據通道3接收地址寄存器

#定義RX_ADDR_P4 0X0E / /數據通道4接收地址寄存器

#定義RX_ADDR_P5 0X0F / /數據信道接收地址寄存器

#定義TX_ADDR為0x10,/ /發送地址寄存器

#定義和RX_PW_P0 0x11 / /數據通道0有效數據寬度設置寄存器

#定義RX_PW_P1 0X12 / /數據通道1有效數據寬度設置寄存器

#定義RX_PW_P2 0X13 / /數據通道的有效數據寬度設置寄存器

#定義RX_PW_P3 0X14 / /數據通道3有效數據寬度設置寄存器

#定義RX_PW_P4 0X15 / /數據通道4有效數據寬度設置寄存器

#定義RX_PW_P5 0X16 / /數據通道5數據寬度設置寄存器

#定義0X17 FIFO_STATUS / / FIFO狀態寄存器/> / / ********************************************** ***********************************

UCHAR STA / /狀態變數
> - #定義RX_DR的(STA 0X40)/ /成功接收中斷標志

#定義引起TX_DS(STA地址0x20)/ /成功發射中斷標志

#定義MAX_RT的(STA 0X10 )/ /重傳溢出中斷標志

SBIT CE = P2 ^ 0;

SBIT IRQ = P2 ^ 5;

SBIT CSN = P2 ^ 1; SBIT MOSI = P2 ^ 3;

SBIT MISO = P2 ^ 4;

SBIT SCK = P2 ^ 2;

SBIT LED = P3 ^ 2;

UCHAR代碼TX_ADDR [ ] = {0X34,0x43,0X10,0X10,0X01};

代碼TX_BUFFER UCHAR [] = {0XFE,會將0xfd,0xFB的,0XF7,0xef,0xDF的,為0xBF,0x7f的};

UCHAR RX_BUFFER [RX_DATA_WITDH

無效_delay_us(UINT)

{

UINT I,J;

(J = 0; <X; J + +)

( I = 0; <12; + +);

}

無效_delay_ms(UINT)

{

UINT I,J;

(J = 0 J <X; J + +)

(i = 0; <120; i + +);

}

無效nRF24L01_Init請(無效)

{ _delay_us(2000);

CE = 0;

CSN = 1;

SCK = 0;

IRQ = 1;

}

UCHAR SPI_RW (UCHAR位元組)

{

UCHAR I;

就(i = 0; <8; + +)

(位元組0x80的) BR /> MOSI = 1;

其他有

MOSI = 0;

位元組<< = 1;

SCK = 1;

(MISO)如果

位元組| = 0X01;

SCK = 0;

}

返回位元組;

}

:UCHAR SPI_W_Reg(UCHAR章第UCHAR值)

{ UCHAR狀態;

CSN = 0;

狀態= SPI_RW(REG);

SPI_RW(值);

CSN = 1;

返回狀態; />}

:UCHAR SPI_R_byte(UCHAR REG)

{

UCHAR狀態;

CSN = 0;

:SPI_RW(REG);

狀態= SPI_RW( 0);

CSN = 1;

返回狀態;

}

:UCHAR SPI_R_DBuffer(UCHAR REG,UCHAR * Dat_Buffer中,UCHAR DLEN),

{

UCHAR reg_value,I;

CSN = 0;

reg_value SPI_RW(REG);

就(i = 0; <DLEN; + +)

{

Dat_Buffer [] = SPI_RW(0);

}

CSN = 1;

返回reg_value,;

}

:UCHAR SPI_W_DBuffer(UCHAR章第UCHAR * TX_Dat_Buffer UCHAR DLEN)

{

的UCHAR reg_value我的 CSN = 0; reg_value = SPI_RW

就(i = 0; DLEN;我+ +){

SPI_RW(TX_Dat_Buffer [I]);

}

CSN = 1;

返回reg_value,;

}

無效nRF24L01_Set_RX_Mode(無效)

{

CE = 0 ;/ /待機

SPI_W_DBuffer(W_REGISTER + TX_ADDR,TX_ADDR,TX_ADDR_WITDH);

SPI_W_DBuffer(W_REGISTER + RX_ADDR_P0,TX_ADDR TX_ADDR_WITDH);的的ack



SPI_W_Reg(W_REGISTER + EN_AA,0X01);/ / auot SPI_W_Reg(W_REGISTER + EN_RX_ADDR,0X01);,

SPI_W_Reg(W_REGISTER + SETUP_RETR 0X0A);

SPI_W_Reg(W_REGISTER + RX_PW_P0 RX_DATA_WITDH);

SPI_W_Reg(W_REGISTER + RF_CH,0);

SPI_W_Reg(W_REGISTER + RF_SETUP,為0x07);/ /0分貝的LNA

SPI_W_Reg(W_REGISTER + CONFIG,0X0F);

CE = 1;

_delay_ms(5);

}

:UCHAR nRF24L01_RX_Data(無效)

{

/ / UCHAR,狀態;
> STA = SPI_R_byte(R_REGISTER +狀態);

如果(RX_DR) {

CE = 0;

SPI_R_DBuffer(R_RX_PLOAD,RX_BUFFER,RX_DATA_WITDH);

/ / P3 = RX_BUFFER [0];

SPI_W_Reg(W_REGISTER +狀態,255);

CSN = 0;

SPI_RW(FLUSH_RX);

CSN = 1;

返回1

}

其他

返回0;

}

{ UCHAR I;

P0 = 0xff的;

P1 = 0xff的;

P2 = 0xff的;

P3 = 0xff的; /> _delay_us(1000); /> nRF24L01_Init();

(而1)

{

nRF24L01_Set_RX_Mode();

_delay_ms(100);

(nRF24L01_RX_Data())

{

LED = 0;
> / / Delay_ms用來(300);

}

其他 LED = 1;

}

}

我希望對你有所幫助,謝謝!

㈤ 求一個nrf24l01模塊簡易收發程序,越簡單越好,只傳輸一個數就可以了,單向傳輸 懇求

#include <reg51.h>
#include <intrins.h>
#include "api.h"
/*
*This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTYT;
*
*uart:9600BPS
*
*/
/***************************************************/
#define uchar unsigned char
#define TX_ADR_WIDTH 5 // 5 bytes TX(RX) address width
#define TX_PLOAD_WIDTH 20 // 20 bytes TX payload
uchar const TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; // Define a static TX address
uchar rx_buf[TX_PLOAD_WIDTH];
uchar tx_buf[TX_PLOAD_WIDTH];
uchar flag;
uchar rx_com_buffer[10];
uchar tx_com_buffer[10];
uchar i;
uchar accept_flag;
/**************************************************/
sbit CE = P1^6;
sbit CSN= P1^7;
sbit SCK= P1^4;
sbit MOSI= P1^5;
sbit MISO= P1^3;
sbit IRQ = P1^2;
sbit LED1= P3^7;
/**************************************************/
uchar bdata sta;
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
/**************************************************/

/**************************************************
Function: init_io();
Description:
flash led one time,chip enable(ready to TX or RX Mode),
Spi disable,Spi clock line init high
/**************************************************/
#define KEY 0xaa
void init_io(void)
{
CE=0; // chip enable
CSN=1; // Spi disable
SCK=0; // Spi clock line init high
}
/**************************************************/

/**************************************************
Function: Inituart();

Description:
set uart working mode
/**************************************************/
void Inituart(void)
{

SM0=0; //設置串列口工作方式為方式1。SM0=0,SM1=0為工作方式0.依次類推
SM1=1;
REN=1; //串列口接收允許。REN=0時,禁止接收。
TMOD=0x20; //定時器1工作方式2.
TH1=0xfd; //相應波特率設初值計算方法。 初值X=(256-11059200/(12*32*9600))
TL1=0xfd; //9600為你要設置的波特率。11059200為晶振頻率。X的值最後要換算成16進制
TR1=1; //定時器T1開始工作,TR1=0,T1停止工作
}
/**************************************************/

/**************************************************
Function: init_int0();

Description:
enable int0 interrupt;
/**************************************************/
void init_int0(void)
{
EA=1;
EX0=1; // Enable int0 interrupt.
}
void delay_ms(unsigned int x)
{
unsigned int i,j;
i=0;
for(i=0;i<x;i++)
{
j=108;
while(j--);
}
}
/**************************************************/

/**************************************************
Function: SPI_RW();

Description:
Writes one byte to nRF24L01, and return the byte read
from nRF24L01 ring write, according to SPI protocol
/**************************************************/
uchar SPI_RW(uchar byte)
{
uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
{
MOSI = (byte & 0x80); // output 'byte', MSB to MOSI
byte = (byte << 1); // shift next bit into MSB..
SCK = 1; // Set SCK high..
byte |= MISO; // capture current MISO bit
SCK = 0; // ..then set SCK low again
}
return(byte); // return read byte
}
/**************************************************/

/**************************************************
Function: SPI_RW_Reg();

Description:
Writes value 'value' to register 'reg'
/**************************************************/
uchar SPI_RW_Reg(BYTE reg, BYTE value)
{
uchar status;
CSN = 0; // CSN low, init SPI transaction
status = SPI_RW(reg); // select register
SPI_RW(value); // ..and write value to it..
CSN = 1; // CSN high again
return(status); // return nRF24L01 status byte
}
/**************************************************/

/**************************************************
Function: SPI_Read();

Description:
Read one byte from nRF24L01 register, 'reg'
/**************************************************/
BYTE SPI_Read(BYTE reg)
{
BYTE reg_val;

CSN = 0; // CSN low, initialize SPI communication...
SPI_RW(reg); // Select register to read from..
reg_val = SPI_RW(0); // ..then read registervalue
CSN = 1; // CSN high, terminate SPI communication

return(reg_val); // return register value
}
/**************************************************/

/**************************************************
Function: SPI_Read_Buf();

Description:
Reads 'bytes' #of bytes from register 'reg'
Typically used to read RX payload, Rx/Tx address
/**************************************************/
uchar SPI_Read_Buf(BYTE reg, BYTE *pBuf, BYTE bytes)
{
uchar status,byte_ctr;

CSN = 0; // Set CSN low, init SPI tranaction
status = SPI_RW(reg); // Select register to write to and read status byte

for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
pBuf[byte_ctr] = SPI_RW(0); // Perform SPI_RW to read byte from nRF24L01

CSN = 1; // Set CSN high again

return(status); // return nRF24L01 status byte
}
/**************************************************/

/**************************************************
Function: SPI_Write_Buf();

Description:
Writes contents of buffer '*pBuf' to nRF24L01
Typically used to write TX payload, Rx/Tx address
/**************************************************/
uchar SPI_Write_Buf(BYTE reg, BYTE *pBuf, BYTE bytes)
{
uchar status,byte_ctr;

CSN = 0; // Set CSN low, init SPI tranaction
status = SPI_RW(reg); // Select register to write to and read status byte
for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // then write all byte in buffer(*pBuf)
SPI_RW(*pBuf++);
CSN = 1; // Set CSN high again
return(status); // return nRF24L01 status byte
}
/**************************************************/

/**************************************************
Function: RX_Mode();

Description:
This function initializes one nRF24L01 device to
RX Mode, set RX address, writes RX payload width,
select RF channel, datarate & LNA HCURR.
After init, CE is toggled high, which means that
this device is now ready to receive a datapacket.
/**************************************************/
void RX_Mode(void)
{
CE=0;
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // Use the same address on the RX device as the TX device

SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // Enable Auto.Ack:Pipe0
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // Enable Pipe0
SPI_RW_Reg(WRITE_REG + RF_CH, 40); // Select RF channel 40
SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // Select same RX payload width as TX Payload width
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // Set PWR_UP bit, enable CRC(2 bytes) & Prim:RX. RX_DR enabled..

CE = 1; // Set CE pin high to enable RX device

// This device is now ready to receive one packet of 16 bytes payload from a TX device sending to address
// '3443101001', with auto acknowledgment, retransmit count of 10, RF channel 40 and datarate = 2Mbps.

}
/**************************************************/

/**************************************************
Function: TX_Mode();

Description:
This function initializes one nRF24L01 device to
TX mode, set TX address, set RX address for auto.ack,
fill TX payload, select RF channel, datarate & TX pwr.
PWR_UP is set, CRC(2 bytes) is enabled, & PRIM:TX.

ToDo: One high pulse(>10us) on CE will now send this
packet and expext an acknowledgment from the RX device.
/**************************************************/
void TX_Mode(void)
{
CE=0;

SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // Writes TX_Address to nRF24L01
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // Writes data to TX payload

SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // Enable Auto.Ack:Pipe0
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // Enable Pipe0
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans...
SPI_RW_Reg(WRITE_REG + RF_CH, 40); // Select RF channel 40
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // Set PWR_UP bit, enable CRC(2 bytes) & Prim:TX. MAX_RT & TX_DS enabled..
CE=1;

}
/**************************************************/

/**************************************************
Function: check_ACK();

Description:
check if have "Data sent TX FIFO interrupt",if TX_DS=1,
all led light and after delay 100ms all led close
/**************************************************
void check_ACK()
{
uchar test;
test=SPI_Read(READ_REG+STATUS); // read register STATUS's
test=test&0x20; // check if have Data sent TX FIFO interrupt (TX_DS=1)
if(test==0x20) // TX_DS =1
{
P0=0x00; // turn on all led
delay100(); // delay 100ms
P0=0xff;
}
}
/**************************************************/

/**************************************************
Function: TxData();

Description:
write data x to SBUF
/**************************************************/
void TxData_com(void)
{
for(i=0;i<10;i++)
{
SBUF=tx_com_buffer[i]; // write data x to SBUF
while(TI==0);
TI=0;
}
accept_flag=0;
}

void TxData (uchar x)
{
SBUF=x; // write data x to SBUF
while(TI==0);
TI=0;
}

void RxData(void)
{
if(RI) // 是否有數據到來
{
RI = 0;
rx_com_buffer[i] = SBUF; // 暫存接收到的數據
i++;
if(i>10)
{
accept_flag=1;
i=0;
}
}
}
/**************************************************/

/**************************************************
Function: CheckButtons();

Description:
check buttons ,if have press,read the key values,
turn on led and transmit it; after transmition,
if received ACK, clear TX_DS interrupt and enter RX Mode;
turn off the led
/**************************************************/
/*void CheckButtons()
{
uchar Temp,xx,Tempi;
P0=0xff;
Temp=P0&KEY; //read key value from port P0
if (Temp!=KEY)
{
delay_ms(10);
Temp=P0&KEY; // read key value from port P0
if (Temp!=KEY)
{
xx=Temp;
Tempi=Temp>>1; // Left shift 4 bits
P0=Tempi; // Turn On the led
tx_buf[0]=Tempi; // Save to tx_buf[0]
TX_Mode(); // set TX Mode and transmitting
TxData(xx); // send data to uart
//check_ACK(); // if have acknowledgment from RX device,turn on all led
SPI_RW_Reg(WRITE_REG+STATUS,SPI_Read(READ_REG+STATUS)); // clear interrupt flag(TX_DS)
delay_ms(500);
P0=0xff; // Turn off the led
RX_Mode(); // set receive mode

while((P0&KEY)!=KEY);
}
}
} */
/**************************************************/

/**************************************************
Function: main();

Description:
control all subprogrammes;
/**************************************************/
void main(void)
{
uchar ia;
init_io(); // Initialize IO port
LED1=1;
Inituart(); // initialize 232 uart
RX_Mode(); // set RX mode
while(1)
{
RxData();
if(accept_flag==1)
{
LED1=0 ;
accept_flag=0;
for(ia=0;ia<5;ia++)
{
tx_buf[ia]=tx_com_buffer[ia];
}
TX_Mode();
SPI_RW_Reg(WRITE_REG+STATUS,SPI_Read(READ_REG+STATUS)); // clear interrupt flag(TX_DS)
delay_ms(100);
LED1=1;
RX_Mode();
}
if(!IRQ)
{
sta=SPI_Read(STATUS); // read register STATUS's value
if(RX_DR) // if receive data ready (RX_DR) interrupt
{
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer;
for(ia=0;ia<5;ia++)
{
tx_com_buffer[ia]=rx_buf[ia];
}
LED1=0;
flag=0; // set flag=0
TxData_com();
LED1=1;
}
if(MAX_RT)
{
SPI_RW_Reg(FLUSH_TX,0);
}
SPI_RW_Reg(WRITE_REG+STATUS,0xff);// clear RX_DR or TX_DS or MAX_RT interrupt flag
IRQ=1;
RX_Mode();
}
}
}

㈥ NRF24L01模塊發射---接收51單片機程序

#include <reg52.h>
#include <intrins.h>

typedef unsigned char uchar;
typedef unsigned char uint;
//****************************************IO埠定義***************************************
sbit MISO =P1^4;
sbit MOSI =P1^3;// P3.2
sbit SCK =P1^2;
sbit CE =P1^0;
sbit CSN =P1^1;
sbit IRQ =P1^5;
//***********************************數碼管0-9編碼*******************************************
uchar seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~~9段碼
uchar TxBuf[32]=
{
0x01,0x02,0x03,0x4,0x05,0x06,0x07,0x08,
0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,
0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,
0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,
}; //
//************************************按鍵**********************************************
sbit KEY1=P3^6;
sbit KEY2=P3^7;
//***********************************數碼管位選**************************************************
sbit led1=P2^1;
sbit led0=P2^0;
sbit led2=P2^2;
sbit led3=P2^3;
//*********************************************NRF24L01*************************************
#define TX_ADR_WIDTH 5 // 5 uints TX address width
#define RX_ADR_WIDTH 5 // 5 uints RX address width
#define TX_PLOAD_WIDTH 32 // 20 uints TX payload
#define RX_PLOAD_WIDTH 32 // 20 uints TX payload
uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址
uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址
//***************************************NRF24L01寄存器指令*******************************************************
#define READ_REG 0x00 // 讀寄存器指令
#define WRITE_REG 0x20 // 寫寄存器指令
#define RD_RX_PLOAD 0x61 // 讀取接收數據指令
#define WR_TX_PLOAD 0xA0 // 寫待發數據指令
#define FLUSH_TX 0xE1 // 沖洗發送 FIFO指令
#define FLUSH_RX 0xE2 // 沖洗接收 FIFO指令
#define REUSE_TX_PL 0xE3 // 定義重復裝載數據指令
#define NOP 0xFF // 保留
//*************************************SPI(nRF24L01)寄存器地址****************************************************
#define CONFIG 0x00 // 配置收發狀態,CRC校驗模式以及收發狀態響應方式
#define EN_AA 0x01 // 自動應答功能設置
#define EN_RXADDR 0x02 // 可用信道設置
#define SETUP_AW 0x03 // 收發地址寬度設置
#define SETUP_RETR 0x04 // 自動重發功能設置
#define RF_CH 0x05 // 工作頻率設置
#define RF_SETUP 0x06 // 發射速率、功耗功能設置
#define STATUS 0x07 // 狀態寄存器
#define OBSERVE_TX 0x08 // 發送監測功能
#define CD 0x09 // 地址檢測
#define RX_ADDR_P0 0x0A // 頻道0接收數據地址
#define RX_ADDR_P1 0x0B // 頻道1接收數據地址
#define RX_ADDR_P2 0x0C // 頻道2接收數據地址
#define RX_ADDR_P3 0x0D // 頻道3接收數據地址
#define RX_ADDR_P4 0x0E // 頻道4接收數據地址
#define RX_ADDR_P5 0x0F // 頻道5接收數據地址
#define TX_ADDR 0x10 // 發送地址寄存器
#define RX_PW_P0 0x11 // 接收頻道0接收數據長度
#define RX_PW_P1 0x12 // 接收頻道1接收數據長度
#define RX_PW_P2 0x13 // 接收頻道2接收數據長度
#define RX_PW_P3 0x14 // 接收頻道3接收數據長度
#define RX_PW_P4 0x15 // 接收頻道4接收數據長度
#define RX_PW_P5 0x16 // 接收頻道5接收數據長度
#define FIFO_STATUS 0x17 // FIFO棧入棧出狀態寄存器設置
//**************************************************************************************
void Delay(unsigned int s);
void inerDelay_us(unsigned char n);
void init_NRF24L01(void);
uint SPI_RW(uint uchar);
uchar SPI_Read(uchar reg);
void SetRX_Mode(void);
uint SPI_RW_Reg(uchar reg, uchar value);
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
void nRF24L01_TxPacket(unsigned char * tx_buf);
//*****************************************長延時*****************************************
void Delay(unsigned int s)
{
unsigned int i;
for(i=0; i<s; i++);
for(i=0; i<s; i++);
}
//******************************************************************************************
uint bdata sta; //狀態標志
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
/******************************************************************************************
/*延時函數
/******************************************************************************************/
void inerDelay_us(unsigned char n)
{
for(;n>0;n--)
_nop_();
}
//****************************************************************************************
/*NRF24L01初始化
//***************************************************************************************/
void init_NRF24L01(void)
{
inerDelay_us(100);
CE=0; // chip enable 晶元啟動
CSN=1; // Spi disable 禁用spi
SCK=0; // Spi clock line init high
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 寫本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 寫接收端地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 頻道0自動 ACK應答允許
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允許接收地址只有頻道0,如果需要多頻道可以參考Page21
SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 設置信道工作為2.4GHZ,收發必須一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //設置接收數據長度,本次設置為32位元組
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //設置發射速率為1MHZ,發射功率為最大值0dB
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收發完成中斷響應,16位CRC,主發送

}
/*************************************************+3***************************************************
/*函數:uint SPI_RW(uint uchar)
/*功能:NRF24L01的SPI寫時序
/****************************************************************************************************/
uint SPI_RW(uint uchar)
{
uint bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
{
MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI
uchar = (uchar << 1); // shift next bit into MSB..
SCK = 1; // Set SCK high..
uchar |= MISO; // capture current MISO bit
SCK = 0; // ..then set SCK low again
}
return(uchar); // return read uchar
}
/****************************************************************************************************
/*函數:uchar SPI_Read(uchar reg)
/*功能:NRF24L01的SPI時序
/****************************************************************************************************/
uchar SPI_Read(uchar reg)
{
uchar reg_val;

CSN = 0; // CSN low, initialize SPI communication...
SPI_RW(reg); // Select register to read from..
reg_val = SPI_RW(0); // ..then read registervalue
CSN = 1; // CSN high, terminate SPI communication

return(reg_val); // return register value
}
/****************************************************************************************************/
/*功能:NRF24L01讀寫寄存器函數
/****************************************************************************************************/
uint SPI_RW_Reg(uchar reg, uchar value)
{
uint status;

CSN = 0; // CSN low, init SPI transaction
status = SPI_RW(reg); // select register
SPI_RW(value); // ..and write value to it..
CSN = 1; // CSN high again

return(status); // return nRF24L01 status uchar
}
/****************************************************************************************************/
/*函數:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用於讀數據,reg:為寄存器地址,pBuf:為待讀出數據地址,uchars:讀出數據的個數
/****************************************************************************************************/
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;

CSN = 0; // Set CSN low, init SPI tranaction
status = SPI_RW(reg); // Select register to write to and read status uchar

for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
pBuf[uchar_ctr] = SPI_RW(0); //

CSN = 1;

return(status); // return nRF24L01 status uchar
}
/*********************************************************************************************************
/*函數:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用於寫數據:為寄存器地址,pBuf:為待寫入數據地址,uchars:寫入數據的個數
/*********************************************************************************************************/
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;

CSN = 0; //SPI使能
status = SPI_RW(reg);
for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
SPI_RW(*pBuf++);
CSN = 1; //關閉SPI
return(status); //
}
/****************************************************************************************************/
/*函數:void SetRX_Mode(void)
/*功能:數據接收配置
/****************************************************************************************************/
void SetRX_Mode(void)
{
CE=0;
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收發完成中斷響應,16位CRC ,主接收
CE = 1;
inerDelay_us(130);
}
/******************************************************************************************************/
/*函數:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
/*功能:數據讀取後放如rx_buf接收緩沖區中
/******************************************************************************************************/
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{
unsigned char revale=0;
sta=SPI_Read(STATUS); // 讀取狀態寄存其來判斷數據接收狀況
if(RX_DR) // 判斷是否接收到數據
{
CE = 0; //SPI使能
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
revale =1; //讀取數據完成標志
}
SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到數據後RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清楚中斷標志
return revale;
}
/***********************************************************************************************************
/*函數:void nRF24L01_TxPacket(unsigned char * tx_buf)
/*功能:發送 tx_buf中數據
/**********************************************************************************************************/
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
CE=0; //StandBy I模式
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 裝載接收端地址
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 裝載數據
// SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收發完成中斷響應,16位CRC,主發送
CE=1; //置高CE,激發數據發送
inerDelay_us(10);
}
//************************************主函數************************************************************
void main(void)
{
uchar temp =0;
init_NRF24L01() ;
led0=0;
led1=0;
led2=0;
led3=0;
P0=0x00;
nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data
Delay(6000);
P0=0xBF;
while(1)
{
if(temp<4)
{
switch(temp)
{
case 1:
P0= 0xBF;
break;
case 2:
P0= 0xf7;

break;
case 3:
P0= 0xFE;

break;
default: break;
}
}
if(temp==3)
{
temp=0;
}
nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data
Delay(20000);
SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
temp++;
}

}

㈦ 求大神講解一下寫NRF24L01無線模塊程序的具體步驟,

一般驅動這抄個模塊的話,程序一般包括模塊的初始化,主控io口初始化,因為他是spi通信協議的,所以還要有spi協議的函數,這個可以通過io口模擬時序,這個部分怎麼寫得看你用什麼做中控了,然後就是發送函數,接收函數。這個程序我調了好久,有問題再問吧。

閱讀全文

與nrf24l01寫程序相關的資料

熱點內容
輕顏相機在手機里的哪個文件夾 瀏覽:547
王者什麼時候版本更新 瀏覽:123
win10桌面圖標太小亂跑 瀏覽:73
寫公文時保密數據如何反映 瀏覽:767
arch設置ip配置文件 瀏覽:641
燒杯APP中的氣體和液體在哪裡 瀏覽:3
找同行工作在哪個網站 瀏覽:254
linuxdirfd 瀏覽:290
電腦列印一張文件多少錢 瀏覽:212
斗戰神遊戲修復工具 瀏覽:736
系統更新網路無法鏈接不上電腦沒反應 瀏覽:851
什麼是二層網路架構 瀏覽:402
中醫看書好的app 瀏覽:516
win10紙牌變成英文 瀏覽:135
源碼文件圖片路徑怎麼形成的 瀏覽:432
ai變數寬度配置文件點不了 瀏覽:460
強制安裝app去哪裡舉報 瀏覽:719
微信登錄數據保存在哪裡 瀏覽:321
pic編程哪裡下載 瀏覽:549
蘋果ipad官方壁紙 瀏覽:154

友情鏈接