找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2792|回复: 0
打印 上一主题 下一主题
收起左侧

旁路串口驱动

[复制链接]
跳转到指定楼层
楼主
ID:51024 发表于 2014-8-3 00:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/***********************************************************************
* File Name         : ycc_uart_bypass.c
* Author            : Tangeping
* Version           : V1.0.0
* Date              : 07/3/2014
* Description       : 旁路串口配置
************************************************************************/
#define  YCC_UARTPASSBY_GLOBALS
#include "stm32f10x.h"
#include "main.h"
#include <stdio.h>
#include <string.h>

#define PASSBY_UART                                USART3
#define PASSBY_TXVALUE                        Uart3_TxValue
#define PASSBYTX_DMA_SIZE                DMA_U3TXBUF_SIZE
#define PASSBYTX_DMA_CH                        DMA1_Channel2
#define PASSBY_RXVALUE                        Uart3_RxValue
#define PASSBYRX_DMA_SIZE                DMA_U3RXBUF_SIZE
#define PASSBYRX_DMA_CH                        DMA1_Channel3
#define PASSBY_TXCOMPLETE                Uart3_TxComplete
#define PASSBY_HEAD                         0xE0;
const uint32_t BaudRate_TABLE[]={4800,9600,19200,38400,57600,115200};

typedef struct{
        u8 id;
    u8 state;
        u8 BaudRate;
        u8 len;
        u8 StopBit;
        u8 Partity;
}UART_INFO;
static UART_INFO uart_info;

#define PASSBY_ONCESIZE        PASSBYTX_DMA_SIZE-6 //最大数据长度44=50-4-2
typedef struct{
        vu8 bLength;        //长度,0为无效状态
        u8*        bptr;                //缓冲区指针
}ST_TOSLAVE_BUFFER;

typedef struct{
        vu8 bLength;                //长度,0为无效状态
        u8        bptr[PASSBY_ONCESIZE];                //缓冲区长度
}ST_TOMASTER_BUFFER;

#define SLAVE_ARRAY         32
#define MASTER_ARRAY                 (SLAVE_ARRAY*3)
static ST_TOMASTER_BUFFER  ToMasterBuf[MASTER_ARRAY]; //发送缓冲区
static u8 ToMasterWriteOffset;                                                  //由AVN转向中控
static u8 ToMasterReadOffset;

static ST_TOSLAVE_BUFFER  ToSlaveBuf[SLAVE_ARRAY]; //接收缓冲区
static u8 ToSlaveWriteOffset;                                           //由中控向外部终端发送数据
static u8 ToSlaveReadOffset;
static u8 Passby_ReadAddr;

u8 PassbyWrite_Data(u8 * data, u8 length)
{       
        u8 i,*ptr;

        if (length == 0 || length > PASSBY_ONCESIZE)
                return 2;

        ptr = (u8*)Mem_Malloc(length);
       
    if (ptr == NULL)
        {
                return 1;
        }

        if (ToSlaveBuf[ToSlaveWriteOffset].bLength == 0)
        {
                ToSlaveBuf[ToSlaveWriteOffset].bptr = ptr;
               
                for (i=0;i<length;i++)
                {
                        *ptr++ = *data++;
                }
                ToSlaveBuf[ToSlaveWriteOffset].bLength = length;
                ToSlaveWriteOffset = (++ToSlaveWriteOffset)%SLAVE_ARRAY;
                return 0;
        }
        else
        {
                Mem_Free(ptr);
        }

        return 1;
}


static void PASSBY_Config()
{
        USART_InitTypeDef USART_InitStructure;
       
        USART_InitStructure.USART_StopBits = (uart_info.StopBit > 1?USART_StopBits_2:USART_StopBits_1);                                                                          
        if(uart_info.Partity == 0)
        {
                USART_InitStructure.USART_Parity =USART_Parity_No;
                USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        }
        else
        {
                USART_InitStructure.USART_Parity =uart_info.Partity==1 ?USART_Parity_Odd:USART_Parity_Even;
                USART_InitStructure.USART_WordLength = USART_WordLength_9b;
        }
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_InitStructure.USART_BaudRate = BaudRate_TABLE[uart_info.BaudRate];
        USART_Init(PASSBY_UART, &USART_InitStructure);
       
        uart_info.state==ON ? USART_Cmd(PASSBY_UART, ENABLE):USART_Cmd(PASSBY_UART,DISABLE);
}

