STM32 Futaba SBUS协议解析

  • 1. S.BUS
    • 1.1 协议介绍
    • 1.2 协议解析
  • 2. 硬件设计
    • 2.1 硬件参数
    • 2.2 反相电路
  • 3.程序设计
    • 3.1 数据接收
    • 3.2 数据处理
  • 4. 最后

1. S.BUS

1.1 协议介绍


S.BUS是FUTABA提出的舵机控制总线,全称Serial Bus,别名S-BUS或SBUS,也称 Futaba S.BUS。
S.BUS是一个串行通信协议,也是一个数字串行通信接口(单线),适合与飞控连接。它可以连接很多设备,每个设备通过一个HUB与它相连,得到各自的控制信息。
S.BUS可以传输16个比例通道和2个数字(bool)通道。其硬件上基于RS232协议,采用TTL电平,但高位取反(负逻辑,低电平为“1”,高电平为“0”),通信波特率为100K(不兼容波特率115200)。

1.2 协议解析

  1. 通信接口:USART(TTL)
  2. 通信参数:1个起始位+8个数据位+偶校验位+2个停止位,波特率=100000bit/s,电平逻辑反转。
  3. 通信速率:每14ms(模拟模式)或7ms(高速模式)发送,即数据帧间隔为 11ms(模拟模式)或4ms(高速模式)。
  4. 数据帧格式:[1]
字节位 byte1 byte2-23 byte24 byte25
类型 开始字节 通道数据字节(含16个脉宽通道) 标志位字节(含2个数字通道) 结束字节
数据 0x0F 通道数据范围11Bits = [0,2047] 2个数字通道位+2个状态位 0x00

byte1:
startbyte = 0000 1111b (0x0F)

byte2-23:
databytes = 22bytes = 22 x 8Bits = 16 x 11Bits(CH1-16)
通道数据低位在前,高位在后,每个数据取11位,具体协议如下:
读取的databyte值:

byte 2 3 4 5 6 7 etc
内容 12345678 12345678 12345678 12345678 12345678 12345678 etc

转化后的通道值:

通道 CH01 CH02 CH03 CH04 etc
内容 67812345678 34567812345 81234567812 56781234567 etc

byte24:

Bit 7 6 5 4 3 2 1 0
含义 数字通道CH17 数字通道CH18 帧丢失位 故障保护激活位 N/A N/A N/A N/A

byte25:
endbyte = 0000 0000b (0x00)

2. 硬件设计

2.1 硬件参数

  1. 主控芯片:STM32F103VET6
  2. 接收端口:USART2(带反相电路)
  3. S.BUS设备:walkera RX-SBUS[2](配DEVO 10遥控器)

2.2 反相电路

由于此芯片串口不带反相器,我们需要外部搭建反相电路。如果芯片串口内部带反相器,可以省略此步。反相电路设计如下图:

  1. J1为4Pin排针,适配S.BUS接口,可5V输出为SBUS接收机供电。
  2. J1的Pin-4接S.BUS数据发送端,连接一个由NPN三极管构成的反相器,将反相后的信号送入芯片USART2的RXD引脚。

3.程序设计

3.1 数据接收

分析一:根据 1.2 的协议解析,开始字节(0x0F)和结束字节(0x00)都是数据字节中很容易出现的字节,所以不能完全作为数据帧接收开始和结束的标志。
分析二:每个数据帧之间的间隔至少4ms,则可以利用这个空闲时间来接收数据帧。(需要设计一个系统时钟)
分析三:STM32 USART或UART有空闲中断,即检测到总线空闲(无数据传输),就产生中断。
接收程序设计:综上,利用USART2接收中断(RXNE)来接收每个字节,利用USART2空闲中断(IDLE)来判断数据帧是否接收完毕。

USART2 初始化函数代码如下:

/*** @name   SBUS_Configuration* @brief  Configure SBUS(Usart2) clock, gpio and nvic:*         SBUS_RX  USART2_RX  PD6* @param  None* @retval None*/
void SBUS_Configuration(void)
{GPIO_InitTypeDef  GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef  NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);//  波特率100000 8个数据位 偶校验位 2个停止位USART_InitStructure.USART_BaudRate = 100000;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_2;USART_InitStructure.USART_Parity = USART_Parity_Even;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx;USART_Init(USART2, &USART_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);USART_Cmd(USART2, ENABLE);
}

USART2 中断函数代码如下:


