SBUS協議

【轉】飛控信號SBUS信號解析為PWM信號輸出

【轉】SBUS協議:SBUS解析與合成

【轉】STM32 Futaba SBUS協議解析

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]

字節位 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 硬件參數

主控芯片: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);
}

赞(0)