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

📄 dec5416io.c

📁 开发平台ccs5000 tms320vc5416的多通道缓冲同步串口程序
💻 C
字号:
/*********************************************************************************
*  MEMORY.ASM	v1.00								                            *
*  版权(c) 	2003-		北京合众达电子技术有限责任公司			                *
*  设计者:	段立锋								                                *
*********************************************************************************/
#include "uart.h"
#include "sysreg.h"
#include "dec5416.h"
#include "codec.h"
#include "mcbsp54.h"
#include "dma54xx.h"

#define MCBSP0_SPSA     0x0038u
#define MCBSP0_SPSD     0x0039u
#define MCBSP1_SPSA     0x0048u
#define MCBSP1_SPSD     0x0049u

#define MCBSP2_SPSA     0x0034u
#define MCBSP2_SPSD     0x0035u

#define MCBSP_SPCR1_SUB_ADDR   0x0000u
#define MCBSP_SPCR2_SUB_ADDR   0x0001u
#define MCBSP_RCR1_SUB_ADDR 0x002
#define MCBSP_RCR2_SUB_ADDR 0x003
#define MCBSP_XCR1_SUB_ADDR 0x004
#define MCBSP_XCR2_SUB_ADDR 0x005
#define MCBSP_SRGR1_SUB_ADDR   0x0006u
#define MCBSP_SRGR2_SUB_ADDR   0x0007u
#define MCBSP_MCR1_SUB_ADDR    0x0008u
#define MCBSP_MCR2_SUB_ADDR    0x0009u
#define SRGR1_INIT             0x0001u
#define MCBSP_PCR_SUB_ADDR 0x00E


#define MCBSP_CLKGDV    0x20 /*同步串口时钟设置*/
#define MCBSP_CLK_SPI   0x1000 /*同步串口时钟模式设置*/

extern char sys_statbuff[32];
extern char uarta_recbuff[128];
extern char uartb_recbuff[128];

/*串口的初始化*/
unsigned int uart_setup(unsigned int 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;
	/*设置波待率分频数为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,UartFifoControl);
	/*设置FIFO的深度*/
	if(((UartFifoControl & 0xC0)>>6) == 0x00)
	{
		sys_statbuff[FIFOADIP + Channel] = 0x8;
	}
	else if(((UartFifoControl & 0xC0)>>6) == 0x01)
	{
		sys_statbuff[FIFOADIP + Channel] = 0x10;
	}
	else if(((UartFifoControl & 0xC0)>>6) == 0x10)
	{
		sys_statbuff[FIFOADIP + Channel] = 0x38;
	}
	else if(((UartFifoControl & 0xC0)>>6) == 0x11)
	{
		sys_statbuff[FIFOADIP + Channel] = 0x3c;
	}
	/*是否为闭环测试*/
	uart_write_reg(Channel,mcr,UartLoopway);
	return 0;
}
/*串口中断设置*/
unsigned int uart_interrupt_control(unsigned int Channel,
									unsigned int UartIntr, 
									unsigned int enable)
{
	unsigned int intenable;
	/*没置中断源*/
	uart_write_reg(Channel,ier,UartIntr);
	/*设置中断使能*/
	intenable = uart_read_reg(Channel,mcr);
	intenable = intenable | enable;
	uart_write_reg(Channel,mcr,intenable);
	return 0;
}

/*MAX3310的设置*/
void max3310_set(unsigned int 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); 
}
/*串口发送*/
unsigned int uart_send(unsigned int Channel,
					   unsigned int longth,
					   char* send_data)
{
	unsigned int i;
	unsigned int lsrdata;
	unsigned int timeout = 0x4000;
	for(i = 0; i<longth ; i++)
	{
		timeout--;
		lsrdata = uart_read_reg(Channel,lsr);
		/*上一次发送是否完成*/
		if(lsrdata & 0x40)
		{
			/*发送数据*/
			uart_write_reg(Channel,thr,*(send_data++));
		}
		/*检查是否超时*/
		if(!(timeout))
		{
			return 0xFFFF;
		}
	}
	return 0;
}

/*串口接口*/
/*当FlagSet = 00时,使用接收数据不空做为标志
  当FlagSet = 01时,使用缓冲区半满做为标志
  当FlagSet = 02时,使用缓冲区全满做为标志*/
unsigned int uart_recive(unsigned int Channel,
						 unsigned int FlagSet,
						 char* rec_data)
{
	unsigned int i,flag;
	unsigned int data_longth;
	
	if((sys_statbuff[UARTAERR + Channel] == 0) & (!(( sys_statbuff[RECAALL + Channel] ==0 ) & \
		(sys_statbuff[RECACOUNT + Channel] ==0 ))))
	{
		/*确定接收参数*/
		if( FlagSet == 00 )
		{
			flag = RECACOUNT +Channel;
			data_longth = sys_statbuff[flag]; 
		}
		else if	( FlagSet == 01 )
		{
			flag = RECAHAL +Channel;
			data_longth = 0x40;
		}
		else if	( FlagSet == 02 )
		{
			flag = RECAALL +Channel;
			data_longth = 0x80;
		}
		
		for(i = 0; i<data_longth;i++)
		{
			/*接收串口的A通路*/
			if(Channel == 0)
			{
				*rec_data = uarta_recbuff[i];
			}
			else/*接收串口的B通路*/
			{
				*rec_data = uartb_recbuff[i];
			}
		}
	}
	else
	{
		return 0xFFFF;
	}
	return 0;
}
/******************************************************************************/
/* codec_open() - 获得CODEC对应的MCBSP的唯一的句柄,并设置其各寄存器默认值	  */
/*                                                                            */
/* 参数:                                                            		  */
/*     codec - 枚举变量CodecId中的一个元素,对应数据接口或是命令接口          */
/*                                                                            */
/* 返回值:  - 对应的有效句柄					                              */
/*                                                                            */
/******************************************************************************/
HANDLE codec_open(CodecId codec)						 
{
	/*判断是要打开哪个MCBSP*/
	if(codec == 0)
	{
		unsigned int data;
	   /*打开的是数据接口,初始化McBSP0*/
	   /****************************************************************/
	   /* Place port in reset - setting XRST & RRST to 0               */
	   /****************************************************************/
	   /*进行发送复位*/
	   MCBSP_SUBREG_BITWRITE(codec, SPCR1_SUBADDR, RRST, RRST_SZ, 0);
	   /*进行接收复位*/
	   MCBSP_SUBREG_BITWRITE(codec, SPCR2_SUBADDR, XRST, XRST_SZ, 0);
	    
	   /****************************************************************/
	   /* Set values of all control registers                          */
	   /****************************************************************/
	   /*设置SPCR1寄存器*/
	   MCBSP_SUBREG_WRITE(codec, SPCR1_SUBADDR,0x4080);
	   *(int *)MCBSP0_SPSA = MCBSP_SPCR1_SUB_ADDR;   
	   data = *(int *)MCBSP0_SPSD;    
	   /*设置RCR1寄存器,单数据相,接受数据长度为16位,每相2个数据*/
	   MCBSP_SUBREG_WRITE(codec, RCR1_SUBADDR, 0x140);
	   *(int *)MCBSP0_SPSA = MCBSP_RCR1_SUB_ADDR;   
	   data = *(int *)MCBSP0_SPSD;
	   /*设置RCR2寄存器,单数据相

⌨️ 快捷键说明

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