📄 serial.c
字号:
//=====================================================================
// TEXAS INSTRUMENTS INCORPORATED PROPRIETARY INFORMATION
// Property of Texas Instruments -- For Unrestricted Internal Use Only
// Unauthorized reproduction and/or distribution is strictly prohibited
// This product is protected under copyright law and trade secret law as
// an unpublished work.Created 1987,(C) Copyright 1997 Texas Instruments.
// All rights reserved.
//=====================================================================
#include "serial.h"
#include "helen_conf.h"
#include "uartirda.h"
#include "ulpd.h"
#include "global_types.h"
SERIAL_Uart_t UartSerialType ;
BOOL uart48Mhz = False;
//===============================================
char SERI_toupper(char car)
{
if ((car >= 'a') && (car <= 'z'))
{
return(car - 0x20);
}
return(car);
}
void SERI_WaitEmptyTransmit(void)
{
if (UartSerialType != SERIAL_UART_IRDA)
{
// wait till no more data in fifos
while (UMOD_IsTransmitAndHoldRegNotEmpty(UartSerialType)) ;
}
else
while (UIRD_IsTransmitAndHoldRegNotEmpty()) ;
}
//===============================================
void SERI_Sendchar(char car)
{
if (UartSerialType != SERIAL_UART_IRDA)
{
// wait for Tx register empty
while ( UMOD_TxFifoIsFull(UartSerialType) ) ;
UMOD_Send((UWORD8) car, UartSerialType);
}
else
{
while ( UIRD_TxFifoIsFull() ) ;
UIRD_Send((UWORD8) car);
}
}
//===============================================
BOOL SERI_Keypressed(void)
{
if (UartSerialType != SERIAL_UART_IRDA)
return(UMOD_RxFifoIsNotEmpty(UartSerialType));
else
return(UIRD_RxFifoIsNotEmptyUartMode());
}
//===============================================
char SERI_Getchar(void)
{
if (UartSerialType != SERIAL_UART_IRDA)
{
// wait for one byte received
while (!UMOD_RxFifoIsNotEmpty(UartSerialType)) ;
// read and return byte
return((char) UMOD_Read(UartSerialType));
}
else
{
while (!UIRD_RxFifoIsNotEmptyUartMode()) ;
return((char) UIRD_Read());
}
}
//===============================================
void SERI_Send(char string[])
{
UWORD32 i;
//volatile UWORD32 j;
for (i=0 ; i < strlen(string);i++)
{
SERI_Sendchar(string[i]);
}
}
//===============================================
// convert a string which is representing an hexa number to a UWORD32
UWORD32 SERI_HexaToInt(char * string)
{
UWORD32 base,val,i;
val = 0;
base = 1;
for (i=strlen(string); i>0; i--)
{
if ((string[i-1]>='A') && (string[i-1]<='F'))
val += base * (string[i-1] - 'A' +10);
if ((string[i-1]>='0') && (string[i-1]<='9'))
val += base * (string[i-1] - '0');
base = base *16;
}
return(val);
}
//===============================================
UWORD32 SERI_GetHexNum(UWORD8 nb_digit)
{
char st_num[80+1];
char car;
UWORD32 val,i;
car = '\0';
i=0;
while ((car != '\n') && (i != nb_digit))
{
car=SERI_Getchar();
// backspace
if ((car == '\b') && (i>0))
{
SERI_Sendchar(car);
i--;
}
else
{
// upcase car
car= SERI_toupper(car);
if (((car >='0') && (car <= '9')) || ((car>='A') && (car<='F')))
{
// perform echo
SERI_Sendchar(car);
st_num[i]=car;
i++;
}
}
}
// insert terminator at the end of the string
st_num[i]='\0';
// convert hexa string into number
val = SERI_HexaToInt(st_num);
return(val);
}
//===============================================
UWORD32 SERI_GetNum(UWORD8 nb_digit)
{
char st_num[80+1];
char car;
UWORD32 val,i;
car = '\0';
i=0;
while ((car != '\n') && (i != nb_digit))
{
car=SERI_Getchar();
if (car == '\b')
SERI_Sendchar(car);
if ((car >='0') && (car <= '9'))
{
SERI_Sendchar(car);
st_num[i]=car;
i++;
}
}
// insert terminator at the end of the string
st_num[i]='\0';
val = atoi(st_num);
return(val);
}
//===============================================
void SERI_Receive(char * string, const UWORD32 nb_char)
{
UWORD32 i;
i =0;
while (i < nb_char)
{
string[i]= SERI_Getchar();
i++;
}//endwhile
string[i] = '\0';
}
void SERI_AutoCtsEnable()
{
if (UartSerialType != SERIAL_UART_IRDA)
{
UMOD_InitEfr(UARTMOD_RX_NO_FLOW,
UARTMOD_TX_NO_FLOW,
UARTMOD_DISABLE_WRITE_IER,
UARTMOD_DISABLE_SPECIAL_CHAR_DETECT,
UARTMOD_DISABLE_AUTO_RTS,
UARTMOD_ENABLE_AUTO_CTS,
UartSerialType);
}
else
{
UIRD_InitEfr(UARTIRDA_RX_NO_FLOW,
UARTIRDA_TX_NO_FLOW,
UARTIRDA_DISABLE_WRITE_IER,
UARTIRDA_DISABLE_SPECIAL_CHAR_DETECT,
UARTIRDA_DISABLE_AUTO_RTS,
UARTIRDA_ENABLE_AUTO_CTS);
}
}
void SERI_ChangeBaudRate(void)
{
UWORD32 val;
UWORD8 DLL_High ;
UWORD8 DLL_Low ;
UWORD16 BaudRate,Rate_value ;
val = 1;
while (val!=0)
{
SERI_Send("\n\r");
SERI_Send("********************\n\r");
SERI_Send("* Select Baud rate *\n\r");
SERI_Send("********************\n\r");
SERI_Send("\n\r");
SERI_Send("00: return\n\r");
SERI_Send("01: 110\n\r");
SERI_Send("02: 300\n\r");
SERI_Send("03: 600\n\r");
SERI_Send("04: 1200\n\r");
SERI_Send("05: 2400\n\r");
SERI_Send("06: 4800\n\r");
SERI_Send("07: 7200\n\r");
SERI_Send("08: 9600\n\r");
SERI_Send("09: 19200\n\r");
SERI_Send("10: 38400\n\r");
SERI_Send("11: 57600\n\r");
SERI_Send("12: 115200\n\r");
SERI_Send("Enter your choice : ");
val=SERI_GetNum(2);
SERI_Send("\n\r");
switch (val)
{
case 0 : break;
case 1: BaudRate= UART_BAUD(110);
break;
case 2: BaudRate= UART_BAUD(300);
break;
case 3: BaudRate= UART_BAUD(600);
break;
case 4: BaudRate= UART_BAUD(1200);
break;
case 5: BaudRate= UART_BAUD(2400);
break;
case 6: BaudRate= UART_BAUD(4800);
break;
case 7: BaudRate= UART_BAUD(7200);
break;
case 8: BaudRate= UART_BAUD(9600);
break;
case 9: BaudRate= UART_BAUD(19200);
break;
case 10: BaudRate= UART_BAUD(38400);
break;
case 11: BaudRate= UART_BAUD(57600);
break;
case 12: BaudRate= UART_BAUD(115200);
break;
}
if (val!=0)
{
if (UartSerialType != SERIAL_UART_IRDA)
{
//Set the UART Modem latch in 6.5 divisor
if (UartSerialType != UART_EVALUATION)
{
UARTMOD_OSC_REG(UartSerialType)=1;
Rate_value = (UWORD16) BaudRate;
}
else
Rate_value = (UWORD16) (BaudRate*6.5);
if (uart48Mhz)
Rate_value = Rate_value *4;
// Set DLL and DLH
DLL_High = (UWORD8) Rate_value >> 8;
DLL_Low = (UWORD8) Rate_value & 0xFF;
UMOD_InitDivLatch(DLL_Low, DLL_High, UartSerialType);
}
else
{
UARTIRDA_OSC_REG=1;
Rate_value = (UWORD16) BaudRate;
if (uart48Mhz)
Rate_value = Rate_value *4;
// Set DLL and DLH
DLL_High = (UWORD8) Rate_value >> 8;
DLL_Low = (UWORD8) Rate_value & 0xFF;
UIRD_InitDivLatch(DLL_Low, DLL_High);
}
}
}
}
/*
------------------------------------------------------------------------
NAME : SERI_Configure
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -