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

📄 mcbsp.c

📁 SEED的5416Mscp通讯程序
💻 C
字号:
/*********************************************************************************
*  MCPSB.C	v1.00   测试MCBSP同步串口测试的主程序	                             *
*  版权(c) 	2003-		北京合众达电子技术有限责任公司			                 *
*  设计者:	段立锋								                                 *
**********************************************************************************/
#include "type.h"
#include "uart.h"
#include "sysreg.h"
#include "mcbsp54.h"
#include "comm.h"

#define mcbsp1   1
/*帧长度的设定*/
#define  FRAMLONGTH    0x104

#define  DataLongth   0x100

typedef struct _UartForDec5416{
	unsigned int Length;
	unsigned int Type;
	unsigned int Mutul;
	unsigned int Data[DataLongth];
	unsigned int Check;
}UartForDec5416, *PuartForDec5416; 

HANDLE uart_a =0;
unsigned int audiodata =0;
PuartForDec5416 precieve =0;	
unsigned int i= 0;
unsigned int k= 0;
int uart_s=0,uart_err=0,fifostatus=0;
PuartForDec5416 psend=0;
PAdConfig padset = 0;
unsigned int datasendlong = 0;
unsigned int errorsend = 0;
unsigned int uart[0x104] ={0};
unsigned int uarts[0x104] = {0};

char s_uart_r[20],s_uart_t[20];


