STM32
直播中

李敏

7年用户 1342经验值
私信 关注
[问答]

NRF24L01无线收发芯片的寄存器有哪些呢

nRF24L01芯片可以设置为哪几种主要的模式?

NRF24L01无线收发芯片的寄存器有哪些呢?

回帖(2)

李建

2021-12-16 11:09:07
2.4GHz 单片高速2Mbps 无线收发芯片 nRF24L01

nRF24L01 可以设置为以下几种主要的模式,

[tr]模式pwrUPPRIM_RXCEFIFO 寄存器状态[/tr]
接收模式111-
发送模式101数据在TX FIFO 寄存器中
发送模式101→0停留在发送模式,直至数据发送完
待机模式II101TX FIFO 为空
待机模式I1-0无数据传输
掉电模式0---
nRF24L01 在不同模式下的引脚功能

[tr]引脚名称方向发送模式接收模式待机模式掉电模式[/tr]
CE输入高电平>10us高电平低电平-
CSN输入SPI片选使能,低电平使能


SCK输入SPI时钟


MOSI输入SPI串行输入


MISO三态输出SPI 串行输出


IRQ输出中断,低电平使能


NRF24L01 寄存器

//NRF24L01寄存器操作命令
#define READ_REGISTER        0x00  //读配置寄存器,低5位为寄存器地址
#define WRITE_REGISTER       0x20  //写配置寄存器,低5位为寄存器地址
#define RD_RX_PLOAD     0x61  //读RX有效数据,1~32字节
#define WR_TX_PLOAD     0xA0  //写TX有效数据,1~32字节
#define FLUSH_TX        0xE1  //清除TX FIFO寄存器.发射模式下用
#define FLUSH_RX        0xE2  //清除RX FIFO寄存器.接收模式下用
#define REUSE_TX_PL     0xE3  //重新使用上一包数据,CE为高,数据包被不断发送.
#define NOP             0xFF  //空操作,可以用来读状态寄存器   


//SPI(NRF24L01)寄存器地址
#define CONFIG          0x00  //配置寄存器地址;bit0:1接收模式,0发射模式;bit1:电选择;bit2:CRC模式;bit3:CRC使能;
//bit4:中断MAX_RT(达到最大重发次数中断)使能;bit5:中断TX_DS使能;bit6:中断RX_DR使能
#define EN_AA           0x01  //使能自动应答功能  bit0~5,对应通道0~5
#define EN_RXADDR       0x02  //接收地址允许,bit0~5,对应通道0~5
#define SETUP_AW        0x03  //设置地址宽度(所有数据通道):bit1,0:00,3字节;01,4字节;02,5字节;
#define SETUP_RETR      0x04  //建立自动重发;bit3:0,自动重发计数器;bit7:4,自动重发延时 250*x+86us
#define RF_CH           0x05  //RF通道,bit6:0,工作通道频率;
#define RF_SETUP        0x06  //RF寄存器;bit3:传输速率(0:1Mbps,1:2Mbps);bit2:1,发射功率;bit0:低噪声放大器增益
#define STATUS          0x07  //状态寄存器;bit0:TX FIFO满标志;bit3:1,接收数据通道号(最大:6);bit4,达到最多次重发
                                //bit5:数据发送完成中断;bit6:接收数据中断;
#define MAX_TX      0x10  //达到最大发送次数中断
#define TX_OK       0x20  //TX发送完成中断
#define RX_OK       0x40  //接收到数据中断


#define OBSERVE_TX      0x08  //发送检测寄存器,bit7:4,数据包丢失计数器;bit3:0,重发计数器
#define CD              0x09  //载波检测寄存器,bit0,载波检测;
#define RX_ADDR_P0      0x0A  //数据通道0接收地址,最大长度5个字节,低字节在前
#define RX_ADDR_P1      0x0B  //数据通道1接收地址,最大长度5个字节,低字节在前
#define RX_ADDR_P2      0x0C  //数据通道2接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P3      0x0D  //数据通道3接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P4      0x0E  //数据通道4接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P5      0x0F  //数据通道5接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define TX_ADDR         0x10  //发送地址(低字节在前),ShockBurstTM模式下,RX_ADDR_P0与此地址相等
#define RX_PW_P0        0x11  //接收数据通道0有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P1        0x12  //接收数据通道1有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P2        0x13  //接收数据通道2有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P3        0x14  //接收数据通道3有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P4        0x15  //接收数据通道4有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P5        0x16  //接收数据通道5有效数据宽度(1~32字节),设置为0则非法
#define FIFO_STATUS     0x17  //FIFO状态寄存器;bit0,RX FIFO寄存器空标志;bit1,RX FIFO满标志;bit2,3,保留
                              //bit4,TX FIFO空标志;bit5,TX FIFO满标志;bit6,1,循环发送上一数据包.0,不循环;

