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

📄 uart.c

📁 在CCS开发环境下的DSP 5502的UART控制框架程序
💻 C
字号:
/********************************************************************************/
/*	Filename:	uart.c															*/
/*	Function:	Define uart transfer and receiver functions 					*/
/********************************************************************************/

#include "UART.h"
#include "type.h"
#include <csl_gpt.h>

extern GPT_Handle 	 hGpt;
extern unsigned short int Counter;
unsigned int Delay_Factor;
HANDLE UartChannel;
unsigned int *SendDataPtr;

/******************************************************************************/
/* delay() - 延时一段时间							  						  */
/*                                                                            */
/* 参数:                                                            		  */
/*      	无  								          					  */
/*                                                                            */
/* 返回值: 无																  */
/*                                                                            */
/******************************************************************************/

extern void delay(void)
{
    unsigned int i;
 	for(i=0;i<7;i++)
  	{
  		asm(" NOP");
  	}
}

/******************************************************************************/
/* uart_open() - 打开相应的异步串口,获得有效的句柄							  */
/*                                                                            */
/* 参数:                                                            		  */
/*     uart:选择要打开的异步串口   								          */
/*                                                                            */
/* 返回值: 对应的有效句柄  					                              */
/*			当返回值为0xFFFF时,为无效句柄                                    */
/*                                                                            */
/******************************************************************************/

extern HANDLE uart_open(UartId uart)
{
	int data_return;
	if(uart == 0)
	{
		data_return = 0x10;		// Uart A
		return (HANDLE) data_return;
	}
	if(uart == 1)
	{
		data_return = 0x18;		// Uart B
		
		SYSCNTL1 = 0x10;		// 选择外扩的UART B
		delay();
		
		return (HANDLE) data_return;
	}
	data_return = 0xFFFF;
	return (HANDLE) data_return;
}

/********************************************************************************/
/*																				*/
/* 函数定义:	unsigned int _uart_write_reg(HANDLE channel, unsignedint reg,unsigned int regdata)   	*/
/* 功    能:	串口初始化													    */																				
/* 入口参数:																	*/
/*		  		---- channel:串口A或是串口B										*/
/* 出口参数:	无																*/	       												        
/*																				*/
/********************************************************************************/
extern unsigned int uart_write_reg(HANDLE channel, unsigned int reg,unsigned int regdata)
{
	if((unsigned long int)channel == 0x10)			// a path
		{
			(*(volatile unsigned int *)(chanel_a+reg)) = regdata;
			delay();
		}
	else											// b path
		{
			(*(volatile unsigned int *)(chanel_b+reg)) = regdata;
			delay();
		}
	return(OK);
}

/******************************************************************************/
/* uart_read_reg - 读取串口控制寄存器							  			  */
/*                                                                            */
/* 参数:                                                            		  */
/*     channel:	选择要打开的异步串口 										  */
/*	   reg	  :	寄存器的相对地址											  */  								          
/*                                                                            */
/* 返回值:		所对应的寄存器值 				                              */
/*			                                    							  */
/*                                                                            */
/******************************************************************************/

extern unsigned int uart_read_reg(HANDLE channel, unsigned int reg)
{
	unsigned int RegValue;
	if((unsigned long int)channel == 0x10)		// a path
		{
			RegValue = (*(volatile unsigned int *)(chanel_a+reg));
		}
	else										// b path
		{
			RegValue = (*(volatile unsigned int *)(chanel_b+reg));
		}
	return (RegValue);
}
/******************************************************************************/
/* uart_setup() - 设置串口通讯的状态,并设置其各寄存器默认值	  			   	  */
/*                                                                            */
/* 参数:                                                            		  */
/*     Channel:		有效的串口句柄                                        */
/*	   UartBaud:		设置串口的波待率                                      */
/*	   UartWordLen:		设置字长                                              */
/*	   UartStopBits:	设置停止位                                            */ 
/*	   UartParity:		设置较验位                                            */
/*	   UartFifoControl:设置FIFO的状态                                        */
/*	   UartLoopway: 	是否进行自闭环测试                                    */
/*                                                                            */
/* 返回值:  - 无 								                              */
/*                                                                            */
/******************************************************************************/
extern void uart_setup(HANDLE Channel, 
				unsigned int UartBaud, 
				unsigned int UartWordLen, 
				unsigned int UartStopBits, 
				unsigned int UartParity, 
				unsigned int UartFifoControl, 
				unsigned int UartLoopway)
{
	unsigned int baudrateh,baudratel;
	unsigned int uartdata;

	/* 确定延时系数 */
	Delay_Factor = UartBaud;
	
	/*设置波待率分频数为1*/
	uart_write_reg(Channel,lcr,0xBF);
	uart_write_reg(Channel,efr,0x10);
	uart_write_reg(Channel,lcr,0x0);
	uart_write_reg(Channel,mcr,0x0);
	
	/*使能波待率设置寄存器*/
	uart_write_reg(Channel,lcr,0x80);
	/*设置波特率低位*/
	baudratel = UartBaud & 0xff;
	uart_write_reg(Channel,dll,baudratel);
	/*设置波特率高位*/
	baudrateh = (UartBaud & 0xff00) >>8;
	uart_write_reg(Channel,dlh,baudrateh);
	/*关闭波待率设置寄存器*/
	uart_write_reg(Channel,lcr,0x00);
	
	/*设置数据格式*/
	uartdata = UartWordLen + UartStopBits + UartParity;
	uart_write_reg(Channel,lcr,uartdata);
	
	/*设置FIFO参数*/
	uart_write_reg(Channel,fcr,fifo_rreset);
	uart_write_reg(Channel,fcr,UartFifoControl);
	
	/*是否为闭环测试*/
	uart_write_reg(Channel,mcr,UartLoopway);
}
/******************************************************************************/
/* uart_interrupt_control() - 串口中断设置,并设置相应的寄存器默认值	          */
/*                                                                            */
/* 参数:                                                            		  */
/*    Channel: 有效的串口句柄												  */
/*	  UartIntr: 设置串口的中断源                                              */ 
/*                                                                            */
/* 返回值:   				        				                          */
/*        操作成功,返回0                                                     */
/*        操作失败,返回-1                                                   */
/*                                                                            */
/******************************************************************************/
extern void uart_interrupt_control( HANDLE Channel,
							unsigned int UartIntr)
							
