/* ****************************************************************************** * * @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 //定义校验位 #define Baud_Rate0 115200//19200//38400//93750 #define S0REL_VALUE (1024-375000/Baud_Rate0) /******************************************************************************\ Variables definitions \******************************************************************************/ bit busy0; #if 0 uint8_t RX0_Buffer[COM0_Data_Lenth] = 0; //接收缓冲 uint8_t Rx0Status = 0; uint8_t RX0_Cnt = 0; uint8_t RX0DataLen = 0; #endif #endif #ifdef TEST_MODE uint8_t gFun_Select_Type = 0; //功能选择位,8个bit表示8个子功能的使能配置位,1:Enable;0:Disable。bit7:188数码管显示;bit6:透传功能;bit5:休眠唤醒功能;bit4:PWM功能; //bit3:VOX双向通信(uart模式);bit2:Vox双向通信Reg模式RX功能使能;bit1:边充边放功能; #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 * ******************************************************************************* */ void UART0_Init(void) { SFRADDR = MFP_CTL0; SFRDATA &= ~0x0F; SFRDATA |= 0x05; //P01 as UART's TX ;P00 as UART's RX 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 #ifdef _DEBUG_ALL /* ******************************************************************************* * void Uart0SendData(uint8_t Txdata) * * Description : UART0 Send Data * * Arguments : NONE * Returns : NONE * Notes : NONE * ******************************************************************************* */ 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 #if 0 /* ******************************************************************************* * void Uart0SendPacket(uint8_t Length,uint8_t *TransBuf) * * Description : UART0 Send Packet * * Arguments : NONE * Returns : NONE * Notes : NONE * ******************************************************************************* */ void Uart0SendPacket(uint8_t Length,uint8_t *TransBuf) { uint8_t i = 0; for(i=0;i '9' ? (*s++)+9 : (*s++)) << 4 ) | ( (*s > '9' ? (*s++)+9 : (*s++)) & 0x0F ); } } /* ******************************************************************************* * void Uart0_RX_Handle(uint8_t *RxBuff,uint8_t Rx_Len) * * Description : UART1接收处理函数。�?�过解析字符串处理相关参数�?? * * * Arguments : uint8_t *RxBuff,uint8_t Rx_Len * Returns : * * Notes : * ******************************************************************************* */ void Uart0_RX_Handle(uint8_t *RxBuff) { char *Token = NULL; const char delim[5] = "\r\n"; char PMU_Addr = 0; char RX_data = 0; /* 获取第一个子字符�? */ Token = strtok((char *)RxBuff, delim); //通过字符�?"\r\n"分解uart结束到的数据 /* 继续获取其他的子字符�? */ while( Token != NULL ) { // printf( "* %s *\r\n", Token ); if(strncmp(Token,"Config Set:",strlen("Config Set:")) == 0) { from_hex(&Token[strlen("Config Set:0x")],2,&RX_data); //获取字符串中的Config命令,RX_data的8个bit位表示8个子功能的配置位。 if(RX_data & 0x80) //bit7:188数码管显示使能,动态显示几个数字 { gFun_Select_Type |= 0x80; } if(RX_data & 0x40) //bit6:透传功能使能 { gFun_Select_Type |= 0x40; } if(RX_data & 0x20) //bit5:休眠唤醒功能使能 { gFun_Select_Type |= 0x20; } if(RX_data & 0x10) //bit4:PWM功能使能 { gFun_Select_Type |= 0x10; } if(RX_data & 0x08) //bit3:VOX 双向通信(Uart)功能使能 { gFun_Select_Type |= 0x08; } if(RX_data & 0x04) //bit2:VOX 双向通信Reg模式RX功能使能 { gFun_Select_Type |= 0x04; } if(RX_data & 0x02) //bit1:边充边放功能使能 { gFun_Select_Type |= 0x02; } if(RX_data & 0x01) // { gFun_Select_Type |= 0x01; } } Token = strtok(NULL, delim); } } #endif #if UART0_ENABLE /*uart0中断处理函数*/ void uart0_Interrupt(void) interrupt Interrupt_Vector_RI_TI { uint16_t CrcCheckSum = 0; /*处理UART0发送中断*/ if(TI0) { TI0 = 0; busy0 = 0; } /*处理UART0接收中断,透传开关功能协议监听。*/ if(RI0) { RI0 = 0; } } #endif