你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于S-BUS协议

[复制链接]
FF_胖子 提问时间:2018-8-14 12:05 /
有人使用过S-BUS协议吗,他是双向传输的还是单向传输的
收藏 1 评论10 发布时间:2018-8-14 12:05

举报

10个回答
琦子 回答时间:2018-8-14 13:08:52
S-BUS是Futaba公司提出的舵机控制总线,支持16个比例+2个布尔共18个通道 。硬件上,它基于RS232协议,但高位取反(低电平表示1;高电平表示0)。

S-BUS的协议由25个字节构成,更新率为14ms(模拟)或7ms(高速模式),波特率100kbps。每个字节11位,定义如下:
One Byte = 1 startbit + 8 databit + 1 paritybit + 2 stopbit (8E2)。
而每个包25字节如下:
[startbyte] [data1] [data2] .... [data22] [flags][endbyte]
其中,startbyte = 11110000b (0xF0);
data 1-22 放入16个通道 [ch1, 11bit][ch2, 11bit] .... [ch16, 11bit] ,每个通道取值范围:(ch# = 0 bis 2047)。拼接如下:
channel 1 uses 8 bits from data1 and 3 bits from data2
channel 2 uses last 5 bits from data2 and 6 bits from data3
etc.
flags是信号位, bit7 = ch17 = digital channel (0x80)
bit6 = ch18 = digital channel (0x40)
bit5 = Frame lost, equivalent red LED on receiver (0x20)
bit4 = failsafe activated (0x10)
结束字节endbyte = 00000000b

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

g921002 回答时间:2018-8-14 12:49:52
單向的,格式是UART但是位準相反。
UART設定Buad rate 100k就可以收到sbus資料了。

反向電路

反向電路

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

g921002 回答时间:2018-8-14 12:54:15
等到可以收到資料後,封包定義請看這篇文件就可以。
這個協議很方便,比單純用Input Capture 抓接收機PWM In方便多了。


sbus.pdf

下载

195.05 KB, 下载次数: 133, 下载积分: ST金币 -1

協定文件

FF_胖子 回答时间:2018-8-14 14:37:38
g921002 发表于 2018-8-14 12:54
等到可以收到資料後,封包定義請看這篇文件就可以。
這個協議很方便,比單純用Input Capture 抓接收機PWM I ...

如果只是单向的话 那为什莫不直接用两个串口单独发送和接受就行了
dengyi36 回答时间:2018-8-14 16:34:43
学习一下

评分

参与人数 1ST金币 -1 收起 理由
zero99 -1 求助帖禁止灌水,警告一次

查看全部评分

ssssss 回答时间:2018-8-14 16:42:09
S.BUS(S-BUS/SBUS)

全称是Serial Bus。

S.BUS是一个串行通信协议,最早由日本厂商FUTABA(扶他爸~)引入,随后FrSky的很多接收机也开始支持,S.BUS是全数字化接口总线,数字化是指的该协议使用现有数字通信接口作为通信的硬件协议,使用专用的软件协议,这使得该设备非常适合在单片机系统中使用,也就是说适合与飞控连接。这也就是我为什么要将这个协议详细叙述的原因。总线是指他可以连接多个设备,这些设备通过一个Hub与这个总线相连,得到各自的控制信息。

S.bus使用RS232C串口的硬件协议作为自己的硬件运行基础。 使用TTL电平,即3.3V。  使用负逻辑,即低电平为“1”,高电平为“0”。 波特率:100000(100k),注意:不兼容波特率115200。
ssssss 回答时间:2018-8-14 16:45:04
SBUS协议:使用的是串口的通讯,直接可以用串口发出,但有几点仍需要注意:
1.串口配置:100k波特率,8位数据位(在stm32中要选择9位),偶校验(EVEN),2位停止位,无控流,25个字节,
2.协议格式:(8字节)
[startbyte] [data1][data2]……[data22][flags][endbyte]
startbyte=0x0f;
endbyte=0x00;
flags标志位我没有用到;
data1…data22:对应16个通道(ch1-ch16),每个通道11bit(22*8=16*11=176);
数据范围在0-2047之间,基本上是1102~1927,中值为1500;

ch1的11位=data2的低3位+data1的8位;
例如:data1=00110110,data2=11001111;
这时ch1=111 00110110=1846;通道1 的值就为1846;
ch2=data3的低6位+data2的高5位;
ch3=data5的低1位+data4的8位+data3的高2位;
ch4=4 7;
ch5=7 4;
ch6=2 8 1;
ch7=5 6;
ch8=8 3;
ch9=6 5;
ch10=1 8 2;
ch11=4 7;
ch12=7 4;
ch13=2 8 1;
ch14=5 6;
ch15=8 3;
ch16=6 5;
3.接下来要说的就是我开头提起的取反问题;
用stm32中给px4发时,需要取反,并且是硬件取反,软件取反是无效的(我在这个上面栽了跟头);硬件取反的电路图我贴上了,(这时转自 雪域Sky的狼窝 的博客;网址http://www.360doc.com/content/16/0818/08/35267583_584012245.shtml

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

ssssss 回答时间:2018-8-14 16:45:29

SBUS协议:使用的是串口的通讯,直接可以用串口发出,但有几点仍需要注意:
1.串口配置:100k波特率,8位数据位(在stm32中要选择9位),偶校验(EVEN),2位停止位,无控流,25个字节,
2.协议格式:(8字节)
[startbyte] [data1][data2]……[data22][flags][endbyte]
startbyte=0x0f;
endbyte=0x00;
flags标志位我没有用到;
data1…data22:对应16个通道(ch1-ch16),每个通道11bit(22*8=16*11=176);
数据范围在0-2047之间,基本上是1102~1927,中值为1500;

ch1的11位=data2的低3位+data1的8位;
例如:data1=00110110,data2=11001111;
这时ch1=111 00110110=1846;通道1 的值就为1846;
ch2=data3的低6位+data2的高5位;
ch3=data5的低1位+data4的8位+data3的高2位;
ch4=4 7;
ch5=7 4;
ch6=2 8 1;
ch7=5 6;
ch8=8 3;
ch9=6 5;
ch10=1 8 2;
ch11=4 7;
ch12=7 4;
ch13=2 8 1;
ch14=5 6;
ch15=8 3;
ch16=6 5;
3.接下来要说的就是我开头提起的取反问题;
用stm32中给px4发时,需要取反,并且是硬件取反,软件取反是无效的(我在这个上面栽了跟头);硬件取反的电路图我贴上了,(这时转自 雪域Sky的狼窝 的博客;网址http://www.360doc.com/content/16/0818/08/35267583_584012245.shtml


ssssss 回答时间:2018-8-14 16:52:11
打开串口时钟
void RCC_Configuration(void) // 启动USART1,2,3的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //注意各串口所对应的时钟源不一样;
Uart1 用的是APB2
Uart2 用的是APB1
Uart3 用的是APB1
//奇偶检验
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_9b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_Even;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

偶校验因为在每个字节后增加一位用于奇偶校验,因此每字节长度不是8位,而是9字节。

3.串口中断设置
#if 1
//初始化参数设置
USART_InitStructure.USART_BaudRate = 100000;//100000; //波特率100000
USART_InitStructure.USART_WordLength = USART_WordLength_9b; //字长8位
USART_InitStructure.USART_StopBits = USART_StopBits_2; //2位停止字节,USART_StopBits_2
USART_InitStructure.USART_Parity = USART_Parity_Even;//偶校验 //USART_Parity_No; //无奇偶校验
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//打开Rx接收和Tx发送功能
USART_Init(USART3, &USART_InitStructure); //初始化
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); //使能串口中断,这个必须加上
USART_Cmd(USART3, ENABLE); //启动串口
#endif
4.sbus协议:
S-BUS protocol

The protocol is 25 Byte long and is send every 14ms (analog mode) or 7ms (highspeed mode).
One Byte = 1 startbit + 8 databit + 1 paritybit + 2 stopbit (8E2), baudrate = 100’000 bit/s
The highest bit is send first. The logic is inverted (Level High = 1)

[startbyte] [data1] [data2] …. [data22] [flags][endbyte]

startbyte = 11110000b (0xF0)

data 1-22 = [ch1, 11bit][ch2, 11bit] …. [ch16, 11bit] (ch# = 0 bis 2047)
channel 1 uses 8 bits from data1 and 3 bits from data2
channel 2 uses last 5 bits from data2 and 6 bits from data3
etc.

flags = bit7 = ch17 = digital channel (0x80)
bit6 = ch18 = digital channel (0x40)
bit5 = Frame lost, equivalent red LED on receiver (0x20)
bit4 = failsafe activated (0x10)
bit3 = n/a
bit2 = n/a
bit1 = n/a
bit0 = n/a

endbyte = 00000000b
3.接收程序实现:
在STM32中的具体实现,除了如上述内容配置串口参数,还需要写好中断函数,写好解析函数。思路很简单,利用间隔时间来区分两帧,收到一帧数据后,做如下检查:

字节数够不够?

第一个字节是不是0x0f?

最后一个字节是不是0x00?

检查flag中的标志位
feixiang20 回答时间:2018-8-15 00:04:07
S-BUS协议实际上通过串口进行数据发送。但是需要注意的是,S-BUS的逻辑电平是反的,需用如下电路对电平反相,再接到串口接收的管脚。三极管可以用8050。
1.png
串口配置为波特率100kbps( 100000 ),8位数据,偶校验(even),2位停止位,无流控。

每帧25个字节,帧格式如下:
[Start Byte] [Data0] [Data1] …. [Data21] [Flags][End Byte]
两帧之间的时间间隔4ms(高速模式),约7ms一帧。
其中:
Start Byte = 0x0F。中间22个字节为16个通道的数据,每个通道用 11 bit表示,范围是0-2047。
End Byte根据S-BUS协议版本不同而不同。
Flags的定义:
bit7 = ch17 = digital channel (0x80)
bit6 = ch18 = digital channel (0x40)
bit5 = Frame lost, equivalent red LED on receiver (0x20)
bit4 = failsafe activated (0x10)
bit3 = n/a
bit2 = n/a
bit1 = n/a
bit0 = n/a
数据部分:
如果把22个字节看作一个数的话,则数据部分采用小端模式。即若把数据按照[Data21][Data20]…[Data1][Data0]的顺序排列,则[Data21]的 bit 7 为MSB,[Data0]的 bit 0 为LSB,每 11 bit 为一个通道的数据。Data[21]和[Data20]的高3位为通道16的值,以此类推。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版