SY8837_Demo_For_OurSelf/UsrSrc/uart/uart.c
rb_peng c743af0aa6 1、将双向通信的具体场景提到vox_Comm_Handle函数中
2、增加VOX持续输出0V以唤醒耳机的情况;
3、解决超长按后,双向通讯一直发码的问题;(松开按键后Key_Press_ll_irq设为FALSE)
4、解决关盖上电时,不亮灯和不发码的问题(即把Hall_Sta_bk初始化);
5、长按发配对码时,主副耳的选择提取到config.h中;
2025-02-21 17:24:44 +08:00

420 lines
7.6 KiB
C
Raw 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
* @ic sy8837/8
*
* @version 1.0
* @date 2024/11/01 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 2024/11/01 Alex build this file
******************************************************************************/
/*_____ I N C L U D E S ____________________________________________________*/
#include "uart.h"
#include "system.h"
#include "vox_module.h"
#include "sleep.h"
#include "vox_comm.h"
/******************************************************************************\
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
#if 0
idata uint8_t RX0_Buffer[COM0_Data_Lenth] = 0; //½ÓÊÕ»º³å
bit Uart0_RX_Finish_Flag = 0;
#endif
#if UART1_ENABLE
idata uint8_t RX1_Buffer[COM1_Data_Lenth]; //½ÓÊÕ»º³å
bit Uart1_RX_Finish_Flag;
#endif
#endif
#ifdef _DEBUG_ALL
char putchar(char c)
{
#if 0
while(!TI0);
TI0 = 0;
return (S0BUF = c);
#else
Uart0SendData(c);
return(c);
#endif
}
/*
*******************************************************************************
* void Uart1SendData(uint8_t Txdata)
*
* Description : UART1 Send Data
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
void Uart0SendData(uint8_t Txdata)
{
while(busy0);
busy0 = 1;
S0BUF = Txdata;
}
#endif
#ifdef UART0_ENABLE
/*
*******************************************************************************
* void UART0_Init(void)
*
* Description : UART0 Initialization UART0ÓÃÓÚdebug¡¢´òÓ¡¡¢Í¸´«¹¦ÄÜ
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
void UART0_Init(void)
{
SFRADDR = MFP_CTL0; //Set P01 As TX.
SFRDATA &=~ 0x0C;
SFRDATA |= 0x04;
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 = 0x52; //SCON: MODE 1, 8-bit UART, RI enable
ES0 = 1; //Enable UART0 IRQ
}
/*
*******************************************************************************
* void Uart0SendPacket(uint8_t Length,uint8_t *TransBuf)
*
* Description : UART0 Send Packet
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
#if 0
void Uart0SendPacket(uint16_t Length,uint8_t *TransBuf)
{
uint8_t i = 0;
for(i=0;i<Length;i++)
{
while(busy0);
busy0 = 1;
S0BUF = *TransBuf++;
}
}
#endif
/*uart0Öжϴ¦Àíº¯Êý*/
void uart0_Interrupt(void) interrupt Interrupt_Vector_RI_TI
{
/*´¦ÀíUART0·¢ËÍÖжÏ*/
if(TI0)
{
TI0 = 0;
busy0 = FALSE;
}
/*´¦ÀíUART0½ÓÊÕÖжÏ*/
if(RI0)
{
RI0 = 0;
}
}
#endif
#if UART1_ENABLE
bit busy1;
/*
*******************************************************************************
* void UART1_Init(void)
*
* Description : UART1 Initialization UART1ÓÃÓÚVOXͨѶ¹¦ÄÜ
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
void UART1_Init(void)
{
//baudrate set
S1RELH = HIBYTE(S1REL_VALUE);
S1RELL = LOBYTE(S1REL_VALUE);//s1rel=1023, baudrate = fclk/32 = 187.5k
S1CON = 0x92; //S1CON: 8-bit UART1,REN1 ¡¢ RI1 ¡¢TI1 enable
IEN2 |= 1; //Enable UART1 IRQ
}
/*
*******************************************************************************
* void Uart1SendPacket(uint16_t Length,uint8_t *TransBuf)
*
* Description : UART1 Send Packet
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
void Uart1SendPacket(uint16_t Length,uint8_t *TransBuf)
{
uint8_t i = 0;
for(i=0;i<Length;i++)
{
while(busy1);
//ACC = *TransBuf++;
busy1 = TRUE;
S1BUF = *TransBuf++;
}
}
/*
*******************************************************************************
* void Uart1SendString(char *s)
*
* Description : UART1 Send String
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
#if 0
void Uart1SendString(char *s)
{
while(*s) //¼ì²â×Ö·û´®½áÊø±êÖ¾
{
Uart1SendData(*s++); //·¢Ë͵±Ç°×Ö·û
}
}
#endif
uint8_t Rx1Status;
uint8_t RX1_Cnt;
#if XUANHENG
uint16_t RX1DataLen;
#endif
#define Vox_Comm_JL_HEADER_DATA_LEN 4
#define Vox_Comm_ZK_HEADER_DATA_LEN 6
#define Vox_Comm_XH_HEADER_DATA_LEN 7
/*uart1Öжϴ¦Àíº¯Êý*/
void uart1_Interrupt(void) interrupt Interrupt_Vector_RI1_TI1
{
/*´¦ÀíUART1·¢ËÍÖжÏ*/
if(S1CON & 0x02) //TI1 = 1
{
S1CON &= ~0x02; //TI1 = 0
busy1 = FALSE;
}
/*´¦ÀíUART1½ÓÊÕÖжÏ*/
if(S1CON & 0x01) //RI1 = 1
{
S1CON &= ~0x01;
#if SLEEP_ENABLE
Enter_Sleep_Cnt_Restart_Flag = TRUE;
#endif
#ifdef VOX_RX
#if XUANHENG
switch(Rx1Status)
{
case 0:
if( S1BUF == BOXHEADER )
{
Rx1Status = 1;
RX1_Cnt = 0;
RX1_Buffer[RX1_Cnt++] = S1BUF;
}
else
{
Rx1Status = 0;
RX1_Cnt = 0;
}
break;
case 1:
RX1_Buffer[RX1_Cnt++] = S1BUF;
if( RX1_Cnt == Vox_Comm_XH_HEADER_DATA_LEN )
{
RX1DataLen = RX1_Buffer[5] | (RX1_Buffer[6] << 8) + 9; //»ñÈ¡Êý¾Ý³¤¶È£¬Headr(1Byte) + Trandsmit Dir(1Byte) + CMD(2Bytes) + datalen(2Bytes) + CRC16(2Bytes)
}
if( (RX1DataLen == RX1_Cnt) || (RX1_Cnt > COM1_Data_Lenth) ) //µ±½ÓÊÕµ½µÄdata¸öÊýµÈÓÚRX0DataLen£¬Õâ½áÊø±¾´Î´«Êä¡£
{
RX1_Cnt = 0;
Rx1Status = 0;
Uart1_RX_Finish_Flag = TRUE;
}
}
#else
switch(Rx1Status)
{
case 0:
if( S1BUF == EARPHONE_HEADER_HIGH )
{
Rx1Status = 1;
RX1_Cnt = 0;
RX1_Buffer[RX1_Cnt++] = S1BUF;
}
else
{
Rx1Status = 0;
RX1_Cnt = 0;
}
break;
case 1:
if( S1BUF == EARPHONE_HEADER_LOW )
{
Rx1Status = 2;
RX1_Buffer[RX1_Cnt++] = S1BUF;
}
else
{
Rx1Status = 0;
RX1_Cnt = 0;
}
break;
case 2:
{
RX1_Buffer[RX1_Cnt++] = S1BUF;
#if JIELI
if ( ( RX1_Cnt >= ( RX1_Buffer[2] + Vox_Comm_JL_HEADER_DATA_LEN ) ) || ( RX1_Cnt > COM1_Data_Lenth ) )
#elif ZHONGKE
if ( ( RX1_Cnt >= ( RX1_Buffer[4] + Vox_Comm_ZK_HEADER_DATA_LEN ) ) || ( RX1_Cnt > COM1_Data_Lenth ) )
#endif
{
RX1_Cnt = 0;
Rx1Status = 0;
Uart1_RX_Finish_Flag = TRUE;
}
}
break;
default:
break;
}
#endif
#endif
}
}
#endif