资源描述
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_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次〃设置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);〃选择通道。的有效数据贾:度
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+Oxlc, 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 ();〃:IRQ收发完成申断开启,16位CRC,主发送
3.3实验现象
把遥控器端代码下载到遥控器内、飞控端代码下载到飞控内。上电,此时按 下遥控器的左摇杆按键,可见飞控四个电机底部的LED航情灯闪烁,然后遥控 的电源指示灯也闪烁。这就意味着飞控收到了来自遥控器端的信息并且回发了信息 给遥控器,且遥控器也收到了来自飞控端的回发信息。如下列图所示为飞控航情灯以 及遥控左按键及电源指示灯。
目录一、NRF24L011
1.1 NRF24L01 简介1二、2.4G双机通信2
2.1 NRF24L01 使用方法2三、2.4G双机通信实验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语音控洌
编队飞行
缰程
飞行
高级功能官方 QQ 群:457586268
SPI (2. 4G双机通信)
一、NRF24L01
1.1 NRF24L01 简介
NRF24L01是由NORDIC生产的工作在2.4GHz〜2.5GHz的ISM 频段的单片 无线收发器芯片。无线收发器包括:频率发生器、增强型“SchockBurst”模式 控制器、功率放大器、晶体振荡器、调制器和解调器。
NRF24L01的输出功率频道选择和协议的设置均可以通过SPI接口进行设 置,因此,其具有极高的兼容性,几乎可以连接到各种单片机芯片,并完成无线 数据传送工作。除此之外,NRF24L01的功耗也非常的低,当工作在发射模式下 发射功率为OdBm时电流消耗仅为11.3mA ,接收模式时为12.3mA,掉电模式 和待机模式下电流消耗更低。所以NRF24L01可以广泛地应用在无线键鼠、无线 门禁、无线电台、智能工业设备、玩具等场合。
如下表所示列举了 NRF24L01的特性参数。
参数名称
参数特性
小体积
QFN20 4x4mm 封装
宽电压工作范 围
L9V〜3.6V,输入引脚可承受5V电压输入
工作温度范围
-40C 〜+80C
工作频率范围
2.400GHz 〜2.525GHz
发射功率
可选择为 OdBm、-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引脚块判断是否完成数据接收和数据发送
二、2.4G双机通信
2.1 NRF24L01使用方法NRF24L01是以包的形式进行发送的,具体的包格式如下表所示。
前导码
地址
包控制字
负载数据
CRC
NRF24L01在通信前需要进行一系列的参数配置,而在配置其参数时,NRF24L01必须工作待机模式,即CE脚拉低。在发送模式下的配置流程如下表 所示。
1
写入发送地址和接受应答通道地址
2
使能应答通道
3
使能接收地址
4
设置自动重发时间和重发次数
5
设置通信频道
6
设置参数(功率、增益等)
7
设置模式(发送、接收)
配置为接收模式的流程如下表所示。
3配置完后就是发送和接收的处理了,发送的流程如下表所示。
1
配置接收通道地址
2
设置接收通道有效数据宽度
3
使能通道自动应答
4
使能接受通道地址
5
设置通信频道
6
设置参数(功率、增益等)
7
设置模式(发送、接收)
1
向FIFO中写入数据,等待IRQ发送完成中断
2
读取状态寄存器中的值
3
将读取到的状态寄存器中的值写入状态寄存器
4
判断之前读取到的状态寄存器中的值判断是发送完成还是发送失败
5
清空fifo寄存器
接收流程如下表所示。
三、2.4G双机通信实验
1
读取状态寄存器中的值
2
将读取到的状态寄存器中的值写入状态寄存器
3
判断状态寄存器中得值,是否接受成功 (成功就读取fif。中的数据,并且清空fifo)
2.4G双机通信实验涉及到遥控器端和飞控端,两者的2.4G通道均设置为 110o首先配置遥控器端的左摇杆的按键为外部中断模式,一旦按下做摇杆按键, 就发送“Remoter”这个字符串到飞控上,飞控接收到后,把LED航情灯进行闪 烁,然后再向遥控器回发“Airplane”这个字符串,遥控收到后,闪烁电源指示 灯。无论是遥控器还是飞控使用NRF24L01均使用到了 STM32的硬件SPL不 同的是遥控器使用的是SPI2,而飞控使用的是SPIlo STM32的SPI配置方法可 以参考飞控开发基础《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)//下降沿中断{ 一一
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
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
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
140
141
142
143
144
145
146
147
148
149
150
151
152
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的自动应答
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 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_Reg(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);〃允许载荷带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
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(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); 〃清空缓冲区// 〃发送完成(自动应答模式下,只有当接收到应答信号后才置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
206207208209
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(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.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的初始化代码如下。
展开阅读全文