当前位置: 首页 > news >正文

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

基于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.mrgr.cn/news/94742.html

相关文章:

  • 文档搜索引擎
  • 栈区、堆区、静态区
  • LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS 论文阅读
  • 解决Windows版Redis无法远程连接的问题
  • python爬虫Scrapy(6)之增量式
  • itsdangerous加解密源码分析|BUG汇总
  • Linux实时内核稳定性案例
  • Java:引用其他类的方法
  • Spring bean的作用域详解
  • Spring面试:Spring,SpringMVC,SpringBoot
  • Excel(函数篇):IF函数、FREQUNCY函数、截取函数、文本处理函数、日期函数、常用函数详解
  • 24.策略模式实现日志
  • 蓝桥杯专项复习——结构体、输入输出
  • 【入门初级篇】布局类组件的使用(1)
  • 市面上常用的23种设计模式,分析实现方式以及实际使用场景案例
  • Centos离线安装openssl-devel
  • 自探索大语言模型微调(一)
  • VSTO(C#)Excel开发8:打包发布安装卸载
  • 守护中国软件供应链安全,未名湖畔的筑梦人
  • Redis--Zset类型