main()
{
	/*设置系统时钟*/
	sys_clk(CLK160);
	/*初始化DEC5416板卡*/
	dec5416_init();
	for(i= 0; i<0x104;i++)
	{
		uart[i] = 0x5555;
		uarts[i] = 0x5555;
	}
	/*同步串口选择*/
	sys_set(0x10);
	/*同步串口初始化*/
	/****************************************************************/
	/* Place port in reset - setting XRST & RRST to 0               */
	/****************************************************************/
	/*进行发送复位*/
	MCBSP_SUBREG_BITWRITE(mcbsp1, SPCR1_SUBADDR, RRST, RRST_SZ, 0);
	/*进行接收复位*/
	MCBSP_SUBREG_BITWRITE(mcbsp1, SPCR2_SUBADDR, XRST, XRST_SZ, 0); 
	/****************************************************************/
	/* Set values of all control registers                          */
	/****************************************************************/
	/*设置SPCR1寄存器,禁止SPI模式*/
	MCBSP_SUBREG_WRITE(mcbsp1, SPCR1_SUBADDR, 0);
	/*设置XCR1寄存器,单数据相,发送数据长度为16位,每相1个数据*/
	MCBSP_SUBREG_WRITE(mcbsp1, XCR1_SUBADDR, 0x40);
	/*设置XCR2寄存器,发送数据延时一个位*/
	MCBSP_SUBREG_WRITE(mcbsp1, XCR2_SUBADDR, 0x1);
	/*设置RCR1寄存器,单数据相,接受数据长度为16位,每相1个数据*/
	MCBSP_SUBREG_WRITE(mcbsp1, RCR1_SUBADDR, 0x040);
	/*设置RCR2寄存器,单数据相,接收延时一个位*/
	MCBSP_SUBREG_WRITE(mcbsp1, RCR2_SUBADDR, 0x01);
	/*设置PCR寄存器,设置BLCKR为输入,下降沿接收数据
	   		         设置BFSR为输入,并且其极性为高有效
	   		         设置BCLKX由内部时钟产生,并且上沿发送数据*/
	MCBSP_SUBREG_WRITE(mcbsp1, PCR_SUBADDR, 0xA00);
	/*使能波特率寄存器*/
 	MCBSP_SUBREG_BITWRITE(mcbsp1, SPCR2_SUBADDR, GRST, GRST_SZ, 1);
 	/*等待两个CLKG时钟周期*/
	asm(" nop ");
	asm(" nop ");
	/*设置SRGR1,确定分频数为0x0FF,MCBSP2的波待率为625k
	,帧脉冲宽度为1个数据位,0x0FF*/
	MCBSP_SUBREG_WRITE(mcbsp1, SRGR1_SUBADDR, 0xFFFF);
	/*设置SRGR2,确定时钟来源为内部的CPU
		           ,确定帧同步为低有效。*/
	MCBSP_SUBREG_WRITE(mcbsp1, SRGR2_SUBADDR, 0x2000);
	/*使能MCBSP2发送与接收*/
	MCBSP_SUBREG_BITWRITE(mcbsp1, SPCR1_SUBADDR, RRST, RRST_SZ, 1);
	MCBSP_SUBREG_BITWRITE(mcbsp1, SPCR2_SUBADDR, XRST, XRST_SZ, 1); 
	/*等待两个CLKG时钟周期*/
 	asm(" nop ");
	asm(" nop ");
	/**********************************************************************/
	/*  同步串口初始化结束                                                */
	/**********************************************************************/
	/*获取有效的串口句柄*/
	uart_a = uart_open(UART_A);
	/*初始化串口*/
	uart_setup(uart_a,    /*串口A*/
			   buad_19k2,  /*串口的波特率设置*/
			   data_w8,   /*数据长度为8*/ 
			   data_s1,   /*数据停止位为1*/ 
			   //uart_parity,    /*设置奇较验位*/	 
			   0,
			   (fifo_enable+fifo_txdip16+fifo_rxdip16),/*FIFO设置*/ 
			   0);       /*设置自闭环方式*/		   
	/*串口A中断设置*/		   
	uart_interrupt_control( uart_a, uartint_rhr, uart_enable);
	/*设置接收长度*/
	uart_reclong_set(uart_a,FRAMLONGTH);
	/*打开系统的串口中断*/
	sysint_enable(0x2);
	
	/*配置系统存储器*/	
	memory_set(0x80);
	
	/*实验主控程序*/
	psend =  (PuartForDec5416)(&uarts[0]);
	/*通知主机,系统准备好*/
	psend->Length = FRAMLONGTH;
	psend->Type = UARTCOMMAND;
	psend->Data[0] = INITOVER;
	psend->Mutul = UARTCONT;
	uart_send(uart_a,FRAMLONGTH, (unsigned int *)psend);
	for(;;)
	{	
		uart_recive(uart_a,&uart[0]);
		/*判断串口的状态*/
		uart_s =uart_status(uart_a);
		if( uart_s == 2)
		{
			/*读RHR清 RHR interrupt*/
			uart_read_reg(uart_a,rhr);
			/*复位FIFO指针*/
			fifostatus = uart_read_reg(uart_a,fcr);
			uart_write_reg(uart_a,fcr,fifo_rreset);
			uart_write_reg(uart_a,fcr,fifostatus);
			continue;	
		}
		/*串口出错*/
		if(uart_s == ERROR)
		{
			/*读状态寄存器*/
			uart_err = uart_read_reg(uart_a,lsr);
			/*复位FIFO指针*/
			fifostatus = uart_read_reg(uart_a,fcr);
			uart_write_reg(uart_a,fcr,fifo_rreset);
			uart_write_reg(uart_a,fcr,fifostatus);
			/*通知主机程序通讯出错,准备重发*/
			psend->Length = FRAMLONGTH;
			psend->Type = UARTCOMMAND;
			psend->Data[0] =  RECIEVEERROR;
			psend->Mutul = UARTCONT;
			uart_send(uart_a,FRAMLONGTH, (unsigned int *)psend);
			continue;
		}
		/*数据较验出错*/
		if(uart_s == 3)
		{
			/*复位FIFO指针*/
			fifostatus = uart_read_reg(uart_a,fcr);
			uart_write_reg(uart_a,fcr,fifo_rreset);
			uart_write_reg(uart_a,fcr,fifostatus);
			/*通知主机程序通讯出错,准备重发*/
			psend->Length = FRAMLONGTH;
			psend->Type = UARTCOMMAND;
			psend->Data[0] =  RECIEVEERROR;
			psend->Mutul = UARTCONT;
			uart_send(uart_a,FRAMLONGTH, (unsigned int *)psend);
			continue;	
		}
		/*数据未准备好*/
		if(uart_s == 0)
		{
			precieve = (PuartForDec5416)(&uart[0]);
			/*不是命令帧*/
			if(precieve->Type != UARTCOMMAND)
			{
				/*无效命令*/
				psend->Length = FRAMLONGTH;
				psend->Type = UARTCOMMAND;
				psend->Data[0] =  COMMANDNODO;
				psend->Mutul = UARTCONT;
				uart_send(uart_a,FRAMLONGTH, (unsigned int *)psend);
				precieve->Data[0] = 0;	
			}
			continue;
		}
		/*接收从主机的数据*/
		precieve = (PuartForDec5416)(&uart[0]);
		switch(precieve->Data[0])
		{
			/*打开同步串口*/	
			case MCBSPOPEN:
				/* Wait for sample from handset */
			   /* while (!MCBSP_RRDY(mcbsp1)) {};*/
			    if(MCBSP_RRDY(mcbsp1))
			    {
			       	/* Read sample from and write back to handset codec */
					s_uart_r[i] = *(volatile u16*)DRR1_ADDR(mcbsp1);
					*(volatile u16*)DXR1_ADDR(mcbsp1) = s_uart_r[i];			     
					s_uart_t[i] = s_uart_r[i];
					i = i+1;
					if(i == 20)
					{
					    i= 0;
					}
				}	     

/*			    if(MCBSP_XRDY(mcbsp1))
			  	{
			  		*(volatile u16*)DXR1_ADDR(mcbsp1) = s_uart_t[i];
			  	  	k = k+1;
					if(i == 20)
					{
					    k= 0;
					}		
			  	  }*/
			  	 break;
			case MCBSPCLOSE:
				precieve->Data[0] = 0;
				break;
				  	  
			/*系统复位*/
			case SYSRESET:
				sys_set(0x4);
				precieve->Data[0] = 0;
				break;
			
			default:
				break;
		} 		
	}					   
}

⌨️ 快捷键说明

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