nRF24L01无线 使用

本文介绍了nRF24L01无线模块的实际应用,测试距离约为20米,探讨了功率放大对传输距离的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、这东西实测大概也就20米,可能功率放大点会更远点,可是估计差不了多少。

#include <MC9S12XS128.h>
#include "nRF_define.h"
#include "nRF_api.h"

#define uchar unsigned char
#define uint unsigned int

byte const TX_ADDRESS[TX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};	//本地地址

byte SPI_Read(byte reg);
byte SPI_RW_Reg(byte reg, byte value);
byte SPI_Read_Buf(byte reg, byte *pBuf, byte uchars);
byte SPI_Write_Buf(byte reg, byte *pBuf, byte uchars); 

//================ 延时 ======================//
void Delay(uchar t)
{    
    uchar i;
    for(i=0;i<t;i++);
    
    //t = 1 约延时0.5us
    //t = 110 约延时10us
    //t = 160 约延时15us
}

//================================================== SPI基本函数 =========================================================//

/***************************************************************************************************
函数:byte SPI_RW(byte ch)
功能:NRF24L01的SPI写时序
***************************************************************************************************/
byte SPI_RW(byte ch)
{
    byte bit_ctr;
    
    for(bit_ctr = 0; bit_ctr < 8; bit_ctr++) // output 8-bit
    {
        if(ch & 0x80) // output 'byte', MSB to NRFMOSI
            NRFMOSI = 1;
        else
            NRFMOSI = 0;
        ch = (ch << 1);                 // shift next bit into MSB..
        NRFSCK = 1;                     // Set NRFSCK high..
        ch |= NRFMISO;       		        // capture current NRFMISO bit
        NRFSCK = 0;            		      // ..then set NRFSCK low again
    }
    
    return(ch);           		          // return read byte
}

/****************************************************************************************************
*函数:byte SPI_Read(byte reg)
*功能:NRF24L01的SPI时序
****************************************************************************************************/
byte SPI_Read(byte reg)
{
    byte reg_val;
    
    NRFCSN = 0;  	            // NRFCSN low, initialize SPI communication...
    SPI_RW(reg);              // Select register to read from..
    reg_val = SPI_RW(0);      // ..then read registervalue
    NRFCSN = 1;               // NRFCSN high, terminate SPI communication
    
    return(reg_val);          // return register value
}

/***************************************************************************************************
*功能:NRF24L01读写寄存器函数
***************************************************************************************************/
byte SPI_RW_Reg(byte reg, byte value)
{
    byte status;
    
    NRFCSN = 0;                // NRFCSN low, init SPI transaction
    status = SPI_RW(reg);      // select register
    SPI_RW(value);             // ..and write value to it..
    NRFCSN = 1;                // NRFCSN high again
    
    return(status);            // return nRF24L01 status byte
}

/****************************************************************************************************
*函数:byte SPI_Read_Buf(byte reg, byte *pBuf, byte len)
*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,len:读出数据的个数
****************************************************************************************************/
byte SPI_Read_Buf(byte reg, byte *pBuf, byte len)
{
    byte status, cnt;

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

    for(cnt = 0; cnt < len; cnt++)
        pBuf[cnt] = SPI_RW(0);    

    NRFCSN = 1;

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

/*********************************************************************************************************
*函数:byte SPI_Write_Buf(byte reg, byte *pBuf, byte len)
*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,len:写入数据的个数
*********************************************************************************************************/
byte SPI_Write_Buf(byte reg, byte *pBuf, byte len)
{
    byte status, cnt;

    NRFCSN = 0;                     //SPI使能
    status = SPI_RW(reg);
    Delay_us(160);
    for(cnt = 0; cnt < len; cnt++) 
        SPI_RW(*pBuf++);
    NRFCSN = 1;                     //关闭SPI
    
    return(status);       
}
//======================================================================================================================//

void nRF_ClrFIFO(uchar x)
{
    NRFCSN = 0;
    SPI_RW(x);
    NRFCSN = 1;
}



/****************************************************************************************************
*函数:void SetRX_Mode(void)
*功能:数据接收配置
****************************************************************************************************/
void SetRX_Mode(void)
{
    NRFCE = 0;

    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  // 接收设备接收通道0使用和发送设备相同的发送地址
    SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);               // 使能接收通道0自动应答
    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);           // 使能接收通道0
    SPI_RW_Reg(WRITE_REG + RF_CH, 40);                 // 选择射频通道0x40
    SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);  // 接收通道0选择和发送通道相同有效数据宽度
    SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);            // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
    SPI_RW_Reg(WRITE_REG + CONFIG, 0x0F);              // CRC使能,16位CRC校验,上电,接收模式
        
    NRFCE = 1;                                         // 拉高CE启动接收设备
}

/**********************************************************************************
*函数: nRF_RxPacket()
*说明: 从nRF的接收缓冲中取出RX_PLOAD_WIDTH个数据放在以rxbuf开始的连续地址中
**********************************************************************************/
uchar nRF_RxPacket (uchar *rxbuf)
{
    uchar revale = 0;
    uchar status;
    
    status = SPI_Read(STATUS);      //读取状态寄存器来判断数据接收状况
    if(RX_DR)                       //判断是否接收到数据
    {        
        SPI_Read_Buf(RD_RX_PLOAD, rxbuf, RX_PLOAD_WIDTH);    //read receive payload from RX_FIFO buffer
        revale = 1;
    }
    SPI_RW_Reg(WRITE_REG + STATUS,status);
    return revale;
}

/****************************************************************************************************
*函数:void SetTX_Mode(void)
*功能:数据发送配置
****************************************************************************************************/
void SetTX_Mode(void)
{
    NRFCE = 0;   
       
    SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);     // 写入发送地址
    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  // 为了应答接收设备,接收通道0地址和发送地址相同
    SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);       // 使能接收通道0自动应答 AUTO ACK
    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);   // 使能接收通道0 PIPE0
    SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0A);  // 自动重发延时等待250us+86us,自动重发10次
    SPI_RW_Reg(WRITE_REG + RF_CH, 40);         // 选择射频通道0x40
    SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);    // 数据传输率2Mbps,发射功率0dBm,低噪声放大器增益
    SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);  // 接收通道0选择和发送通道相同有效数据宽度
    SPI_RW_Reg(WRITE_REG + CONFIG, 0x0E);      // CRC使能,16位CRC校验,上电  

    NRFCE = 1; 
}

/************************************************************************************
*函数: nRF_TxPacket()
*说明:发送以txbuf开始的连续TX_PLOAD_WIDTH个字节的数据
************************************************************************************/

void nRF_TxPacket (uchar *txbuf)
{
    SPI_Write_Buf(WR_TX_PLOAD, txbuf, TX_PLOAD_WIDTH); // Writes data to TX payload    
    while(NRFIRQ);
    SPI_RW_Reg(WRITE_REG + STATUS, 0xFF);
    
}
void main(void)
{ 
    PLL_Init();
    IO_Init();   
    //SetTX_Mode();       //设置发送模式
    SetRX_Mode();       //设置接收模式
    EnableInterrupts;

    for(;;)
    {
         //nRF_TxPacket(TxBuf);    //发送调用
          
         if(nRF_RxPacket(RxBuf) == TRUE)   //接收调用
         {  
             LCD_CLS(); 
             LCD_Print(0,2,RxBuf);
         }
    } 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值