【分享帖】DR16&DT7遥控系统协议解析
/***************************dbus.h*****************************/
#ifndef _DBUS_H_
#define _DBUS_H_

#define DBUS_BUF_SIZE 18
/* ----------------------- RC Channel Value Definition---------------------------- */
#define CH_VALUE_MIN ((uint16_t)364 )
#define CH_VALUE_OFFSET ((uint16_t)1024 )
#define CH_VALUE_MAX ((uint16_t)1684 )
/* ----------------------- RC Switch Value Definition----------------------------- */
#define SW_UP ((uint16_t)1 )
#define SW_MID ((uint16_t)3 )
#define SW_DOWN ((uint16_t)2 )
/* ----------------------- PC Mouse Value Definition-------------------------------- */
#define MOUSE_MOVE_VALUE_MIN ((uint16_t)-32768 )
#define MOUSE_MOVE_VALUE_OFFSET ((uint16_t)0 )
#define MOUSE_MOVE_VALUE_MAX ((uint16_t)32767 )
#define MOUSE_BTN_UP ((uint8_t)0 )
#define MOUSE_BTN_DN ((uint8_t)1 )
/* ----------------------- PC Key Value Definition-------------------------------- */
#define KEY_PRESSED_OFFSET_W ((uint16_t)0x01<<0)
#define KEY_PRESSED_OFFSET_S ((uint16_t)0x01<<1)
#define KEY_PRESSED_OFFSET_A ((uint16_t)0x01<<2)
#define KEY_PRESSED_OFFSET_D ((uint16_t)0x01<<3)
#define KEY_PRESSED_OFFSET_Q ((uint16_t)0x01<<4)
#define KEY_PRESSED_OFFSET_E ((uint16_t)0x01<<5)
#define KEY_PRESSED_OFFSET_SHIFT ((uint16_t)0x01<<6)
#define KEY_PRESSED_OFFSET_CTRL ((uint16_t)0x01<<7)

typedef struct
{
struct
{
uint16_t ch0;
uint16_t ch1;
uint16_t ch2;
uint16_t ch3;
uint8_t s1;
uint8_t s2;
}rc;

struct
{
uint16_t x;
uint16_t y;
uint16_t z;
uint8_t l;
uint8_t r;
}mouse;

struct
{
uint16_t v;
}key;

uint16_t res;

}DBUS;

void DBUS_Enc(const DBUS* pdbus,unsigned char* pbuf);
void DBUS_Dec(DBUS* pdbus,const unsigned char* pbuf);

#endif

/***************************dbus.c*****************************/
#include "main.h"

void DBUS_Enc(const DBUS* pdbus,unsigned char* pbuf)
{
pbuf[0] = pdbus->rc.ch0&0xff;
pbuf[1] = (pdbus->rc.ch1<<3) | (pdbus->rc.ch0>>8);
pbuf[2] = (pdbus->rc.ch2<<6) | (pdbus->rc.ch1>>5);
pbuf[3] = pdbus->rc.ch2;
pbuf[4] = (pdbus->rc.ch3<<1) | (pdbus->rc.ch2>>10);
pbuf[5] = (pdbus->rc.s2<<6) | (pdbus->rc.s1<<4) | (pdbus->rc.ch3>>7);
pbuf[6] = pdbus->mouse.x;
pbuf[7] = pdbus->mouse.x>>8;
pbuf[8] = pdbus->mouse.y;
pbuf[9] = pdbus->mouse.y>>8;
pbuf[10] = pdbus->mouse.z;
pbuf[11] = pdbus->mouse.z>>8;
pbuf[12] = pdbus->mouse.l;
pbuf[13] = pdbus->mouse.r;
pbuf[14] = pdbus->key.v;
pbuf[15] = pdbus->key.v>>8;
pbuf[16] = pdbus->res;
pbuf[17] = pdbus->res>>8;
}

