文章目录

  • 1、通信协议解析说明
  • 2、驱动程序设计
  • 3、实测
  • 4、使用串口空闲中断+DMA接收
  • 5、源码

1、通信协议解析说明

常见的官方遥控器大概如下所示:

常用的搭配接收机:

这里需要注意的是:i6是可以刷十通道固件的,但是十通道的性能要发挥出来需要用IA10B的接收机才行,IA6B的接收机解码IBUS(富斯官方的协议)最多仅支持到8通道,所以你看到下面我们解码最后两个通道无论怎么动都没有反应是正常的:

然后官方也公开了通信协议

从官网我们可以获取到的协议原文如下:

这里我也用逻辑分析仪,抓了一段数据,可以看到基本上和上面说的没什么区别,基本上也就是一帧32个字节的数据,然后开头0x20,0x40这样的,后面我们只需要按照要求进行解码就可以了。

2、驱动程序设计

首先是配置时钟,这里是时钟一定要拉到最高,不然通信的时候波特率会出问题(起因是我第一次忘了配然后一直通信失败,读不出准确的数据)

之后配置串口并开启串口中断,当然如果就是使用串口DMA也是可以的,我之前有一篇文章系统总结了一些串口中设备的处理办法:串口通信中一些常用的小工具

配置完成之后就可以生成代码了,这里我们首先配置下需要的串口号还有一些宏参数:

查看解析函数:

之后我们就可以在主函数中来测试接收函数了

3、实测

首先是在打开接收中断

在中断回调函数不断处理解析函数,获取解析的数据。

这样将程序下载到开发板并进入仿真就可以看到数据了,前面四个通道对应摇杆的四个位,中位的时候都是1500,对应PWM高电平时间都是1.5ms,最低的时候是1000,拉满是2000.

4、使用串口空闲中断+DMA接收

我们知道,这里其实就是处理个数据而已所以我们改为数据包即可,代码如下:

#define USART_DMA_RX_BUFFER_MAXIMUM 64 // DMA缓冲区大小
extern DMA_HandleTypeDef hdma_usart2_rx;uint8_t FUSI_rx_buffer[USART_DMA_RX_BUFFER_MAXIMUM]; //串口1的DMA接收缓冲区
uint16_t FUSI_rx_len;                                // DMA一次空闲中断接收到的数据长度
uint8_t FUSI_data[USART_DMA_RX_BUFFER_MAXIMUM];      // DMA接收数据缓存区
uint16_t channel[IBUS_USER_CHANNELS];void UART_DMA_start(void)
{for(uint8_t i = 0;i<IBUS_MAX_CHANNLES;i++){channel[i] = 1500;}__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);HAL_UART_Receive_DMA(&huart2,(uint8_t *)FUSI_rx_buffer, USART_DMA_RX_BUFFER_MAXIMUM);
}uint16_t checksum_cal, checksum_ibus;void IBUS_READ_CHANNEL(uint8_t user_channels)
{uint16_t channel_buffer[IBUS_MAX_CHANNLES] = {0};if(FUSI_data[0] == IBUS_LENGTH && FUSI_data[1] == IBUS_COMMAND40){checksum_cal = 0xffff - FUSI_data[0] - FUSI_data[1];for(int i = 0; i < IBUS_MAX_CHANNLES; i++){channel_buffer[i] = (uint16_t)(FUSI_data[i * 2 + 3] << 8 | FUSI_data[i * 2 + 2]);checksum_cal = checksum_cal - FUSI_data[i * 2 + 3] - FUSI_data[i * 2 + 2];}checksum_ibus = FUSI_data[31] << 8 | FUSI_data[30];if(checksum_cal == checksum_ibus){for(int j = 0; j < user_channels; j++){channel[j] = channel_buffer[j];}}}
}void HAL_UART_ReceiveIdle(UART_HandleTypeDef *huart)
{//当触发了串口空闲中断if ((__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) != RESET)){if (huart->Instance == USART2){__HAL_UART_CLEAR_IDLEFLAG(huart);HAL_UART_DMAStop(huart);FUSI_rx_len = USART_DMA_RX_BUFFER_MAXIMUM - (__HAL_DMA_GET_COUNTER(&hdma_usart2_rx));memcpy(FUSI_data, FUSI_rx_buffer, USART_DMA_RX_BUFFER_MAXIMUM);memset(FUSI_rx_buffer, 0, USART_DMA_RX_BUFFER_MAXIMUM);while (HAL_UART_Receive_DMA(&huart2, (uint8_t *)FUSI_rx_buffer, USART_DMA_RX_BUFFER_MAXIMUM) != HAL_OK);IBUS_READ_CHANNEL(IBUS_USER_CHANNELS);}//下面添加其他串口的处理函数}
}

