【分享帖】DR16&DT7遥控系统协议解析
33829
0
11
2016-03-12
/***************************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->c.ch0&0xff;
pbuf[1] = (pdbus->c.ch1<<3) | (pdbus->rc.ch0>8);
pbuf[2] = (pdbus->c.ch2<<6) | (pdbus->rc.ch1>5);
pbuf[3] = pdbus->c.ch2;
pbuf[4] = (pdbus->c.ch3<<1) | (pdbus->rc.ch2>10);
pbuf[5] = (pdbus->c.s2<<6) | (pdbus->rc.s1<<4) | (pdbus->rc.ch3>7);
pbuf[6] = pdbus->ouse.x;
pbuf[7] = pdbus->ouse.x>8;
pbuf[8] = pdbus->ouse.y;
pbuf[9] = pdbus->ouse.y>8;
pbuf[10] = pdbus->ouse.z;
pbuf[11] = pdbus->ouse.z>8;
pbuf[12] = pdbus->ouse.l;
pbuf[13] = pdbus->ouse.r;
pbuf[14] = pdbus->ey.v;
pbuf[15] = pdbus->ey.v>8;
pbuf[16] = pdbus->es;
pbuf[17] = pdbus->es>8;
}
void DBUS_Dec(DBUS* pdbus,const unsigned char* pbuf)
{
pdbus->c.ch0 = (pbuf[0] | (pbuf[1] << 8)) & 0x07ff; //!< Channel 0
pdbus->c.ch1 = ((pbuf[1] > 3) | (pbuf[2] << 5)) & 0x07ff; //!< Channel 1
pdbus->c.ch2 = ((pbuf[2] > 6) | (pbuf[3] << 2) | //!< Channel 2
(pbuf[4] << 10)) & 0x07ff;
pdbus->c.ch3 = ((pbuf[4] > 1) | (pbuf[5] << 7)) & 0x07ff; //!< Channel 3
pdbus->c.s1 = ((pbuf[5] > 4) & 0x000C) > 2; //!< Switch left
pdbus->c.s2 = ((pbuf[5] > 4) & 0x0003); //!< Switch right
pdbus->ouse.x = pbuf[6] | (pbuf[7] << 8); //!< Mouse X axis
pdbus->ouse.y = pbuf[8] | (pbuf[9] << 8); //!< Mouse Y axis
pdbus->ouse.z = pbuf[10] | (pbuf[11] << 8); //!< Mouse Z axis
pdbus->ouse.l = pbuf[12]; //!< Mouse Left Is Press ?
pdbus->ouse.r = pbuf[13]; //!< Mouse Right Is Press ?
pdbus->ey.v = pbuf[14] | (pbuf[15] << 8); //!< KeyBoard value
pdbus->es = 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->R);
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
#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->c.ch0&0xff;
pbuf[1] = (pdbus->c.ch1<<3) | (pdbus->rc.ch0>8);
pbuf[2] = (pdbus->c.ch2<<6) | (pdbus->rc.ch1>5);
pbuf[3] = pdbus->c.ch2;
pbuf[4] = (pdbus->c.ch3<<1) | (pdbus->rc.ch2>10);
pbuf[5] = (pdbus->c.s2<<6) | (pdbus->rc.s1<<4) | (pdbus->rc.ch3>7);
pbuf[6] = pdbus->ouse.x;
pbuf[7] = pdbus->ouse.x>8;
pbuf[8] = pdbus->ouse.y;
pbuf[9] = pdbus->ouse.y>8;
pbuf[10] = pdbus->ouse.z;
pbuf[11] = pdbus->ouse.z>8;
pbuf[12] = pdbus->ouse.l;
pbuf[13] = pdbus->ouse.r;
pbuf[14] = pdbus->ey.v;
pbuf[15] = pdbus->ey.v>8;
pbuf[16] = pdbus->es;
pbuf[17] = pdbus->es>8;
}
void DBUS_Dec(DBUS* pdbus,const unsigned char* pbuf)
{
pdbus->c.ch0 = (pbuf[0] | (pbuf[1] << 8)) & 0x07ff; //!< Channel 0
pdbus->c.ch1 = ((pbuf[1] > 3) | (pbuf[2] << 5)) & 0x07ff; //!< Channel 1
pdbus->c.ch2 = ((pbuf[2] > 6) | (pbuf[3] << 2) | //!< Channel 2
(pbuf[4] << 10)) & 0x07ff;
pdbus->c.ch3 = ((pbuf[4] > 1) | (pbuf[5] << 7)) & 0x07ff; //!< Channel 3
pdbus->c.s1 = ((pbuf[5] > 4) & 0x000C) > 2; //!< Switch left
pdbus->c.s2 = ((pbuf[5] > 4) & 0x0003); //!< Switch right
pdbus->ouse.x = pbuf[6] | (pbuf[7] << 8); //!< Mouse X axis
pdbus->ouse.y = pbuf[8] | (pbuf[9] << 8); //!< Mouse Y axis
pdbus->ouse.z = pbuf[10] | (pbuf[11] << 8); //!< Mouse Z axis
pdbus->ouse.l = pbuf[12]; //!< Mouse Left Is Press ?
pdbus->ouse.r = pbuf[13]; //!< Mouse Right Is Press ?
pdbus->ey.v = pbuf[14] | (pbuf[15] << 8); //!< KeyBoard value
pdbus->es = 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->R);
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
文章标签
请问这篇文章对你有用吗?
【分享帖】DR16&DT7遥控系统协议解析