Both_Way_Comm_SY8833/TP3310_Demo.si4project/Backup/uart(7695).c

330 lines
6.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
******************************************************************************
*
* @file uart.c
* @brief uart module
*
*
* @version 1.0
* @date 2022/12/14 15:00:40
* @author Alex Xu
*
* Copyright (c) 2013-2099,Tkplusemi Technology Co.,Ltd.
* All Rights Reserved
*
* History:
* Revision Date Author Desc
* 1.0.0 2022/12/14 Alex build this file
******************************************************************************/
/*_____ I N C L U D E S ____________________________________________________*/
#include "uart.h"
#include "system.h"
#include "vox_module.h"
#if UART0_ENABLE
/******************************************************************************\
Macro definitions
\******************************************************************************/
#define NONE_PARITY 0 //无校验
#define ODD_PARITY 1 //奇校验
#define EVEN_PARITY 2 //偶校验
#define MARK_PARITY 3 //标记校验
#define SPACE_PARITY 4 //空白校验
#define PARITYBIT EVEN_PARITY //定义校验位
/******************************************************************************\
Variables definitions
\******************************************************************************/
bit busy0;
#ifdef VOX_RX
idata uint8_t RX0_Buffer[COM0_Data_Lenth] = 0; //接收缓冲
bit Uart0_RX_Finish_Flag = 0;
#endif
#endif
#ifdef _DEBUG_ALL
char putchar(char c)
{
while(!TI0);
TI0 = 0;
return (S0BUF = c);
// Uart0SendData(c);
// return(c);
}
#endif
#if UART0_ENABLE
/*
*******************************************************************************
* void UART0_Init(void)
*
* Description : UART0 Initialization UART0用于debug、打印、透传功能
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
#if 0
void UART0_Init(void)
{
SFRADDR = MFP_CTL0;
SFRDATA &= ~0x0C;
SFRDATA |= 0x04; //P01 as UART's TX
BD = 1; //Select additional Baudrate generator
PCON |= 0x80; //Baudrate double enable
//baudrate set
S0RELH = HIBYTE(S0REL_VALUE);
S0RELL = LOBYTE(S0REL_VALUE);//s0rel=1023, baudrate = fclk/32 = 187.5k
S0CON = 0xD0; //SCON: MODE 3, 9-bit UART, RI enable, EVEN Parity
TI0 = 1;
RI0 = 1;
ES0 = 1; //Enable UART0 IRQ
}
#endif
/*
*******************************************************************************
* void Uart0SendData(uint8_t Txdata)
*
* Description : UART0 Send Data
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
#if 0
void Uart0SendData(uint8_t Txdata)
{
while(busy0);
ACC = Txdata;
if (P) //根据P来设置校验位
{
#if (PARITYBIT == ODD_PARITY)
TB80 = 0; //设置校验位为0
#elif (PARITYBIT == EVEN_PARITY)
TB80 = 1; //设置校验位为1
#endif
}
else
{
#if (PARITYBIT == ODD_PARITY)
TB80 = 1; //设置校验位为1
#elif (PARITYBIT == EVEN_PARITY)
TB80 = 0; //设置校验位为0
#endif
}
busy0 = 1;
S0BUF = ACC;
}
#endif
/*
*******************************************************************************
* void Uart0SendPacket(uint8_t Length,uint8_t *TransBuf)
*
* Description : UART0 Send Packet
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
#ifdef VOX_TX
void Uart0SendPacket(uint8_t Length,uint8_t *TransBuf)
{
uint8_t i = 0;
for(i=0;i<Length;i++)
{
//Uart0SendData(*TransBuf++);
while(busy0);
ACC = *TransBuf++;
busy0 = 1;
S0BUF = ACC;
}
}
#endif
#endif
#if UART0_ENABLE
//uint8_t RX0DataLen = 0;
//uint8_t Rx0Status = 0;
//uint8_t RX0_Cnt = 0;
#define Vox_Comm_Data_Len 5
/*uart0中断处理函数*/
void uart0_Interrupt(void) interrupt Interrupt_Vector_RI_TI
{
static uint8_t Rx0Status;
static uint8_t RX0_Cnt;
static uint8_t RX0DataLen;
/*处理UART0发送中断*/
if(TI0)
{
TI0 = 0;
busy0 = 0;
}
/*处理UART0接收中断*/
if(RI0)
{
RI0 = 0;
#if 0
RX0_Buffer[RX0_Cnt] = S0BUF;
RX0_Cnt++;
if( RX0_Cnt == Vox_Comm_Data_Len )
{
RX0DataLen = RX0_Buffer[4] + 5;
}
if( RX0DataLen == RX0_Cnt )
{
Uart0_RX_Finish_Flag = 1;
RX0_Cnt = 0;
}
#else
#ifdef VOX_RX
#ifdef QIANCHENG //岍丞
switch(Rx0Status)
{
case 0:
if(S0BUF == 0xA5)
{
Rx0Status = 1;
RX0_Cnt = 0;
RX0_Buffer[RX0_Cnt] = S0BUF;
RX0_Cnt++;
}
else
{
Rx0Status = 0;
RX0_Cnt = 0;
}
break;
case 1:
RX0_Buffer[RX0_Cnt] = S0BUF;
RX0_Buffer[RX0_Cnt] = S0BUF;
RX0_Cnt++;
if( RX0_Cnt == Vox_Comm_Data_Len )
{
RX0DataLen = RX0_Buffer[4] + 5; //获取数据长度
}
if( (RX0DataLen == RX0_Cnt) || (RX0_Cnt > COM0_Data_Lenth) ) //当接收到的data个数等于RX0DataLen这结束本次传输。
{
RX0_Cnt = 0;
Rx0Status = 0;
Uart0_RX_Finish_Flag = 1;
}
}
#elif ZHONGKELANXUN //中科蓝讯
switch(Rx0Status)
{
case 0:
if( S0BUF == (BOXHEADER >> 8) )
{
Rx0Status = 1;
RX0_Cnt = 0;
RX0_Buffer[RX0_Cnt] = S0BUF;
RX0_Cnt++;
}
else
{
Rx0Status = 0;
RX0_Cnt = 0;
}
break;
case 1:
if(S0BUF == BOXHEADER)
{
Rx0Status = 2;
RX0_Buffer[RX0_Cnt] = S0BUF;
RX0_Cnt++;
}
else
{
Rx0Status = 0;
RX0_Cnt = 0;
}
break;
case 1:
RX0_Buffer[RX0_Cnt] = S0BUF;
if(RX0DataLen == RX0_Cnt - 6)
{
RX0_Cnt = 0;
Rx0Status = 0;
Uart0_RX_Finish_Flag = 1;
}
else
{
RX0_Cnt++;
if(RX0_Cnt == 5)
{
RX0DataLen = RX0_Buffer[4]; //获取数据长度 length,length不包括Checksum
}
}
}
#endif
#endif
}
}
#endif