static void Passby_Send_Msg()//由中控向外部终端发数据
{
        if(uart_info.state==ON)
        {
            if (ToSlaveBuf[ToSlaveReadOffset].bLength > 0)//中控向外部终端发送数据
                {
                        PASSBYTX_DMA_CH->CCR &= (uint16_t)(~DMA_CCR1_EN);
                        memcpy(PASSBY_TXVALUE,ToSlaveBuf[ToSlaveReadOffset].bptr,
                                        ToSlaveBuf[ToSlaveReadOffset].bLength);
                        PASSBYTX_DMA_CH->CNDTR = ToSlaveBuf[ToSlaveReadOffset].bLength;
                        MemFree_BufWrite(ToSlaveBuf[ToSlaveReadOffset].bptr);
                        ToSlaveBuf[ToSlaveReadOffset].bLength = 0;
                        ToSlaveReadOffset = (++ToSlaveReadOffset)%SLAVE_ARRAY;
                        PASSBYTX_DMA_CH->CCR |= DMA_CCR1_EN;
                }
                else if (ToMasterBuf[ToMasterReadOffset].bLength > 0)//转发给中控的数据
                {
                        Host_Report_Event(HOST_EVENT_PASSBY_DATA,ToMasterBuf[ToMasterReadOffset].bptr,
                                                                ToMasterBuf[ToMasterReadOffset].bLength);
                        MemFree_BufWrite(ToMasterBuf[ToMasterReadOffset].bptr);
                        ToMasterBuf[ToMasterReadOffset].bLength = 0;
                        ToMasterReadOffset = (++ToMasterReadOffset)%MASTER_ARRAY;
                }
                else return;
        }
       
}

static void Passby_Receive_Msg()
{
        static u16 cndtr = 0,overtime = 0;
        u16 addr,end,i,length;
       
        end = (PASSBYRX_DMA_SIZE-PASSBYRX_DMA_CH->CNDTR)%PASSBYRX_DMA_SIZE;       

        if (cndtr != end)
        {
                cndtr = end;

                addr = Passby_ReadAddr;

                overtime = 1;
               
                if (addr > end)
                {
                        end += PASSBYRX_DMA_SIZE;
                }

                length = end - addr;
       
                if(uart_info.state==ON)
                {
                        while (length > 0)
                        {
                                for (i=0; i<length&&i<PASSBY_ONCESIZE; i++)
                                {
                                        ToMasterBuf[ToMasterWriteOffset].bptr[i]=
                                        PASSBY_RXVALUE[(addr++)%PASSBYRX_DMA_SIZE];
                                }
                                ToMasterBuf[ToMasterWriteOffset].bLength=length>PASSBY_ONCESIZE?PASSBY_ONCESIZE:length;
                                ToMasterWriteOffset = (++ToMasterWriteOffset)%MASTER_ARRAY;
                                length -= length>PASSBY_ONCESIZE?PASSBY_ONCESIZE:length;
                        }
                        Passby_ReadAddr = addr%PASSBYRX_DMA_SIZE;
                }
                else return;
        }
        else if (overtime > 0)
        {
                overtime = 0;
                Passby_ReadAddr = cndtr;
        }
}
void Passby_IT()//10m中断
{
        Passby_Receive_Msg();
        Passby_Send_Msg();
}
void UartPassby_Init()
{
        u8 i;
        memset(&uart_info,0,sizeof(uart_info));
        Passby_ReadAddr = 0;       
        memset(PASSBY_RXVALUE,NULL,sizeof(PASSBY_RXVALUE));
        PASSBY_TXCOMPLETE = ON;

        ToMasterWriteOffset = 0;
        ToMasterReadOffset = 0;
        for (i=0; i<MASTER_ARRAY; i++)
                ToMasterBuf[i].bLength = 0;
       
        ToSlaveWriteOffset = 0;
        ToSlaveReadOffset = 0;
        for (i=0; i<SLAVE_ARRAY; i++)
                ToSlaveBuf[i].bLength = 0;

        PASSBYRX_DMA_CH->CNDTR = PASSBYRX_DMA_SIZE;
        DMA_Cmd(PASSBYRX_DMA_CH, ENABLE);
        USART_Cmd(PASSBY_UART, DISABLE);

}

void Uart_Setting_Event(u8 *event, u8 length)
{
        u8 reprot=0;
        u8 buf[6];
        if(length>0)
        {
       
                if(event[1]!=uart_info.state     ||
                   event[2]!=uart_info.BaudRate  ||
                   event[3]!=uart_info.StopBit   ||
                   event[5]!=uart_info.Partity)
                {
                         uart_info.state  = event[0];
                        uart_info.BaudRate=event[1];
                        uart_info.len     =event[2];
                        uart_info.StopBit =event[3];
                        uart_info.Partity =event[4];
                        PASSBY_Config();
                        reprot=1;
                }

        }
        else reprot=1;
        if(reprot > 0)
        {
                buf[0]=uart_info.id=0;
                buf[1]=uart_info.state;
                buf[2]=uart_info.BaudRate;
                buf[3]=uart_info.len=3;
                buf[4]=uart_info.StopBit;
                buf[5]=uart_info.Partity;
                Host_Report_Event(HOST_EVENT_PASSBY_SETTING,buf,6);
        }
}

void UartPassby_Main()
{

}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表