NRF24L01



extern "C"
void EXTI4_IRQHandler();                                //设置中断函数


#define NRF24L01IRQHandle   EXTI4_IRQHandler
#define NRF24L01_IRQ_NVIC_CHANNEL EXTI4_IRQn
#define NRF24L01_IRQ_EXTI_PINSOURCE     GPIO_PinSource4
#define NRF24L01_IRQ_EXTI_LINE          EXTI_Line4
#define NRF24L01_IRQ_EXTI_GPIOSOURCE    GPIO_PortSourceGPIOC


#define NRF24L01_CSN_HIGH               GPIO_SetBits(NRF24L01_CSN_GPIO,NRF24L01_CSN_PIN)
#define NRF24L01_CSN_LOW                GPIO_ResetBits(NRF24L01_CSN_GPIO,NRF24L01_CSN_PIN)


#define NRF24L01_CE_HIGH                GPIO_SetBits(NRF24L01_CE_GPIO,NRF24L01_CE_PIN)
#define NRF24L01_CE_LOW             GPIO_ResetBits(NRF24L01_CE_GPIO,NRF24L01_CE_PIN)
//////////////////////////////////////////////////////////////////////////
#define TX_ADDR_LENGTH  5
#define RX_ADDR_LENGTH  5
#define EN_AUTO_ACK_PORT    0x01
#define EN_RXADDR_PORT      0x01
#define SETUP_RETR_VALUE        0x0a //建立自动重发;bit3:0,自动重发计数器;bit7:4,自动重发延时 250*x+86us
#define RF_CH_FREQ_VALUE        0
#define RF_SETUP_VALUE          0x0F
#define RX_PW_P0_WIDTH          32
#define TX_MODE_CONFIG          0x0E
#define RX_MODE_CONFIG          0x0F
#define TX_BUFFER_LENGTH        32
#define RX_BUFFER_LENGTH        32


#define TX_SENDED           1
#define TX_SENDING          0
class NRF24L01
{
private:
    SPI *NRF24L01Spi;
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    uint8_t TxAddressBuffer[5];                                                                     //NRF24L01发送的数据
    uint8_t RxAddressBuffer[5];                                                                     //NRF24L01接受的数据
    uint8_t NRF24L01_MODE;                                                                          //NRF24L01模式
    uint8_t NRF24L01IRQStatus;                                                                      //NRF24L01中断
    uint8_t reciveBuffer[RX_BUFFER_LENGTH];                                                         //接收的数据
public:
    NRF24L01();
    ~NRF24L01();
    void SetNRF24L01Mode(uint8_t mode);                                                             //设置模式 发送 接收
    uint8_t GetNRF24L01Mode();                                                                      //获取
    void SetNRF24L01IRQStatus(uint8_t value);                                                       //设置IRQ状态  判定中断发生后 清0
    uint8_t GetNRF24L01IRQStatus();                                                                 //获取
    void SetNRF24L01TxAddress(uint8_t *txAddressBuffer);                                            // 设置发送地址
    void SetNRF24L01RxAddress(uint8_t *rxAddressBuffer);                                            //设置接收地址


