⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial.c

📁 OMAP1030 处理器的ARM 侧硬件测试代码 OMAP1030 是TI的双核处理器
💻 C
📖 第 1 页 / 共 2 页
字号:
//=====================================================================
//       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 + -