之后在初始话部分开启DMA,并在中断处调用即可!

5、源码

fly_ibus.c

/** fly_ibus.c**  Created on: Feb 13, 2022*      Author: LX*/#include "fly_ibus.h"uint8_t rx_buffer[32] = {0};
uint16_t channel[IBUS_USER_CHANNELS] = {0};
uint16_t checksum_cal, checksum_ibus;void IBUS_INIT()
{HAL_UART_Receive_IT(IBUS_UART, rx_buffer, 32);
}void IBUS_READ_CHANNEL(uint8_t user_channels)
{uint16_t channel_buffer[IBUS_MAX_CHANNLES] = {0};if(rx_buffer[0] == IBUS_LENGTH && rx_buffer[1] == IBUS_COMMAND40){checksum_cal = 0xffff - rx_buffer[0] - rx_buffer[1];for(int i = 0; i < IBUS_MAX_CHANNLES; i++){channel_buffer[i] = (uint16_t)(rx_buffer[i * 2 + 3] << 8 | rx_buffer[i * 2 + 2]);checksum_cal = checksum_cal - rx_buffer[i * 2 + 3] - rx_buffer[i * 2 + 2];}checksum_ibus = rx_buffer[31] << 8 | rx_buffer[30];if(checksum_cal == checksum_ibus){for(int j = 0; j < user_channels; j++){channel[j] = channel_buffer[j];}}}HAL_UART_Receive_IT(IBUS_UART, rx_buffer, 32);
}

fly_ibus.h

/** fly_ibus.h**  Created on: Feb 13, 2022*      Author: LX*/#ifndef FLY_IBUS_H_
#define FLY_IBUS_H_#include "main.h"
#include "usart.h"/* User configuration */
#define IBUS_UART               (&huart1)
#define IBUS_UART_INSTANCE      (USART1)
#define IBUS_USER_CHANNELS      10          // Use 6 channels
/* User configuration */#define IBUS_LENGTH             0x20    // 32 bytes
#define IBUS_COMMAND40          0x40    // Command to set servo or motor speed is always 0x40
#define IBUS_MAX_CHANNLES       14void IBUS_INIT();
void IBUS_READ_CHANNEL(uint8_t user_channels);#endif /* FLY_IBUS_H_ */

