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)
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
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
评分
查看全部评分
UART設定Buad rate 100k就可以收到sbus資料了。
反向電路
评分
查看全部评分
這個協議很方便,比單純用Input Capture 抓接收機PWM In方便多了。
sbus.pdf
2018-8-14 12:52 上传
点击文件名下载附件
下载积分: ST金币 -1195.05 KB, 下载次数: 113, 下载积分: ST金币 -1
協定文件
如果只是单向的话 那为什莫不直接用两个串口单独发送和接受就行了
评分
查看全部评分
全称是Serial Bus。
S.BUS是一个串行通信协议,最早由日本厂商FUTABA(扶他爸~)引入,随后FrSky的很多接收机也开始支持,S.BUS是全数字化接口总线,数字化是指的该协议使用现有数字通信接口作为通信的硬件协议,使用专用的软件协议,这使得该设备非常适合在单片机系统中使用,也就是说适合与飞控连接。这也就是我为什么要将这个协议详细叙述的原因。总线是指他可以连接多个设备,这些设备通过一个Hub与这个总线相连,得到各自的控制信息。
S.bus使用RS232C串口的硬件协议作为自己的硬件运行基础。 使用TTL电平,即3.3V。 使用负逻辑,即低电平为“1”,高电平为“0”。 波特率:100000(100k),注意:不兼容波特率115200。
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)
评分
查看全部评分
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)
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中的标志位