uint8_t USART2_RX_BUF[26];/*** @name   USART2_IRQHandler* @brief  This function handles USART2 Handler* @param  None* @retval None*/
void USART2_IRQHandler(void)
{uint8_t res;uint8_t clear = 0;static uint8_t Rx_Sta = 1;if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){res =USART2->DR;USART2_RX_BUF[Rx_Sta++] = res;}else if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET){clear = USART2->SR;clear = USART2->DR;USART2_RX_BUF[0] = Rx_Sta - 1;Rx_Sta = 1;}
}
  1. USART2_RX_BUF为接收缓存区,定义为26个字节,第一个字节USART2_RX_BUF[0]为接收到的字节个数,后面为接收到的数据。
  2. USART2_RX_BUF[0]可以作为数据帧字节长度的判断。
  3. 中断服务函数具体解释请参考STM32 串口接收不定长字节数据。

3.2 数据处理

直接上代码:

uint16_t CH[18];  // 通道值
uint8_t  rc_flag = 0;void Sbus_Data_Count(uint8_t *buf)
{CH[ 0] = ((int16_t)buf[ 2] >> 0 | ((int16_t)buf[ 3] << 8 )) & 0x07FF;CH[ 1] = ((int16_t)buf[ 3] >> 3 | ((int16_t)buf[ 4] << 5 )) & 0x07FF;CH[ 2] = ((int16_t)buf[ 4] >> 6 | ((int16_t)buf[ 5] << 2 )  | (int16_t)buf[ 6] << 10 ) & 0x07FF;CH[ 3] = ((int16_t)buf[ 6] >> 1 | ((int16_t)buf[ 7] << 7 )) & 0x07FF;CH[ 4] = ((int16_t)buf[ 7] >> 4 | ((int16_t)buf[ 8] << 4 )) & 0x07FF;CH[ 5] = ((int16_t)buf[ 8] >> 7 | ((int16_t)buf[ 9] << 1 )  | (int16_t)buf[10] <<  9 ) & 0x07FF;CH[ 6] = ((int16_t)buf[10] >> 2 | ((int16_t)buf[11] << 6 )) & 0x07FF;CH[ 7] = ((int16_t)buf[11] >> 5 | ((int16_t)buf[12] << 3 )) & 0x07FF;CH[ 8] = ((int16_t)buf[13] << 0 | ((int16_t)buf[14] << 8 )) & 0x07FF;CH[ 9] = ((int16_t)buf[14] >> 3 | ((int16_t)buf[15] << 5 )) & 0x07FF;CH[10] = ((int16_t)buf[15] >> 6 | ((int16_t)buf[16] << 2 )  | (int16_t)buf[17] << 10 ) & 0x07FF;CH[11] = ((int16_t)buf[17] >> 1 | ((int16_t)buf[18] << 7 )) & 0x07FF;CH[12] = ((int16_t)buf[18] >> 4 | ((int16_t)buf[19] << 4 )) & 0x07FF;CH[13] = ((int16_t)buf[19] >> 7 | ((int16_t)buf[20] << 1 )  | (int16_t)buf[21] <<  9 ) & 0x07FF;CH[14] = ((int16_t)buf[21] >> 2 | ((int16_t)buf[22] << 6 )) & 0x07FF;CH[15] = ((int16_t)buf[22] >> 5 | ((int16_t)buf[23] << 3 )) & 0x07FF;
}

接收到的报文和解析出来的数据如下:
RX:0F E0 03 1F 58 C0 07 16 B0 80 05 2C 60 01 0B F8 C0 07 00 00 00 00 00 03 00
CH: 992 992 352 992 352 352 352 352 352 352 992 992 000 000 000 000
RX:0F 60 01 0B 58 C0 07 66 30 83 19 7C 60 06 1F F8 C0 07 00 00 00 00 00 03 00
CH: 352 352 352 992 1632 1632 1632 992 1632 992 992 992 000 000 000 000

  1. 接收的byte24数据并非和协议解析中的一样,无论断开遥控器还是连接遥控器,读取的值都是0x03。
  2. 接收机只支持12个通道,所以通道13-16没有值。
  3. 读取的通道值中间值为992,最大值为1632,最小值为352。

4. 最后

    本教程由 Brendon Tan 原创发布,版权所有。该文档仅供个人学习交流使用,不得用于其他用途,禁止商用, 转载或公开使用请联系作者授权。
    此教程由本人独立整理,如有不当之处,欢迎指正。


  1. 该协议解析参考Futaba S-BUS controlled by mbed[Uwe Gartmann,Created 07 Mar 2012,Last updated 09 Mar 2012] ↩︎

  2. 某猫链接walkera RX-SBUS[Copied May 2012] ↩︎