使用stm32解析富斯i6接收机(IBUS)相关推荐

  1. 富斯i6接收机及PPM编码器​​​​​​​接线

    没有完成发射机和接收机对码,则需要按照如下过程对码: 1.将对码线连接到接收机上的B/VCC接口. 2.将电源线连接到接收机上任意其他接口. 3.打开发射机电源,同时常按发射机"BINDKE ...

  2. 图文并茂详细教程之——富斯I6遥控器电压回传模块的安装和使用(苍穹四轴)

    摘自:https://mp.weixin.qq.com/s/Avo1RlEkWL-qLLJ2S7RA6w 图文并茂详细教程之--富斯I6遥控器电压回传模块的安装和使用 CJKK 苍穹四轴DIY 201 ...

  3. 富斯遥控器/接收机的PWM/PPM/iBUS/SBUS通道设置

    富斯遥控器FS-i6X拥有10通道输出,富斯接收机FS-iA10B拥有10通道输入,两者都有PWM/PPM/iBUS/SBUS协议,但是PPM和iBUS协议最高只支持8通道,而SBUS协议可以支持10 ...

  4. STM32F103读取富思i6(i-bus)协议,基于固件库开发的版本(V3.5)

    实验准备 i-bus接收机一个,富思i6遥控器(其他也行),我使用的是STM32F103系类的单片机,使用了中断,串口,0.96的OLED(IIC协议),PA12 - SCL,PA11 - SDA.使 ...

  5. 自制2.4G ELRS TX高频头, 内置于富斯i6

    制作难度:容易 一.硬件材料: 1.LoRa射频模块,sx1280 : E28-2G4M27S 2.MCU Wifi模块:ESP-WROOM32 3.各色硅胶软线若干 4.1k电阻 5.富斯FS I6 ...

  6. 富斯i6设置APM失控保护

    1.在APM地面站中选择故障保护 ---RTL---其他不变--PWM为 975 2.富斯遥控器--选择工具--End  points--三通道油门改成112% 100%--油门显示处PWM值小于97 ...

  7. 富斯/MC6接收机说明书

    正面                                      反面 1. PWM输出通道多达6个, 可以自由切换7种模式,自由选择无刷,有刷,差速,炫酷的RGB全彩灯带等,自由玩耍. ...

  8. 富斯i6航模遥控器翻译

    http://www.iqiyi.com/w_19rub19cu1.html http://www.moz8.com/thread-140603-1-1.html?_dsign=48b4029f 主菜 ...

  9. 富斯i6B接收机与pixhawk连接

    pix接收PPM编码信号,传统PWM接收器不能直接接收(例如FS-ia6),通常需要PWM转PPM转接板,或者直接采用PPM输出的接收器(例如FS-ia6B).我采用的配置是FS-i6遥控器+FS-i ...

最新文章

  1. CSS vs. JS Animation: 哪个更快
  2. iOS进阶之底层原理-block本质、block的签名、__block、如何避免循环引用
  3. 服务机器人---设计中的仿真
  4. Python之pip:Python语言中的pip的简介、安装、使用方法之详细攻略
  5. C语言写300k文件大概多少行,为什么 DELPHI 编译出的程序一般的来说至少都有300k呢?...
  6. 打车业务下单高并发解决方案
  7. ★★★★★手把手教你如何利用凤凰实现破 解后台权限以及升级固件(刷机)★★★★★
  8. Testbench基本入门
  9. springboot定时器 + Javamail + 心知天气API (通过邮件每天给女朋友发送一句情话+当日天气信息+当日生活指数)
  10. ECMAScript历史
  11. SendGrid -- Stressful Subject
  12. 在c语言中整数除以0,整数除零在哪些平台上触发浮点异常?
  13. 2021 年第一个双月总结
  14. 2022年4月23日美团笔试
  15. 计算机网络 路由选择,路由选择
  16. Maxio MAS0902A贴英特尔B16A颗粒速度测试
  17. Mac恢复被修改的文档
  18. ListView的简单使用《一》—普通图文展示案例
  19. 北京车辆从4S店提车以后自己上牌怎么操作
  20. 从刘福泉炮轰“社科院的调查太雷人”谈:一辈子租房又何妨

热门文章

  1. 浅谈OCR之Onenote2010
  2. ISTP会议发表后多久能被检索收录!
  3. 前后端如何进行数据交互
  4. 11 边缘保留滤波(EPF)
  5. Java编程判断一个数是否是回文数
  6. 基于高速51单片机的模拟USB接口设计
  7. (私人收藏)法律文书格式模板大全
  8. 缺失数据(missing data)的处理(理论)
  9. springboot+vue餐厅点餐系统在线点餐系统(含源码+数据库)
  10. Android Studio安装超详细步骤(包括SDK安装不成功,模拟器无法创建等问题)