void DBUS_Dec(DBUS* pdbus,const unsigned char* pbuf)
{
pdbus->rc.ch0 = (pbuf[0] | (pbuf[1] << 8)) & 0x07ff; //!< Channel 0
pdbus->rc.ch1 = ((pbuf[1] >> 3) | (pbuf[2] << 5)) & 0x07ff; //!< Channel 1
pdbus->rc.ch2 = ((pbuf[2] >> 6) | (pbuf[3] << 2) | //!< Channel 2
(pbuf[4] << 10)) & 0x07ff;
pdbus->rc.ch3 = ((pbuf[4] >> 1) | (pbuf[5] << 7)) & 0x07ff; //!< Channel 3
pdbus->rc.s1 = ((pbuf[5] >> 4) & 0x000C) >> 2; //!< Switch left
pdbus->rc.s2 = ((pbuf[5] >> 4) & 0x0003); //!< Switch right
pdbus->mouse.x = pbuf[6] | (pbuf[7] << 8); //!< Mouse X axis
pdbus->mouse.y = pbuf[8] | (pbuf[9] << 8); //!< Mouse Y axis
pdbus->mouse.z = pbuf[10] | (pbuf[11] << 8); //!< Mouse Z axis
pdbus->mouse.l = pbuf[12]; //!< Mouse Left Is Press ?
pdbus->mouse.r = pbuf[13]; //!< Mouse Right Is Press ?
pdbus->key.v = pbuf[14] | (pbuf[15] << 8); //!< KeyBoard value
pdbus->res = pbuf[16] | (pbuf[17] << 8); //!< Reserve
}

/***************************usart1.c*****************************/
#include "main.h"

/*-----USART1_RX-----PB7----*/
//for D-BUS

unsigned char dbus_buf[DBUS_BUF_SIZE];

void USART1_Config(void)
{
USART_InitTypeDef usart1;
GPIO_InitTypeDef gpio;
NVIC_InitTypeDef nvic;
DMA_InitTypeDef dma;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

GPIO_PinAFConfig(GPIOB,GPIO_PinSource7 ,GPIO_AF_USART1);

gpio.GPIO_Pin = GPIO_Pin_7 ;
gpio.GPIO_Mode = GPIO_Mode_AF;
gpio.GPIO_OType = GPIO_OType_PP;
gpio.GPIO_Speed = GPIO_Speed_100MHz;
gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB,&gpio);

USART_DeInit(USART1);
usart1.USART_BaudRate = 100000; //SBUS 100K baudrate
usart1.USART_WordLength = USART_WordLength_8b;
usart1.USART_StopBits = USART_StopBits_1;
usart1.USART_Parity = USART_Parity_Even;
usart1.USART_Mode = USART_Mode_Rx;
usart1.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART1,&usart1);

USART_Cmd(USART1,ENABLE);
USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);

nvic.NVIC_IRQChannel = DMA2_Stream5_IRQn;
nvic.NVIC_IRQChannelPreemptionPriority = 0;
nvic.NVIC_IRQChannelSubPriority = 1;
nvic.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic);

DMA_DeInit(DMA2_Stream5);
dma.DMA_Channel= DMA_Channel_4;
dma.DMA_PeripheralBaseAddr = (u32)&(USART1->DR);
dma.DMA_Memory0BaseAddr = (u32)dbus_buf;
dma.DMA_DIR = DMA_DIR_PeripheralToMemory;
dma.DMA_BufferSize = DBUS_BUF_SIZE;
dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
dma.DMA_MemoryInc = DMA_MemoryInc_Enable;
dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
dma.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
dma.DMA_Mode = DMA_Mode_Circular;
dma.DMA_Priority = DMA_Priority_VeryHigh;
dma.DMA_FIFOMode = DMA_FIFOMode_Disable;
dma.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
dma.DMA_MemoryBurst = DMA_Mode_Normal;
dma.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA2_Stream5,&dma);

DMA_ITConfig(DMA2_Stream5,DMA_IT_TC,ENABLE);
DMA_Cmd(DMA2_Stream5,ENABLE);
}

void DMA2_Stream5_IRQHandler(void)
{
if(DMA_GetITStatus(DMA2_Stream5, DMA_IT_TCIF5))
{

DMA_ClearFlag(DMA2_Stream5, DMA_FLAG_TCIF5);
DMA_ClearITPendingBit(DMA2_Stream5, DMA_IT_TCIF5);

/*******************decode DBUS data*******************/
DBUS_Dec(&dbus,dbus_buf);

}
}


注意:我用的是步兵车的T型板,DR16接收机接入的硬件接口对应的USART通道为USART1

IMG_20160312_201442.jpg




遥控器控制协议V1.4.pdf

请问这篇文章对你有用吗?
【分享帖】DR16&DT7遥控系统协议解析
所有评论
暂无更多
暂无更多
关于作者
mobangjack
mobangjack
0 关注Ta
0 文章
0 经验值
0 获赞