STM32 Futaba SBUS协议解析相关推荐

  1. STM32 解析futaba S-bus协议

    S-bus为futaba使用的串行通信协议.实际上为串口通信.但是有几点需要注意: 在大端小端上,网上资料都说的不是很清楚: 跟TTL串口信号相比,S-bus的逻辑电平是反的,需用如下电路对电平反相, ...

  2. SBUS协议(20200210)

    最近看到很多sbus协议,就专门搜集了一些资料学习一下. 1.介绍 SBUS是一个接收机串行总线输出,通过这根总线,可以获得遥控器上所有通道的数据.目前很多模型及无人机电子设备都支持SBUS总线的接入 ...

  3. Futaba S-BUS controlled by mbed(使用mbed控制Futaba S-BUS)

    原文地址: Futaba S-BUS controlled by mbed 代码地址: SBUS-Library Introduction(简介) The Futaba S-BUS protocol ...

  4. 深度解析FUTABA的SBUS协议(/天地飞遥控器的WBUS协议/Robomaster接收机的DBUS协议)到底是啥?

    写在前面: 无论是SBUS(日本FUTABA,所以航模,车模爱好者都知道的公司,一个好点遥控器近万了),还是WBUS(天地飞遥控器接收机用),亦或者DBUS(Robomaster官方接收机用). 划重 ...

  5. 【SBUS】一文看懂SBUS协议

    [STM32]STM32单片机总目录 1.简介 S.BUS是一个串行通信协议,S.BUS是FUTABA提出的舵机控制总线, S.bus使用RS232C串口的硬件协议作为自己的硬件运行基础. 使用TTL ...

  6. SBUS协议介绍和标准例程

    SBUS信号例程详解 1. SBUS信号简介 1.硬件标准 2.软件标准 1.串口配置: 2.协议格式: 3.数据范围 4.间隔问题 2. STM32F4_Sbus (DMA+串口 ) (1) 串口配 ...

  7. SBUS协议转换芯片,SBUS转UART,sbus转rs232,sbus解码IC,zr003

    sbus 协议比较复杂.16通道一共用了22字节.每个通道占11bit.所以会存在拼字节错位的问题.需要转化成一个整形的数据.这对一般的主控还是有压力,开销不少.今天跟大家分享一个专用的sbus解码芯 ...

  8. 调试备忘录-SWD协议解析

    目录--点击可快速直达 目录 写在前面 1  SWD协议简介 2  SWD物理层协议解析 2.1  SWD通信时序分析 2.2  SWD 寄存器简介 2.2.1  DP寄存器 2.2.2  AP寄存器 ...

  9. synopsys PCIE IP协议解析

    synopsys PCIE IP协议解析 1.Overview Core支持单个Pcie内核的Loopback功能,该功能主要为了做芯片验证,以及在没有远程接收器件的情况下完成自己的回环.同时,Cor ...

  10. 详解BLE 空中包格式—兼BLE Link layer协议解析

    BLE有几种空中包格式?常见的PDU命令有哪些?PDU和MTU的区别是什么?DLE又是什么?BLE怎么实现重传的?BLE ACK机制原理是什么?希望这篇文章能帮你回答以上问题. 虽然BLE空中包(pa ...

最新文章

  1. mingw编译ffmpeg 错误:Unknown option --enable-memalign-hack
  2. 【树莓派智能门锁】接线布局安装【3】
  3. python中如何编写代码输入多个数据并把它们放在一个列表中去_10分钟学习函数式Python...
  4. miniui展示日历能点击_2020年日历设计,除了366天有新字体,还有新形式
  5. Java8 Math新增方法
  6. div css 登录页面布局,DIV+CSS页面布局
  7. Lucene.Net 2.3.1开发介绍 —— 二、分词(一)
  8. 学习Wireshark之二:数据包分析
  9. 谷歌浏览器无法登录账号
  10. Antd如何用Menu组件渲染二级或三级目录
  11. Java 拾遗补阙 ----- 深入解析多态
  12. BZOJ 2339 【HNOI2011】 卡农
  13. 【Books系列】2021年:《断舍离》读书笔记
  14. 网站前端开发必会基础知识有哪些?
  15. Zeppelin解释器的REST API接口
  16. 【小工具推荐】-云笔记+思维导图
  17. C/C++ under ubuntu,linux
  18. 微型计算机储存系统一般指主存器和,2019年12月网络教育统考《计算机应用基础》复习题(八)...
  19. EM算法在高斯混合模型学习中的应用
  20. [双系统安装]Win10安装Liunx(Ubuntu20.04.4)到移动硬盘

热门文章

  1. 架构之美–开放环境下的网络架构
  2. 翻译:Towards Lingua Franca Named Entity Recognition with BERT(基于BERT的通用语命名实体识别)
  3. 中彩体彩排列3彩票软件 解压缩软件
  4. Windows中的用户和组以及用户密码处理
  5. 计算机毕业设计源码—SpringBoot+Vue疫情防控管理系统
  6. 杨中科:我的大学生活
  7. springboot启动自动停止
  8. nina数据库的采样频率_基于深度学习模型的表面肌电信号手势动作识别算法研究...
  9. Centos 8 Linux 安装 微信(WeChat)
  10. spring集成sitemesh3