    void NRF24L01Init(SPI *spi);                                                                    //创建对应的SPI端口
    void NRF24L01ModeInit();
    uint8_t NRF24L01ReadRegister(uint8_t registerAdress);                                           //读寄存器
    uint8_t NRF24L01ReadBufferRegister(uint8_t registerAdress, uint8_t *buffer, uint8_t length);    //写寄存器指定长度数据 接收模式
    uint8_t NRF24L01WriteRegister(uint8_t registerAdress, uint8_t value);                           //写寄存器
    uint8_t NRF24L01WriteBufferRegister(uint8_t registerAdress, uint8_t *buffer, uint8_t length);   //写寄存器指定长度数据 发送模式
    uint8_t NRF24L01CheckIn();                                                                      //检测是否存在
    void NRF24L01SetTxMode();                                                                       //设置为发送模式
    void NRF24L01SetRxMode();                                                                       //设置为接受模式
    void GetReciveBuffer(uint8_t *buffer);


    uint8_t NRF24L01SendBuffer(uint8_t *sendBuffer);                                                //发送数据
    uint8_t NRF24L01ReciveBuffer();                                                                 //接受数据
    void NRF24L01IRQInit();                                                                         //中断初始化
    void NRF24L01IRQEnable();
    void NRF24L01IRQDisable();


};
功能函数



#include "SystmControl.h"
NRF24L01::NRF24L01()
{


}
//
// 函数:SetNRF24L01Mode   
// 功能:设置模式
// 返回:
// 参数: mode:0 发送 1接收
//
void NRF24L01::SetNRF24L01Mode(uint8_t mode)
{
    NRF24L01_MODE = mode;
    NRF24L01_CE_LOW;
    if (NRF24L01_MODE == NRF24L01_TX_MODE)
    {
        NRF24L01WriteRegister(WRITE_REGISTER + CONFIG, TX_MODE_CONFIG);                 //发射模式
    }
    else
    {
        NRF24L01WriteRegister(WRITE_REGISTER + CONFIG, RX_MODE_CONFIG);                 //接受模式
    }
    NRF24L01_CE_HIGH;
}
//
// 函数:GetNRF24L01Mode   
// 功能:获取模式
// 返回:
// 参数:
//
uint8_t NRF24L01::GetNRF24L01Mode()
{
    return NRF24L01_MODE;
}
//
// 函数:SetNRF24L01IRQStatus   
// 功能:设置中断状态
// 返回:
// 参数: value: 0 1
//
void NRF24L01::SetNRF24L01IRQStatus(uint8_t value)
{
    NRF24L01IRQStatus = value;
}
//
// 函数:GetNRF24L01IRQStatus   
// 功能:获取中断状态
// 返回:
// 参数:
//
uint8_t NRF24L01::GetNRF24L01IRQStatus()
{
    return NRF24L01IRQStatus;
}
//
// 函数:SetNRF24L01TxAddress   
// 功能:设置发送地址
// 返回:
// 参数: txAddressBuffer:5 BYTE 地址
//
void NRF24L01::SetNRF24L01TxAddress(uint8_t* txAddressBuffer)
{
    uint8_t i = 0;
    for (; i < 5; i++)
    {
        TxAddressBuffer = *txAddressBuffer;
        txAddressBuffer++;
    }
}


//
// 函数: SetNRF24L01RxAddress  
// 功能:设置接受地址
// 返回:
// 参数: rxAddressBuffer:5个BYTE地址
//
void NRF24L01::SetNRF24L01RxAddress(uint8_t *rxAddressBuffer)
{
    uint8_t i = 0;
    for (; i < 5; i++)
    {
        RxAddressBuffer = *rxAddressBuffer;
        rxAddressBuffer++;
    }
}