{
	if((unsigned long int)Channel == 0x10)  
		{
		/*清空UART的状态位*/
		uart_read_reg((HANDLE)0x10,lsr);
		
		/*设置中断源*/
		uart_write_reg(Channel,ier,UartIntr);
		/*设置A通路中断使能*/
		uart_write_reg((HANDLE)0x10,mcr,0x49);
		
		} 
	if((unsigned long int)Channel == 0x18)
		{
			/*清空UART的状态位*/
			uart_read_reg((HANDLE)0x18,lsr);
			/*设置中断源*/
			uart_write_reg(Channel,ier,UartIntr);
			/*设置B通路中断使能*/
			uart_write_reg((HANDLE)0x18,mcr,0x49);
		}
}

/******************************************************************************/
/* max3610_set() - MAX3310的设置,并设置相应的寄存器默认值                     */
/*                                                                            */
/* 参数:                                                            		  */
/*    Channel:有效的串口句柄												  */
/*	  FastSet: 设置串口的通讯速度限制                                         */ 
/*	  HpdsSet: 设置串口的全双工,还是半双工                                   */
/*                                                                            */
/* 返回值   				        				                          */
/*                                                                            */
/******************************************************************************/
extern void max3160_set( HANDLE Channel,
				  unsigned int FastSet,
				  unsigned int HdplxSet)
{
	unsigned int max3310t;
	/*保存当前的寄存器设置*/
	max3310t = uart_read_reg(Channel,mcr);
	max3310t = (max3310t || (FastSet + HdplxSet<<4));
	/*更新设置*/
	uart_write_reg(Channel,mcr,max3310t); 
}
/******************************************************************************/
/* uart_send_sigle() - 查询方式下串口发送一个数据             				  */
/*                                                                            */
/* 参数:                                                            		  */
/*    Channel:有效的串口句柄												  */ 
/*	  send_data: 要发送的数据                                                 */
/*                                                                            */
/* 返回值   				        				                          */
/*                                                                            */
/******************************************************************************/
extern void uart_send_sigle(HANDLE Channel,unsigned int send_data)
{
	unsigned int lsrdata;
	do
	{
		lsrdata = uart_read_reg(Channel,lsr);
	}
	while((lsrdata & 0x40) != 0x40);
	uart_write_reg(Channel,thr,send_data);
}

/******************************************************************************/
/* Myuart_Send() - 在查询方式下串口发送多个数据(由定时器控制数据发送)         */
/*                                                                            */
/* 参数:                                                            		  */
/*    Channel:有效的串口句柄												  */
/*	  longth:  缓冲区的长度                                                   */ 
/*	  send_data: 缓冲区的首址                                                 */
/*                                                                            */
/* 返回值   				        				                          */
/*                                                                            */
/******************************************************************************/
extern void Myuart_Send(HANDLE Channel,
					   unsigned int longth,
					   unsigned int *send_data)
{
	Counter = 0;						// 字符发送计数器清0
	SendDataPtr = send_data;
	UartChannel = Channel;
	GPT_start(hGpt);					// 启动定时器,开始计时
	  
	do
	{
	}
	while(!(Counter>=longth));
    
    GPT_stop(hGpt);						// 停止定时器
}
/******************************************************************************/
/* uart_receive_single() - 中断方式下串口接收单个数据 	                      */
/*                                                                            */
/* 参数:                                                            		  */
/*    Channel:	   有效的串口句柄											  */
/*                                                                            */
/* 返回值          接收到的数据												  */
/******************************************************************************/
extern unsigned int uart_receive_single(HANDLE Channel)
{
	unsigned int RegValue;
	unsigned int j;
		
	for(j=0;j<1000;j++)		
	{				
		asm(" NOP");
	}
	
	if((unsigned long int)Channel == 0x10)  
		{
			/* 读接收保持寄存器 */
			RegValue = uart_read_reg((HANDLE)0x10,rhr);
			return(RegValue);	
		} 
	if((unsigned long int)Channel == 0x18)
		{
			/* 读接收保持寄存器 */
			RegValue = uart_read_reg((HANDLE)0x18,rhr);	
			return(RegValue);
		}
	else return(OK) ;
}

/*******************************************************************************************/
//	No	more
/*******************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -