问答对人有帮助,内容完整,我也想知道答案
0
S.BUS是什么?S.BUS协议有何特点?
0
2021-12-15 07:40:26
评论
淘帖0
邀请回答
您可以邀请以下用户,快速回答问题
×
heks
该类别下有 54 个回答。
邀请回答
hgimtk
该类别下有 45 个回答。
邀请回答
新星之火12138
该类别下有 43 个回答。
邀请回答
chm5
该类别下有 42 个回答。
邀请回答
wang21cj
该类别下有 41 个回答。
邀请回答
hjfjsdgfjdsf
该类别下有 38 个回答。
邀请回答
werywer
该类别下有 36 个回答。
邀请回答
fdjslkjd
该类别下有 35 个回答。
邀请回答
uvysdfydad
该类别下有 35 个回答。
邀请回答
h1654155957.9520
该类别下有 35 个回答。
邀请回答
凤毛麟角
该类别下有 34 个回答。
邀请回答
维生素B2
该类别下有 34 个回答。
邀请回答
dfzvzs
该类别下有 34 个回答。
邀请回答
江左盟
该类别下有 34 个回答。
邀请回答
jenny042
该类别下有 34 个回答。
邀请回答
爱与友人
该类别下有 33 个回答。
邀请回答
wenminglang
该类别下有 33 个回答。
邀请回答
lining870815844
该类别下有 33 个回答。
邀请回答
储蓄叛逆
该类别下有 33 个回答。
邀请回答
ggfvxv
该类别下有 33 个回答。
邀请回答
举报
王玉兰
相关推荐
• S.BUS,iBUS和PPM协议对应的三种接收机电路有何区别
5263
• M-BUS有什么特点?
3060
• 如何去使用simulink-stateflow中的bus总线呢
1994
• Bus Bridge在AHB和APB之间有何作用
1950
• 关于M-BUS协议栈
4050
• MOD BUS 和CAN BUS 的总线有什么区别求大神讲解~
11766
• 求助,为什么S32K144在STOP1模式,CLKOUT也有bus_clk输出?
600
• 什么是无线M-Bus?它有哪些应用?
4255
• 关于m-bus的几个小问题
3856
• bus_tick块问题,每个tick =?系统时钟?
334
提交评论
1个回答
答案对人有帮助,有参考价值
0
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 协议解析
通信接口:USART(TTL)
通信参数:1个起始位+8个数据位+偶校验位+2个停止位,波特率=100000bit/s,电平逻辑反转。
通信速率:每14ms(模拟模式)或7ms(高速模式)发送,即数据帧间隔为 11ms(模拟模式)或4ms(高速模式)。
数据帧格式:[1]
[tr]字节位byte1byte2-23byte24byte25[/tr]
类型开始字节通道数据字节(含16个脉宽通道)标志位字节(含2个数字通道)结束字节数据0x0F通道数据范围11Bits = [0,2047]2个数字通道位+2个状态位0x00byte1:
startbyte = 0000 1111b (0x0F)
byte2-23:
databytes = 22bytes = 22 x 8Bits = 16 x 11Bits(CH1-16)
通道数据低位在前,高位在后,每个数据取11位,具体协议如下:
读取的databyte值:
[tr]byte234567etc[/tr]
内容123456781234567812345678123456781234567812345678etc转化后的通道值:
[tr]通道CH01CH02CH03CH04etc[/tr]
内容67812345678345678123458123456781256781234567etcbyte24:
[tr]Bit76543210[/tr]
含义数字通道CH17数字通道CH18帧丢失位故障保护激活位N/AN/AN/AN/Abyte25:
endbyte = 0000 0000b (0x00)
2. 硬件设计
2.1 硬件参数
主控芯片:STM32F103VET6
接收端口:USART2(带反相电路)
S.BUS设备:walkera RX-SBUS[2](配DEVO 10遥控器)
2.2 反相电路
由于此芯片串口不带反相器,我们需要外部搭建反相电路。如果芯片串口内部带反相器,可以省略此步。反相电路设计如下图:
J1为4Pin排针,适配S.BUS接口,可5V输出为SBUS接收机供电。
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;
}
}
USART2_RX_BUF为接收缓存区,定义为26个字节,第一个字节USART2_RX_BUF[0]为接收到的字节个数,后面为接收到的数据。
USART2_RX_BUF[0]可以作为数据帧字节长度的判断。
中断服务函数具体解释请参考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
接收的byte24数据并非和协议解析中的一样,无论断开遥控器还是连接遥控器,读取的值都是0x03。
接收机只支持12个通道,所以通道13-16没有值。
读取的通道值中间值为992,最大值为1632,最小值为352。
2021-12-15 14:25:37
评论
举报
王文霞
提交评论
只有小组成员才能发言,加入小组>>