//
// 函数:   NRF24L01Init
// 功能: NRF24L01初始化
// 返回:
// 参数:
//
void NRF24L01::NRF24L01Init(SPI *spi)
{


    uint8_t txAddress[5] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };                                    //设置默认参数 发送接收地址 模式 中断状态
    uint8_t rxAddress[5] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
    SetNRF24L01TxAddress(txAddress);
    SetNRF24L01RxAddress(rxAddress);
    NRF24L01_MODE = NRF24L01_RX_MODE;
    SetNRF24L01IRQStatus(TX_SENDED);


    //CE=1  CSN 低电平使能     IRQ 低电平使能
    NRF24L01Spi = spi;


    RCC_APB2PeriphClockCmd(NRF24L01_IRQ_RCC | NRF24L01_CSN_RCC | NRF24L01_CE_RCC, ENABLE);      //使能管脚外设时钟和复用时钟
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                            //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


    GPIO_InitStructure.GPIO_Pin = NRF24L01_CSN_PIN;
    GPIO_Init(NRF24L01_CSN_GPIO, &GPIO_InitStructure);                                          //初始化CSN


    GPIO_InitStructure.GPIO_Pin = NRF24L01_CE_PIN;
    GPIO_Init(NRF24L01_CE_GPIO, &GPIO_InitStructure);                                           //初始化CE


    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                                               //IRQ浮空
    GPIO_InitStructure.GPIO_Pin = NRF24L01_IRQ_PIN;
    GPIO_Init(NRF24L01_IRQ_GPIO, &GPIO_InitStructure);                                          //初始化IRQ
    //  
    NRF24L01_CSN_HIGH;                                                                          //取消片选信号
}
举报

h1654155275.5998

2021-12-16 11:09:13
void NRF24L01::NRF24L01ModeInit()
{
    NRF24L01_CE_LOW;
    NRF24L01WriteBufferRegister(WRITE_REGISTER + TX_ADDR, TxAddressBuffer, 5);      //配置发送地址
    NRF24L01WriteBufferRegister(WRITE_REGISTER + RX_ADDR_P0, RxAddressBuffer, 5);   //配置接收地址
    NRF24L01WriteRegister(WRITE_REGISTER + EN_AA, EN_AUTO_ACK_PORT);                //设置自动应答通道
    NRF24L01WriteRegister(WRITE_REGISTER + EN_RXADDR, EN_RXADDR_PORT);              //接收地址允许通道
    NRF24L01WriteRegister(WRITE_REGISTER + SETUP_RETR, SETUP_RETR_VALUE);           //自动重发 250+86US
    NRF24L01WriteRegister(WRITE_REGISTER + RF_CH, RF_CH_FREQ_VALUE);                //通信频率
    NRF24L01WriteRegister(WRITE_REGISTER + RF_SETUP, RF_SETUP_VALUE);               //发射参数 放大增益 发射功率 无限功率
    NRF24L01WriteRegister(WRITE_REGISTER + RX_PW_P0, RX_PW_P0_WIDTH);               //通道有效数据宽度
    NRF24L01WriteRegister(WRITE_REGISTER + CONFIG, RX_MODE_CONFIG);                 //接收模式
    NRF24L01_CE_HIGH;
    SetNRF24L01Mode(NRF24L01_RX_MODE);
}


//
// 函数: NRF24L01ReadRegister  
// 功能:
// 返回: registerValue:寄存器值
// 参数: registerAdress:寄存器地址
//
uint8_t NRF24L01::NRF24L01ReadRegister(uint8_t registerAdress)
{
    uint8_t registerValue;
    NRF24L01_CSN_LOW;                                                                           //使能片选信号
    registerValue = NRF24L01Spi->SPIReadRegister(registerAdress);                               //读出数据
    NRF24L01_CSN_HIGH;                                                                          //取消片选信号
    return registerValue;
}
//
// 函数:NRF24L01ReadBufferRegister   
// 功能:
// 返回: 寄存器状态
// 参数:registerAdress:地址  buffer:读出的数据 length:长度
//
uint8_t NRF24L01::NRF24L01ReadBufferRegister(uint8_t registerAdress, uint8_t *buffer, uint8_t length)
{
    uint8_t registerStatus;
    NRF24L01_CSN_LOW;
    registerStatus = NRF24L01Spi->SPIReadBufferRegister(registerAdress, buffer, length);        //读出数据
    NRF24L01_CSN_HIGH;
    return registerStatus;
}




