[项目]基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信

news2025/3/19 23:50:30

基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信

  • 一.Si24Ri原理图
  • 二.Si24R1芯片手册解读
  • 三.驱动函数讲解
  • 五.移植2.4g通讯(飞控部分)
  • 六.移植2.4g通讯(遥控部分)
  • 七.通讯模块的完成(遥控部分)

一.Si24Ri原理图

Si24R1芯片原理图如下:
右侧为晶振。
在这里插入图片描述
模块芯片与主控芯片连接引脚如下:
在这里插入图片描述
SI-EN:使能引脚。
SI-IRO:可屏蔽中断信号,低电平有效。
SPI1-NSS:片选信号。
SPI1-CLK:时钟信号。
SPI1-MOSI:主设备输出从设备输入。
SPI1-MISO:主设备输入从设备输出。

二.Si24R1芯片手册解读

在这里插入图片描述
信道取值范围1到126,如果两个人同时使用一个信道会导致干扰。
状态机转换图:
在这里插入图片描述
TX工作模式:
在这里插入图片描述
RX工作模式:
在这里插入图片描述
在这里插入图片描述
当芯片数据过多处理不过来时,FIFO中可以存储三个数据包起到存储缓冲作用,当满了时接收到的数据包被自动丢掉。所以最好协调发送接收的频率相等,或者发送稍微慢一些。
数据包处理协议:
在这里插入图片描述
在实际代码编写时在负载数据中加入自己的数据校验。
在这里插入图片描述

三.驱动函数讲解

定义两个地址:
在这里插入图片描述
定义两个缓冲区:
在这里插入图片描述
在.h文件中extern两个缓冲区:
在这里插入图片描述
标记位:
在这里插入图片描述
写寄存器:
在这里插入图片描述
读寄存器:
在这里插入图片描述
写多个字节:
在这里插入图片描述
在这里插入图片描述
自检判断校验是否成功:
在这里插入图片描述
在这里插入图片描述

五.移植2.4g通讯(飞控部分)

文件夹创建.c.h文件,将代码复制粘贴进文件:
在这里插入图片描述
配置为全双工模式,不能超过18M,设置为4分频:
在这里插入图片描述
观察配置引脚是否与原理图一致:
在这里插入图片描述
配置片选信号NSS低电平有效,所以PA4引脚设置为高电平,使用时拉低电平:
在这里插入图片描述
配置使能信号,默认使能:
在这里插入图片描述
配置IRQ中断输入引脚,低电平有效默认上拉:
在这里插入图片描述
在这里插入图片描述
.h文件2.4g通道设置:
在这里插入图片描述
将该函数Driver_SPI_SwapByte定义:
在这里插入图片描述
在应用层编写Start函数,在中间自检:
在这里插入图片描述
App_Task中编写通信任务:
与飞控任务优先级保持一致,与飞控任务重要性差不多。
在这里插入图片描述
测试通讯任务:
因为通讯任务和飞控任务优先级相同,所以可能会导致硬件出问题,在该处开头延时1000ms。使用Inf_Si24R1_TxPacket函数接受数据包,将数据保存在RX_BUFF中,返回值0接收到数据,1未接收到数据。
在这里插入图片描述
在这里插入图片描述

六.移植2.4g通讯(遥控部分)

根据原理图配置SPI接口:
在这里插入图片描述
在这里插入图片描述
在keil中配置.h文件:
在这里插入图片描述
管理目录结构:
在这里插入图片描述
删除多余功能后,编写通讯任务:
将数据填入TX_BUFF并根据返回值判读发射成功与否。
在这里插入图片描述
配置为发送模式:
在这里插入图片描述
根据原理图更改为串口一:
在这里插入图片描述
飞控端串口有数据打印,通讯正常:
在这里插入图片描述

七.通讯模块的完成(遥控部分)

定义了一个长度为18的发送数组:
在这里插入图片描述
在发送数组中定义前3个字节为自定义帧头,可以进行数据验证。第4个字节放真正的数据长度,如下显示数据长度为10个字节,之后10个字节存放真正的数据。最后4个字节将数据全部加起来存成校验和,接收方和发送方进行比较看是否相等。
在这里插入图片描述
代码逻辑:
在此代码中用于按 大端序 拆分多字节数据,确保传输的字节顺序符合协议要求。

/**
 * @description: 通过2.4g发送摇杆数据
 *  前3个字节: 0x01,0x02,0x03
 *  1个字节:   真正的数据长度  = 10
 *  10个字节:  真正的数据
 *  4个字节 :  校验和
 *
 * @return {*}
 */
