1、COCOFLY 教程 1UJ104 void NRF_Init(u8 Model, u8 ch, u8 ack)105 - 1{106 SPI_CE_L(); 127 B128129130 147148149 NRF_Write_Buf(HRF_VRITE_REG+RX_ADDR_PO, RX_ADDRESS, RX_ADR_WIDTH); NRF_Write_Buf(HRF_VRITE_REG+TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); NRF_Wri t e_Reg (NRF_WRITE_REG+EH_AA, ack); NRF_Wri t e_
2、Reg(NRF_WRITE_REG+EH_RXADDR, 0x01); NRF.Wri t e_Reg(NRF_WRITE_REG+SETUP_RETR, 0x18); NRF_Wri t e_Reg(NRF_¥RITE_REG+RF_CH, ch); NRF_Write_Reg(HRF_WRITE_REG+RF_SETUP, 0x07);/////7/////7///////7/////7//////7///////////////////////Z〃写rx节点地址〃写TX节点地址 〃使能通道。的自动应答〃使能通道0的接收地址〃设置自动重发间隔时间:500us,最大自动重发次数:8次
3、〃设置RF通道为CHANAL 〃设蹙TX发射袋数,0北增益,l・bps,低噪声墙益开启if(model==l)//RX{ NRF_Write_Reg (NRFJVRITE.REG+RX.PW.PO, RX_PLOAD_WIDTH);〃选择通道。的有效数据宽度 NRF_Write_Reg(NRF_WRITE_REG + CONFIG, OxOf); // IRQ收发完成中断开启.16位CRC,主接收} _else if(model==2) //TX { NRF_Write_Reg(NRF_WRITE_REG+RX_PV_PO, RX_PLOAD_WIDTH);〃选择通道。的有效数据贾:度
4、 NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0e);// IRQ收发完成中断开启,16位CRC,主发送} _else if (model=3) //RX2 { NRF_Wri te_Reg(FLUSH_TX, Oxff); NRF_Wri te_Reg(FLUSH_RX, Oxff); NRF.Write.Reg(HRF_WRITE_REG + CONFIG, OxOf); // IRQ收发完成中断开启,16位CRC,主接收 SPI_RW(0x50); SPI_RW(0x73); NRF_Wri t e_Reg(NRF_WRITE_REG+O
5、xlc, 0x01); NRF_Write_Reg(NRF_WRITE_REG+Oxld, 0x06);} _else//TX2{ NRF_Write_Reg(NRF_WRITE_REG + CONFIG, OxOe); NRF_Wri te.Reg(FLUSH_TX, Oxff); NRF_Write.Reg(FLUSH.RX, Oxff); SPI_RW(0x50); SPI_RW(0x73); NRF_Write_Reg(NRF_WRITE_REG+Oxlc, 0x01); NRF_Vrite_Reg(NRF_WRITE_REG+Oxld, 0x06);SPI_CE_H
6、);〃:IRQ收发完成申断开启,16位CRC,主发送 3.3实验现象 把遥控器端代码下载到遥控器内、飞控端代码下载到飞控内。上电,此时按 下遥控器的左摇杆按键,可见飞控四个电机底部的LED航情灯闪烁,然后遥控 的电源指示灯也闪烁。这就意味着飞控收到了来自遥控器端的信息并且回发了信息 给遥控器,且遥控器也收到了来自飞控端的回发信息。如下列图所示为飞控航情灯以 及遥控左按键及电源指示灯。 目录一、NRF24L011 1.1 NRF24L01 简介1二、2.4G双机通信2 2.1 NRF24L01 使用方法2三、2.4G双机通信实验
7、3 3.1 遥控器端3 3.2 飞控端5 3.3 实验现象7 视觉追踪 编队飞行视觉跟随移动小车令 WIFIS1* 控制 语音控制官网地址: :〃 买链接: :〃shop 1Al开源编队无人机Al OPEN SOURCE FORMATION DRONE加飞 © 0 恁 激光气压 光流定点 有头无头 3on» 双■定高 双模式 □□ 0(H ◎ 4) 遥控控制 视觉追踪 视觉追踪 视觉追踪 飞行 图码 11色 形状 心 S n O Q 图形化多机 支持图形化 自主巡线 AI语音控洌 编队飞行
8、缰程 飞行 高级功能官方 QQ 群:457586268 SPI (2. 4G双机通信) 一、NRF24L01 1.1 NRF24L01 简介 NRF24L01是由NORDIC生产的工作在2.4GHz〜2.5GHz的ISM 频段的单片 无线收发器芯片。无线收发器包括:频率发生器、增强型“SchockBurst”模式 控制器、功率放大器、晶体振荡器、调制器和解调器。 NRF24L01的输出功率频道选择和协议的设置均可以通过SPI接口进行设 置,因此,其具有极高的兼容性,几乎可以连接到各种单片机芯片,并
9、完成无线 数据传送工作。除此之外,NRF24L01的功耗也非常的低,当工作在发射模式下 发射功率为OdBm时电流消耗仅为11.3mA ,接收模式时为12.3mA,掉电模式 和待机模式下电流消耗更低。所以NRF24L01可以广泛地应用在无线键鼠、无线 门禁、无线电台、智能工业设备、玩具等场合。 如下表所示列举了 NRF24L01的特性参数。 参数名称 参数特性 小体积 QFN20 4x4mm 封装 宽电压工作范 围 L9V〜3.6V,输入引脚可承受5V电压输入 工作温度范围 -40C 〜+80C 工作频率范围 2.400GHz 〜2.525GHz 发射功率 可选择为 O
10、dBm、-6dBm、-12dBm 和-18dBm 数据传输速率 支持 1Mbps、2Mbps 低功耗设计 接收时工作电流12.3mA, OdBm功率发射时11.3mA,掉电模 式时仅为900nA 多通道设计 126个通讯通道,6个数据通道,满足多点通讯和调频需要 多模式 支持增强型“ShockBurst”工作模式,硬件的CRC校验和点对 多点的地址控制 2如下列图所示为NRF24L01芯片实物图 单次数据传输 数据包母次可传输1〜32Byie的数据 接口 4线SPI通讯端口,通讯速率最图可达8Mbps,适合与各种MCU 连接,编程简单 中断 MCU可通过IRQ引脚
11、块判断是否完成数据接收和数据发送 二、2.4G双机通信 2.1 NRF24L01使用方法NRF24L01是以包的形式进行发送的,具体的包格式如下表所示。 前导码 地址 包控制字 负载数据 CRC NRF24L01在通信前需要进行一系列的参数配置,而在配置其参数时,NRF24L01必须工作待机模式,即CE脚拉低。在发送模式下的配置流程如下表 所示。 1 写入发送地址和接受应答通道地址 2 使能应答通道 3 使能接收地址 4 设置自动重发时间和重发次数 5 设置通信频道 6 设置参数(功率、增益等) 7 设置模式(发送、接收) 配置为接收模式的流程
12、如下表所示。 3配置完后就是发送和接收的处理了,发送的流程如下表所示。 1 配置接收通道地址 2 设置接收通道有效数据宽度 3 使能通道自动应答 4 使能接受通道地址 5 设置通信频道 6 设置参数(功率、增益等) 7 设置模式(发送、接收) 1 向FIFO中写入数据,等待IRQ发送完成中断 2 读取状态寄存器中的值 3 将读取到的状态寄存器中的值写入状态寄存器 4 判断之前读取到的状态寄存器中的值判断是发送完成还是发送失败 5 清空fifo寄存器 接收流程如下表所示。 三、2.4G双机通信实验 1 读取状态寄存器中的值 2 将读取
13、到的状态寄存器中的值写入状态寄存器 3 判断状态寄存器中得值,是否接受成功 (成功就读取fif。中的数据,并且清空fifo) 2.4G双机通信实验涉及到遥控器端和飞控端,两者的2.4G通道均设置为 110o首先配置遥控器端的左摇杆的按键为外部中断模式,一旦按下做摇杆按键, 就发送“Remoter”这个字符串到飞控上,飞控接收到后,把LED航情灯进行闪 烁,然后再向遥控器回发“Airplane”这个字符串,遥控收到后,闪烁电源指示 灯。无论是遥控器还是飞控使用NRF24L01均使用到了 STM32的硬件SPL不 同的是遥控器使用的是SPI2,而飞控使用的是SPIlo STM32的SPI配置
14、方法可 以参考飞控开发基础《SPI (六轴传感器数据获取)》。 3.1遥控器端 本次实验中遥控器端触发无线数据的发送是通过外部中断实现的,具体的外部中断配置可以参考《遥控器开发实战-中断》。在该中断中向飞控发送“Remoter” 字符串,具体代码如下列图所示。 35 36 37 B 38 39 40 0 41 T 42 43中 44 45 46 47 - 48 49 50 51 52 uint8_t dataToSend [8] = {/zRemot er//};void EXT 19_5_I RQHandl er (void)//下降沿中断{ 一一
15、 static unsigned char flag=0; if(GPIO_ReadInputDataBit (GPIOB, GPI0_Pin_9)=0) { 一一 LED_Delav(5);//去抖 if(GPIO_ReadInputDataBit(GPI0B, GPI0_Pin_9)=0)XRF_TxPacket(dataToSend, 8); EXTI_ClearITPendingBit(EXTI_Line9); 〃清除LI\E9上的中断标志位114 115 116 117 118 119 120 121 122 123 124 125 126 127
16、 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 4 ・ 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 1
17、40 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 4 ・ 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 1
18、52 153 154 155 156 157 158 159 160 4 ・ void NRF Init(u8 model, u8 ch) ( SPI_CE_L(); NRF_Write_Buf (NRF_WITE_REG+RX ADDR_P0, RX.ADDRESS, RX_ADR_WIDTH): 〃写RX节点地址 NRF_Write_Buf (NRF_WRITE_REG+TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);〃写TX节点地址 NRF_Write_Reg (NRF_WITE_REG+EN AA, 0x01):〃使能通道0的自动应答
19、NRF_Write_Reg (NRF_WITE_REG+EN_RXADDR, 0x01);〃使能通道0的接收地址 NRF_Writ e.Reg (NRF_WRITE_REG+SETUP RETR, 0x18);〃设置自动重发间隔时间:500us :最大自动重发次数:8次 NRF_Write_Reg (NRF.WITE.REG+RF.CH, ch):〃设置RF通道为CHANAL NRF_Write Reg (NRF_WRITE_REG+RF_SETUP, 0x07);〃设置TX发射参数,Odb熠益,1Mbps,低噪声熠益开启 if(mode1==1)//RX ( NRF.Write
20、Reg(NRF_WRITE_REG+RX_PW_PO, RX.PLOAD.WIDTH): NRF_Write_Reg(NRF_WRITE_REG + CONFIG, OxOf);// } else if(model==2) Z/TX { NRF_Write_Reg(NRF_WRITE_REG+RX_PW_PO, RX_PLOAD_WIDTH); NRF_Write_Reg(NRF_WRITE_REG + CONFIG, OxOe);// ) else if(model==3) //RX2 ( NRF_Write_Reg(FLUSH.TX, Oxff): NRF_Write_R
21、eg(FLUSH_RX, Oxff): NRF_Write_Reg(NRF_WRITE_REG + CONFIG, OxOf);// 〃选择通道。的有效数据宽度 工RQ收发完成中断开启,16位CRC,主接收 〃选择通道0的有效数据宽度 IRQ收发完成中断开启,16位CRC,主发送 IRQ收发完成中断开启,16位CRC,主接收 SPI RW(0x50): SPI RW(0x73): NRF_Writ e.Reg (NRF_WRITE_REG+Ox 1 c, 0x01);〃启用动态载荷长度 NRF.Writ e_Reg (NRF_WRITE_REG+Ox 1 d, 0x06);〃
22、允许载荷带ACK } elseZ/TX2 ( NRF_Write.Reg (NI^-WRITE-REG + CONFIG, OxOe) ;// IRQ收发完成中断开启,16位CRC,主发送 NRF_Write.Reg(FLUSH.TX, Oxff): NRF_Write_Reg(FLUSH_RX, Oxff): SPI_RW(0x50); SPI_RW(0x73): NRF_Write_Reg (NRF_WRITE_REG+OxlCj 0x01);〃启用动态载荷长度 NRF_Writ e_Reg (NRF_WRITE_REG+Ox 1 d, 0x06);〃允许载荷带ACK
23、 SPI_CE_H(); 遥控器端的NRF24L01的初始化代码如下列图所示。 遥控器端的接收处理是在主循环中轮询实现的,收到飞控发来的信息后,电 源指示灯闪烁,具体代码如下列图所示。 uintl6_t NRF.SSI, NRF SSI_CHT; 〃NRF信号强度uint8_t NRF_Evnet=0;rvoid NRF_Check_Event(void){ " - u8 sta = NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS); 〃接收到有效数据 if (sta & (1«RX_DR)) { 一 RX_LEN = NRF_Read_Reg
24、R_RX_PL_WID); if-X_LEN<33》NRF_Read_Buf(RD_RX_PLOAD, NRF24L01_2_RXDATA, RX.LEN). GPIO_ResetBits (GPIO_Signal4, LED.Power);7/收到闪烁LED_Delay(100);GPIO_SetBits(GPIO.Signal^ LED_Power);//DT_NrfDat a_Anl(NRF24L01_2_RXDATA , RX_LEN); NRF.SSI_CHT++;NRF_Evnet = 1;NRF_Wri t e_Reg(FLUSH_RX, Oxff); 〃清空缓冲区//
25、〃发送完成(自动应答模式下,只有当接收到应答信号后才置1) // if (sta & (1«TX_DS))// { -〃到达最大重发次数 if (sta & (1«MAX_RT))if (sta & 0x01) //TX FIFO 寄存器满标志 NRF_Wri t e_Reg(FLUSH_TX, Oxff);NRF_Write_Reg(NRF_WRITE_REG + NRFRegSTATUS, sta);3.2飞控端飞控端的无线数据接收在主循环中实现,接收到遥控器发送的信息后,电源 指示灯闪烁,且向遥控端回发“Airplane”,具体代码如下列图所示。 202203204205 20
26、6207208209 222223224225 203204205206 207208209210 uintl6_t NRF_SSI, NRF_SS工 JCNT; 〃NRF信号强度 u8 dataToSend[] = { 'Airplane',!; void NRF_Check_Event(void)g { u8 sta = NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS); 〃收到有效数据包 if (sta & (1«RX_DR))R {u8 rx_len = NRF_Read_Reg
27、R_RX_PL_WID);if(rx_len<33) 申 {NRF_Read_Buf(RD_RX_PLOAD, NRF24L01_2_RXDATA, rx_len);GPIO_SetBits (GPI0_LED_3, Pin_LED_3); 〃收到闪烁 LED_Delay(100);GPIO_ResetBits(GPI0_LED_3, Pin_LED_3); LED_Delay(100);NRF_TxPacket_AP(dat aToSend^ 8);//DT_Data_Receive_Anl(NRF24L01_2_RXDATA, NRF24L01_2_RXDATA [3]+5);NRF
28、SSI_CNT++; -} _ _ else H{NRF_Write_Reg (FLUSH-RX, Oxff); 〃清空缓冲区 ■} ) // 〃发送完成(自动应答模式下,只有当接收到应答信号后才置1) // if (sta & (1«TX_DS)) // {、 一 // ) 〃到达最大重发次数 if (sta & (1«MAX_RT)){ -if (sta & 0x01) //TX FIFO 寄存器满标志{ NRF_Wri t e_Reg(FLUSH_TX,Oxff); □ } } NRF_Write.Reg(NRF_WRITE_REG + NRFRegSTATUS, sta);飞控端的NRF24L01的初始化代码如下。
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818