//
// 函数: NRF24L01WriteRegister  
// 功能:
// 返回: 寄存器状态
// 参数: registerAdress:寄存器地址 Value:寄存器值
//
uint8_t NRF24L01::NRF24L01WriteRegister(uint8_t registerAdress, uint8_t value)
{
    uint8_t registerStatus;
    NRF24L01_CSN_LOW;
    registerStatus = NRF24L01Spi->SPIWriteRegister(registerAdress, value);          //写入数据
    NRF24L01_CSN_HIGH;
    return registerStatus;
}
//
// 函数:NRF24L01WriteBufferRegister   
// 功能:
// 返回: 寄存器状态
// 参数:registerAdress:地址  buffer:写入的数据 length:长度
//
uint8_t NRF24L01::NRF24L01WriteBufferRegister(uint8_t registerAdress, uint8_t *buffer, uint8_t length)
{
    uint8_t registerStatus;
    NRF24L01_CSN_LOW;
    registerStatus = NRF24L01Spi->SPIWriteBufferRegister(registerAdress, buffer, length);       //写入数据
    NRF24L01_CSN_HIGH;
    return registerStatus;
}


//
// 函数:NRF24L01CheckIn   
// 功能:NRF24L01检测
// 返回:设备正常返回1 否则返回0
// 参数:
//
uint8_t NRF24L01::NRF24L01CheckIn()
{
    uint8_t buffer[5] = { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA };
    uint8_t checkBuffer[5] = { 0x00 };
    uint8_t i;
    NRF24L01_CSN_HIGH;
    //NRF24L01_CE_HIGH;
    NRF24L01_CE_LOW;


    NRF24L01_CSN_LOW;                                                                       //  
    NRF24L01Spi->SPIWriteBufferRegister(WRITE_REGISTER + TX_ADDR, buffer, 5);       //写入寄存器数据
    NRF24L01_CSN_HIGH;


    NRF24L01_CSN_LOW;
    NRF24L01Spi->SPIReadBufferRegister(READ_REGISTER + TX_ADDR, checkBuffer, 5);        //读出寄存器数据
    NRF24L01_CSN_HIGH;
    for (i = 0; i < 5; i++)
    {
        if (buffer != checkBuffer)
        {
            return 0;
        }
    }
    return 1;




}
//
// 函数:NRF24L01SetTxMode   
// 功能:设置为发送模式
// 返回:
// 参数:
//
void NRF24L01::NRF24L01SetTxMode()
{


}
//
// 函数:NRF24L01SetRxMode   
// 功能:设置为接收模式
// 返回:
// 参数:
//
void NRF24L01::NRF24L01SetRxMode()
{


}
//
// 函数:GetReciveBuffer   
// 功能:获取接收的数据
// 返回:
// 参数:
//
void NRF24L01::GetReciveBuffer(uint8_t *buffer)
{
    uint8_t i = 0;
    for (; i < RX_BUFFER_LENGTH; i++)
    {
        buffer = reciveBuffer;
    }
}


//
// 函数:NRF24L01SendBuffer   
// 功能:发送数据
// 返回: 成功返回TX_OK 失败返回0 达到最大次数返回MAX_TX
// 参数:sendBuffer:要发送的数据
//
uint8_t NRF24L01::NRF24L01SendBuffer(uint8_t *sendBuffer)
{
    //
    if (GetNRF24L01IRQStatus() == TX_SENDING)
    {
        return 0;
    }
    uint8_t registerStatus;
    NRF24L01_CE_LOW;
    NRF24L01WriteRegister(WRITE_REGISTER + CONFIG, TX_MODE_CONFIG);                 //工作模式
    NRF24L01_CE_HIGH;
    systmControl.DelayUS(15);
    NRF24L01_CE_LOW;
    NRF24L01WriteBufferRegister(WR_TX_PLOAD, sendBuffer, TX_BUFFER_LENGTH);
    NRF24L01_CE_HIGH;
    SetNRF24L01IRQStatus(TX_SENDING);
    return 1;
    //while (GetNRF24L01IRQStatus() != 1)                                               //等待发送完成
    //{
    //  if (GPIO_ReadInputDataBit(NRF24L01_IRQ_GPIO, NRF24L01_IRQ_PIN) == 0)
    //  {
    //      break;
    //  }
    //}
    //registerStatus = NRF24L01ReadRegister(READ_REGISTER + STATUS);                    //读取状态寄存器的值
    //NRF24L01WriteRegister(WRITE_REGISTER + STATUS, registerStatus);                 //对应位写1清除中断
    //if (registerStatus&MAX_TX)
    //{
    //  NRF24L01WriteRegister(FLUSH_TX, 0xFF);                                      //清楚FIFO寄存器
    //  return MAX_TX;                                                              //返回
    //}
    //if (registerStatus&TX_OK)
    //{
    //  return TX_OK;
    //}
    //return 0;
}
//
// 函数:NRF24L01ReciveBuffer   
// 功能:接受数据
// 返回: 成功返回1 失败返回0
// 参数:
//
uint8_t NRF24L01::NRF24L01ReciveBuffer()
{
    uint8_t registerStatus;
    registerStatus = NRF24L01ReadRegister(READ_REGISTER + STATUS);                      //读寄存器状态
    NRF24L01WriteRegister(WRITE_REGISTER + STATUS, registerStatus);
    if (registerStatus&RX_OK)
    {
        NRF24L01_CE_LOW;
        NRF24L01ReadBufferRegister(RD_RX_PLOAD, reciveBuffer, RX_BUFFER_LENGTH);        //读出数据
        NRF24L01WriteRegister(FLUSH_RX, 0xFF);                                          //清楚FIFO寄存器
        NRF24L01_CE_HIGH;
        return 1;
    }
    return 0;


}