void App_Communication_SendJoyStickData(void)
{
    uint8_t index = 0;
    /* 定义帧头 */
    TX_BUFF[index++] = FRAME_0;
    TX_BUFF[index++] = FRAME_1;
    TX_BUFF[index++] = FRAME_2;

    /* 定义实际的数据长度  后面根据实际的数据,再修改*/
    TX_BUFF[index++] = 0;

    /* 摇杆数据 */
    TX_BUFF[index++] = joyStick.THR >> 8;
    TX_BUFF[index++] = joyStick.THR;

    TX_BUFF[index++] = joyStick.YAW >> 8;
    TX_BUFF[index++] = joyStick.YAW;

    TX_BUFF[index++] = joyStick.PIT >> 8;
    TX_BUFF[index++] = joyStick.PIT;

    TX_BUFF[index++] = joyStick.ROL >> 8;
    TX_BUFF[index++] = joyStick.ROL;

    TX_BUFF[index++]     = joyStick.isPowerDown;
    joyStick.isPowerDown = 0; /* 清零关机命令 */

    TX_BUFF[index++]     = joyStick.isFixHeight; /* 接收方收到1之后,对定高进行取反操作 */
    joyStick.isFixHeight = 0;                    /* 只发一次 */

    TX_BUFF[3] = index - 4;

    /* 计算校验和 */
    int32_t sum = 0;
    for(uint8_t i = 0; i < index; i++)
    {
        sum += TX_BUFF[i];
    }
    TX_BUFF[index++] = sum >> 24;
    TX_BUFF[index++] = sum >> 16;
    TX_BUFF[index++] = sum >> 8;
    TX_BUFF[index++] = sum;

    taskENTER_CRITICAL();
    Inf_Si24R1_TxPacket(TX_BUFF);
    taskEXIT_CRITICAL();
}

任务调用:

