完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
2.4GHz 单片高速2Mbps 无线收发芯片 nRF24L01
nRF24L01 可以设置为以下几种主要的模式, [tr]模式pwrUPPRIM_RXCEFIFO 寄存器状态[/tr]
[tr]引脚名称方向发送模式接收模式待机模式掉电模式[/tr]
//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; //取消片选信号 } |
|||||
|
|||||
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); } } 结果 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1927 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1697 浏览 1 评论
1180 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
779 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1745 浏览 2 评论
1984浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
818浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
268浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
633浏览 3评论
637浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-31 07:34 , Processed in 0.895806 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号