//
// 函数:NRF24L01IRQInit
// 功能:NRF24L01 IRQ中断初始化
// 返回:
// 参数:
//
void NRF24L01::NRF24L01IRQInit(void)
{


    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                                     //配置优先级为组1
    NVIC_InitStructure.NVIC_IRQChannel = NRF24L01_IRQ_NVIC_CHANNEL;                     //选择GPIO所在引脚线路中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;                           //主优先级1     
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                                  //子优先级1
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                     //允许中断
    NVIC_Init(&NVIC_InitStructure);                                                     //初始化中断控制器


    GPIO_EXTILineConfig(NRF24L01_IRQ_EXTI_GPIOSOURCE, NRF24L01_IRQ_EXTI_PINSOURCE);     //选择GPIO管脚用作外部中断线路
    EXTI_InitStructure.EXTI_Line = NRF24L01_IRQ_EXTI_LINE;                              //设置外部中断线路
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                                 //设置为中断
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;                             //下降沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                           //使能
    EXTI_Init(&EXTI_InitStructure);                                                     //初始化




}
//
// 函数: NRF24L01IRQEnable  
// 功能:
// 返回:
// 参数:
//
void NRF24L01::NRF24L01IRQEnable()
{
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);                                                     //初始化
}
//
// 函数:   
// 功能:
// 返回:
// 参数:
//
void NRF24L01::NRF24L01IRQDisable()
{
    EXTI_InitStructure.EXTI_LineCmd = DISABLE;
    EXTI_Init(&EXTI_InitStructure);                                                     //初始化
}






NRF24L01::~NRF24L01()
{
}
//
// 函数:NRF24L01IRQHandle   
// 功能:IRQ中断函数
// 返回:
// 参数:
//


void NRF24L01IRQHandle()
{
    uint8_t registerStatus;
    if (EXTI_GetFlagStatus(NRF24L01_IRQ_EXTI_LINE)==SET)                //确保进入中断
    {
        if (systmControl.nrf24l01.GetNRF24L01Mode() == NRF24L01_TX_MODE)        //发送模式?
        {
            registerStatus = systmControl.nrf24l01.NRF24L01ReadRegister(READ_REGISTER + STATUS);                    //读取状态寄存器的值
            systmControl.nrf24l01.NRF24L01WriteRegister(WRITE_REGISTER + STATUS, registerStatus);                 //对应位写1清除中断
            if (registerStatus&MAX_TX)
            {
                systmControl.nrf24l01.NRF24L01WriteRegister(FLUSH_TX, 0xFF);                                        //清楚FIFO寄存器
            }
            systmControl.nrf24l01.SetNRF24L01IRQStatus(TX_SENDED);
            systmControl.nrf24l01.SetNRF24L01Mode(NRF24L01_RX_MODE);
        }
        else
        {
            systmControl.nrf24l01.NRF24L01ReciveBuffer();


        }
        EXTI_ClearFlag(NRF24L01_IRQ_EXTI_LINE);
    }
}
结果





举报

更多回帖

×
20
完善资料,
赚取积分