/***********************************************************************
* 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()
{
}
|