疯壳AI开源无人机SPI(2.4G双机通信)
<div class='showpostmsg'><p>一、<a>NRF24L01</a><a>1.1 NRF24L01简介</a></p><p>NRF24L01是由NORDIC生产的工作在2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片。无线收发器包括:频率发生器、增强型“SchockBurst”模式控制器、功率放大器、晶体振荡器、调制器和解调器。</p>
<p>NRF24L01的输出功率频道选择和协议的设置均可以通过SPI 接口进行设置,因此,其具有极高的兼容性,几乎可以连接到各种单片机芯片,并完成无线数据传送工作。除此之外,NRF24L01的功耗也非常的低,当工作在****模式下****功率为0dBm 时电流消耗仅为11.3mA ,接收模式时为12.3mA,掉电模式和待机模式下电流消耗更低。所以NRF24L01可以广泛地应用在无线键鼠、无线门禁、无线电台、智能工业设备、玩具等场合。</p>
<p>如下表所示列举了NRF24L01的特性参数。</p>
<table>
<tbody>
<tr>
<td width="120">
<p>参数名称</p>
</td>
<td width="449">
<p>参数特性</p>
</td>
</tr>
<tr>
<td width="120">
<p>小体积</p>
</td>
<td width="449">
<p>QFN20 4x4mm封装</p>
</td>
</tr>
<tr>
<td width="120">
<p>宽电压工作范围</p>
</td>
<td width="449">
<p>1.9V~3.6V,输入引脚可承受5V电压输入</p>
</td>
</tr>
<tr>
<td width="120">
<p>工作温度范围</p>
</td>
<td width="449">
<p>-40℃~+80℃</p>
</td>
</tr>
<tr>
<td width="120">
<p>工作频率范围</p>
</td>
<td width="449">
<p>2.400GHz~2.525GHz</p>
</td>
</tr>
<tr>
<td width="120">
<p>****功率</p>
</td>
<td width="449">
<p>可选择为0dBm、-6dBm、-12dBm和-18dBm</p>
</td>
</tr>
<tr>
<td width="120">
<p>数据传输速率</p>
</td>
<td width="449">
<p>支持1Mbps、2Mbps</p>
</td>
</tr>
<tr>
<td width="120">
<p>低功耗设计</p>
</td>
<td width="449">
<p>接收时工作电流12.3mA,0dBm功率****时11.3mA,掉电模式时仅为900nA</p>
</td>
</tr>
<tr>
<td width="120">
<p>多通道设计</p>
</td>
<td width="449">
<p>126个通讯通道,6个数据通道,满足多点通讯和调频需要</p>
</td>
</tr>
<tr>
<td width="120">
<p>多模式</p>
</td>
<td width="449">
<p>支持增强型“ShockBurst”工作模式,硬件的CRC校验和点对多点的地址控制</p>
</td>
</tr>
<tr>
<td width="120">
<p>单次数据传输</p>
</td>
<td width="449">
<p>数据包每次可传输1~32Byte的数据</p>
</td>
</tr>
<tr>
<td width="120">
<p>接口</p>
</td>
<td width="449">
<p>4线SPI通讯端口,通讯速率最高可达8Mbps,适合与各种MCU连接,编程简单</p>
</td>
</tr>
<tr>
<td width="120">
<p>中断</p>
</td>
<td width="449">
<p>MCU可通过IRQ引脚块判断是否完成数据接收和数据发送</p>
</td>
</tr>
</tbody>
</table>
<p>如下图所示为NRF24L01芯片实物图</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587952828427673.png" title="1587952828427673.png" /> </p>
<p> </p>
<p>二、<a>2.4G双机通信</a><a>2.1 NRF24L01使用方法</a></p>
<p>NRF24L01是以包的形式进行发送的,具体的包格式如下表所示。</p>
<table>
<tbody>
<tr>
<td width="105">
<p>前导码</p>
</td>
<td width="105">
<p>地址</p>
</td>
<td width="105">
<p>包控制字</p>
</td>
<td width="105">
<p>负载数据</p>
</td>
<td width="105">
<p>CRC</p>
</td>
</tr>
</tbody>
</table>
<p>NRF24L01在通信前需要进行一系列的参数配置,而在配置其参数时,NRF24L01必须工作待机模式,即CE脚拉低。在发送模式下的配置流程如下表所示。</p>
<table>
<tbody>
<tr>
<td>
<p>1</p>
</td>
<td>
<p>写入发送地址和接受应答通道地址</p>
</td>
</tr>
<tr>
<td>
<p>2</p>
</td>
<td>
<p>使能应答通道</p>
</td>
</tr>
<tr>
<td>
<p>3</p>
</td>
<td>
<p>使能接收地址</p>
</td>
</tr>
<tr>
<td>
<p>4</p>
</td>
<td>
<p>设置自动重发时间和重发次数</p>
</td>
</tr>
<tr>
<td>
<p>5</p>
</td>
<td>
<p>设置通信频道</p>
</td>
</tr>
<tr>
<td>
<p>6</p>
</td>
<td>
<p>设置参数(功率、增益等)</p>
</td>
</tr>
<tr>
<td>
<p>7</p>
</td>
<td>
<p>设置模式(发送、接收)</p>
</td>
</tr>
</tbody>
</table>
<p>配置为接收模式的流程如下表所示。</p>
<table>
<tbody>
<tr>
<td>
<p>1</p>
</td>
<td>
<p>配置接收通道地址</p>
</td>
</tr>
<tr>
<td>
<p>2</p>
</td>
<td>
<p>设置接收通道有效数据宽度</p>
</td>
</tr>
<tr>
<td>
<p>3</p>
</td>
<td>
<p>使能通道自动应答</p>
</td>
</tr>
<tr>
<td>
<p>4</p>
</td>
<td>
<p>使能接受通道地址</p>
</td>
</tr>
<tr>
<td>
<p>5</p>
</td>
<td>
<p>设置通信频道</p>
</td>
</tr>
<tr>
<td>
<p>6</p>
</td>
<td>
<p>设置参数(功率、增益等)</p>
</td>
</tr>
<tr>
<td>
<p>7</p>
</td>
<td>
<p>设置模式(发送、接收)</p>
</td>
</tr>
</tbody>
</table>
<p>配置完后就是发送和接收的处理了,发送的流程如下表所示。</p>
<table>
<tbody>
<tr>
<td>
<p>1</p>
</td>
<td>
<p>向FIFO中写入数据,等待IRQ发送完成中断</p>
</td>
</tr>
<tr>
<td>
<p>2</p>
</td>
<td>
<p>读取状态寄存器中的值</p>
</td>
</tr>
<tr>
<td>
<p>3</p>
</td>
<td>
<p>将读取到的状态寄存器中的值写入状态寄存器</p>
</td>
</tr>
<tr>
<td>
<p>4</p>
</td>
<td>
<p>判断之前读取到的状态寄存器中的值判断是发送完成还是发送失败</p>
</td>
</tr>
<tr>
<td>
<p>5</p>
</td>
<td>
<p>清空fifo寄存器</p>
</td>
</tr>
</tbody>
</table>
<p>接收流程如下表所示。</p>
<table>
<tbody>
<tr>
<td>
<p>1</p>
</td>
<td>
<p>读取状态寄存器中的值</p>
</td>
</tr>
<tr>
<td>
<p>2</p>
</td>
<td>
<p>将读取到的状态寄存器中的值写入状态寄存器</p>
</td>
</tr>
<tr>
<td>
<p>3</p>
</td>
<td>
<p>判断状态寄存器中得值,是否接受成功</p>
<p>(成功就读取fifo中的数据,并且清空fifo)</p>
</td>
</tr>
</tbody>
</table>
<p><a>三、2.4G双机通信实验</a></p>
<p>2.4G双机通信实验涉及到遥控器端和飞控端,两者的2.4G通道均设置为110。首先配置遥控器端的左摇杆的按键为外部中断模式,一旦按下做摇杆按键,就发送“Remoter”这个字符串到飞控上,飞控接收到后,把LED航情灯进行闪烁,然后再向遥控器回发“Airplane”这个字符串,遥控收到后,闪烁电源指示灯。无论是遥控器还是飞控使用NRF24L01均使用到了STM32的硬件SPI,不同的是遥控器使用的是SPI2,而飞控使用的是SPI1。STM32的SPI配置方法可以参考飞控开发基础《SPI(六轴传感器数据获取)》。</p>
<p><a>3.1遥控器端</a></p>
<p>本次实验中遥控器端触发无线数据的发送是通过外部中断实现的,具体的外部中断配置可以参考《遥控器开发实战-中断》。在该中断中向飞控发送“Remoter”字符串,具体代码如下图所示。</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587952812126567.png" title="1587952812126567.png" /> </p>
<p>遥控器端的NRF24L01的初始化代码如下图所示。</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587952799359148.png" title="1587952799359148.png" /> </p>
<p>遥控器端的接收处理是在主循环中轮询实现的,收到飞控发来的信息后,电源指示灯闪烁,具体代码如下图所示。</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587952792801279.png" title="1587952792801279.png" /> </p>
<p><a>3.2飞控端</a></p>
<p>飞控端的无线数据接收在主循环中实现,接收到遥控器发送的信息后,电源指示灯闪烁,且向遥控端回发“Airplane”,具体代码如下图所示。</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587952785725329.png" title="1587952785725329.png" /> </p>
<p>飞控端的NRF24L01的初始化代码如下。</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587952776245519.png" title="1587952776245519.png" /> </p>
<p><a>3.3实验现象</a></p>
<p>把遥控器端代码下载到遥控器内、飞控端代码下载到飞控内。上电,此时按下遥控器的左摇杆按键,可见飞控四个电机底部的LED航情灯闪烁,然后遥控的电源指示灯也闪烁。这就意味着飞控收到了来自遥控器端的信息并且回发了信息给遥控器,且遥控器也收到了来自飞控端的回发信息。如下图所示为飞控航情灯以及遥控左按键及电源指示灯。</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587952768763660.png" title="1587952768763660.png" /> </p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>NRF24L01参数配置写的很清楚,谢谢分享</p>
<p>把遥控器端代码下载到遥控器内、飞控端代码下载到飞控内</p>
页:
[1]