/* 2. 通讯任务 */
void communicationTask(void *args)
{
    vTaskDelay(1000);
    debug_printfln("通讯任务开始调度");
    uint32_t preTime = xTaskGetTickCount();

    while(1)
    {
        App_Communication_SendJoyStickData();
        vTaskDelayUntil(&preTime, COMMUNICATION_EXEC_CYCLE);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2318038.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Android】RuntimeShader 应用

1 简介 RuntimeShader 是 Android 13&#xff08;T&#xff09;中新增的特性&#xff0c;用于逐像素渲染界面&#xff0c;它使用 AGSL&#xff08;Android Graphics Shading Language&#xff09;编写着色器代码&#xff0c;底层基于 Skia 图形渲染引擎。官方介绍详见 → Runti…

Skia 图形引擎介绍

文章目录 一、Skia 的基本概念1. 定位与作用2. 历史背景 二、Skia 的核心架构1. 模块化设计2. 渲染流程3. 跨平台适配 三、Skia 在 Flutter 中的角色1. 自绘 UI 的核心依赖2. 跨平台一致性3. 性能优化 四、Skia 的性能优势1. 高效的图形处理2. 与原生渲染的对比3. 性能瓶颈 五、…

10、基于osg引擎生成热力图高度图实现3D热力图可视化、3D热力图实时更新(带过渡效果)

1、结果 2、完整C代码 #include <sstream> #include <iomanip> #include <iostream> #include <vector> #include <random> #include <cmath> #include <functional> #include <osgViewer/viewer> #include <osgDB/Read…

Modbus通信协议基础知识总结

1. 数据类型与存储区分类 Modbus协议将数据分为四类存储区&#xff0c;通过存储区代号区分&#xff1a; 输出线圈&#xff08;0x&#xff09;&#xff1a;可读写&#xff0c;对应二进制开关量&#xff08;如继电器状态&#xff09;&#xff0c;地址范围000001-065536&#xff…

AndroidStudio下载安装,环境部署以及常见问题解决教程(亲测)

AndroidStudio下载安装&#xff0c;环境部署以及常见问题解决&#xff01;&#xff01;&#xff01; 文章目录 前言 一、Android Studio 下载与安装 1.1 系统要求 1.2 下载 Android Studio 1.3 安装 Android Studio Windows 系统 1.4 初始配置 二、环境部署 2.1 安装 …

开源免费一句话生成儿童故事视频核心思想解析

再看一个演示视频&#xff0c;学会核心思想后&#xff0c;可以打造自己的内容生成工具&#xff0c;后文有基于飞书多维表格的实现效果&#xff1a; 一句话灵感生成儿童故事视频演示 这是一款专门为内容素材创作打造的创新工具&#xff0c;可根据用户输入的主题&#xff0c;快速…

数据结构——最短路(BFS,Dijkstra,Floyd)

完整版可以看我的最短路问题模版总结_稠密图最短路-CSDN博客 考研数据结构只考BFS,Dijkstra和Floyd 下面代码以Acwing模板题为例 BFS代码 适用类型&#xff1a; 1.单源最短路径 2.无权图 3.不适用于带权图和负权回路图 //Acwing走迷宫bfs #include<bits/stdc.h>usi…

Kali Linux汉化教程:轻松设置中文界面

1.打开终端 2.输入sudo dpkg-reconfigure locales&#xff0c;回车&#xff0c;输入密码&#xff0c;回车 sudo dpkg-reconfigure locales 3.往下滑&#xff0c;滑到底&#xff0c;找到‘zh_CN.UTF-8 UTF-8’,回车 4.选择‘zh_CN.UTF-8’,回车 5.没有 ‘zh_CN.UTF-8’选项的特…

C++和标准库速成(八)——指针、动态数组、const、constexpr和consteval

目录 1. 指针和动态数组1.1 栈和自由存储区1.2 使用指针1.3 动态分配的数组1.4 空指针常量 2. const2.1 const修饰类型2.2 const与指针2.3 使用const保护参数2.4 const方法(建议&#xff09; 3. constexpr4. consteval参考 1. 指针和动态数组 动态内存允许所创建的程序具有在编…

超声重建,3D重建 超声三维重建,三维可视化平台 UR 3D Reconstruction

1. 超声波3D重建技术的实现方法与算法 技术概述 3D超声重建是一种基于2D超声图像生成3D体积数据的技术&#xff0c;广泛应用于医学影像领域。通过重建和可视化三维结构&#xff0c;3D超声能够显著提高诊断精度和效率&#xff0c;同时减少医生的脑力负担。本技术文档将详细阐述…

[HelloCTF]PHPinclude-labs超详细WP-Level 6Level 7Level 8Level 9-php://协议

由于Level 6-9 关的原理都是通用的, 这里就拿第6关举例, 其他的关卡同理 源码分析 定位到代码 isset($_GET[wrappers]) ? include("php://".$_GET[wrappers]) : ; 与前几关发生变化的就是 php:// 解题分析 这一关要求我们使用 php协议 php:// 协议 php://filte…

【Linux】Bash是什么?怎么使用?

李升伟 整理 什么是 Bash&#xff1f; Bash&#xff08;Bourne Again Shell&#xff09;是一种 命令行解释器&#xff08;Shell&#xff09;&#xff0c;广泛用于 Unix 和 Linux 操作系统。它是 Bourne Shell&#xff08;sh&#xff09; 的增强版&#xff0c;提供了更多的功能…

如何创建并保存HTML文件?零基础入门教程

原文&#xff1a;如何创建并保存HTML文件&#xff1f;零基础入门教程 | w3cschool笔记 本文将以Windows系统为例&#xff0c;教你用最简单的记事本创建并保存第一个HTML网页。 &#x1f4dd; 第一步&#xff1a;准备工具 文本编辑器&#xff1a;使用系统自带的记事本&#xff…

React19源码系列之FiberRoot节点和Fiber节点

在上一篇文章&#xff0c;看了createRoot函数的大致流程。 createContainer函数创建并返回了FiberRoot 。FiberRoot是由createFiberRoot函数创建&#xff0c; createFiberRoot函数还将 FiberRoot和 根Fiber 通过current属性建立起了联系。将FiberRoot作为参数传给 ReactDOMRoo…

TCP协议的多线程应用、多线程下的网络编程

DAY13.2 Java核心基础 多线程下的网络编程 基于单点连接的方式&#xff0c;一个服务端对应一个客户端&#xff0c;实际运行环境中是一个服务端需要对应多个客户端 创建ServerSocketNable类&#xff0c;多线程接收socket对象 public class ServerSocketNable implements Run…

华为中小型企业项目案例

实验目的(1) 熟悉华为交换机和路由器的应用场景 (2) 掌握华为交换机和路由器的配置方法 实验拓扑实验拓扑如图所示。 华为中小型企业项目案例拓扑图 实验配置市场部和技术部的配置创建VLANLSW1的配置 [LSW1]vlan batch 10 20 [LSW1]q…

LabVIEW VI Scripting随机数波形图自动生成

通过LabVIEW VI Scripting 技术&#xff0c;实现从零开始编程化创建并运行一个随机数波形监测VI。核心功能包括自动化生成VI框架、添加控件与函数、配置数据流逻辑及界面布局优化&#xff0c;适用于批量生成测试工具、教学模板开发或复杂系统的模块化构建。通过脚本化操作&…

MATLAB 控制系统设计与仿真 - 26

状态空间控制系统概述 状态空间描述 现代控制理论是建立在状态空间基础上的控制系统分析和设计理论&#xff0c;它用状态变量来刻画系统的内部特征&#xff0c;用‘一节微分方程组’来描述系统的动态特性。系统的状态空间模型描述了系统输入/输出与内部状态之间的关系&#x…

Python----计算机视觉处理(Opencv:图像镜像旋转)

一、图像镜像旋转 图像的旋转是围绕一个特定点进行的&#xff0c;而图像的镜像旋转则是围绕坐标轴进行的。图像镜像旋转&#xff0c;也可 以叫做图像翻转&#xff0c;分为水平翻转、垂直翻转、水平垂直翻转三种。 通俗的理解为&#xff0c;当以图片的中垂线为x轴和y轴时&#x…

C++从入门到入土(八)——多态的原理

目录 前言 多态的原理 动态绑定与静态绑定 虚函数表 小结 前言 在前面的文章中&#xff0c;我们介绍了C三大特性之一的多态&#xff0c;我们主要介绍了多态的构成条件&#xff0c;但是对于多态的原理我们探讨的是不够深入的&#xff0c;下面这这一篇文章&#xff0c;我们将…