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

📄 uarttest.c

📁 samsung 最新芯片2450 的测试程序.
💻 C
📖 第 1 页 / 共 3 页
字号:
//Description :  The description of Function Pointer sholud be under 15 characters


#include "system.h"
#include "Uart.h"
#include "UartExterns.h"
#include "SfrReadWriten.h"


//SFR test	
REGINFOn		sRegInfoUART0[] = 
{ 
    //01234567890123 ..63       address               reset        uPrivateBitMask(1:do check)
    //												  value       
	{"ULCON0    			",	0x50000000, 7-1 , RW, 0x0  , DPDB, 0			,0},		 
	{"UCON0     			",	0x50000004, 12-1, RW, 0x0  , DPDB, 0			,0},	       
	{"UFCON0[1/2]fifo reset, autoclear ",  0x50000008, 8-1 , RW, 0x0  , DPPB, 0xf7			,0},	       
	{"UMCON0   				",	0x5000000C, 8-1 , RW, 0x0  , DPPB, 0xf1			,0},	       
	{"UTRSTAT0  			",	0x50000010, 3-1 , RO, 0x6  , DPDB, 0			,0},	   
	{"UERSTAT0  			",	0x50000014, 4-1 , RO, 0x0  , DPDB, 0			,0},	   
	{"UFSTAT0  				",	0x50000018, 15-1, RO, 0x0  , DPPB, 0x7f7f		,0},
	{"UMSTAT0  				",	0x5000001C, 5-1 , RO, 0x0  , DPPB, 0x11			,0},
	{"UTXH0(reset undet.)   ",	0x50000020, 8-1 , WO, 0x0  , DPDB, 0			,0},//reset undet.
	{"URXH0(reset undet.)	",	0x50000024, 8-1 , RO, 0x0  , DPDB, 0			,0},//reset undet.
	{"UBRDIV0(reset undet.)	",	0x50000028, 16-1, RW, 0x0  , DPDB, 0			,0},//reset undet.
	{"UDIVSLOT0 			",	0x5000002C, 16-1, RW, 0x0  , DPDB, 0			,0},
};

REGINFOn		sRegInfoUART1[] = 
{ 
    //01234567890123 ..63       address               reset        uPrivateBitMask(1:do check)
    //		
	{"ULCON1    			",	0x50004000, 7-1 , RW, 0x0  , DPDB, 0			,0},		 
	{"UCON1     			",	0x50004004, 12-1, RW, 0x0  , DPDB, 0			,0},	       
	{"UFCON0[1/2]fifo reset, autoclear  ",	0x50004008, 8-1 , RW, 0x0  , DPPB, 0xf7			,0},	       
	{"UMCON1   				",	0x5000400C, 8-1 , RW, 0x0  , DPPB, 0xf1			,0},	       
	{"UTRSTAT1  			",	0x50004010, 3-1 , RO, 0x6  , DPDB, 0			,0},	   
	{"UERSTAT1  			",	0x50004014, 4-1 , RO, 0x0  , DPDB, 0			,0},	   
	{"UFSTAT1  				",	0x50004018, 15-1, RO, 0x0  , DPPB, 0x7f7f		,0},
	{"UMSTAT1  				",	0x5000401C, 5-1 , RO, 0x0  , DPPB, 0x11			,0},
	{"UTXH1(reset undet.)   ",	0x50004020, 8-1 , WO, 0x0  , DPDB, 0			,0},//reset undet.
	{"URXH1(reset undet.)   ",	0x50004024, 8-1 , RO, 0x0  , DPDB, 0			,0},//reset undet.
	{"UBRDIV1(reset undet.) ",	0x50004028, 16-1, RW, 0x0  , DPDB, 0			,0},//reset undet.
	{"UDIVSLOT1 			",	0x5000402C, 16-1, RW, 0x0  , DPDB, 0			,0},
};

REGINFOn		sRegInfoUART2[] = 
{ 
    //01234567890123 ..63       address               reset        uPrivateBitMask(1:do check)
    //	
	{"ULCON2    			",	0x50008000, 7-1 , RW, 0x0  , DPDB, 0			,0},		 
	{"UCON2     			",	0x50008004, 12-1, RW, 0x0  , DPDB, 0			,0},	       
	{"UFCON0[1/2]fifo reset, autoclear",	0x50008008, 8-1 , RW, 0x0  , DPPB, 0xf7			,0},	       
	{"UMCON2   				",	0x5000800C, 8-1 , RW, 0x0  , DPPB, 0xf1			,0},	       
	{"UTRSTAT2  			",	0x50008010, 3-1 , RO, 0x6  , DPDB, 0			,0},	   
	{"UERSTAT2  			",	0x50008014, 4-1 , RO, 0x0  , DPDB, 0			,0},	   
	{"UFSTAT2  				",	0x50008018, 15-1, RO, 0x0  , DPPB, 0x7f7f		,0},
	{"UMSTAT2  				",	0x5000801C, 5-1 , RO, 0x0  , DPPB, 0x11			,0},
	{"UTXH2(reset undet.)   ",	0x50008020, 8-1 , WO, 0x0  , DPDB, 0			,0},//reset undet.
	{"URXH2(reset undet.)   ",	0x50008024, 8-1 , RO, 0x0  , DPDB, 0			,0},//reset undet.
	{"UBRDIV2(reset undet.) ",	0x50008028, 16-1, RW, 0x0  , DPDB, 0			,0},//reset undet.
	{"UDIVSLOT2 			",	0x5000802C, 16-1, RW, 0x0  , DPDB, 0			,0},
};

REGINFOn		sRegInfoUART3[] = 
{ 
    //01234567890123 ..63       address               reset        uPrivateBitMask(1:do check)
    //	
	{"ULCON3    			",	0x5000C000, 7-1 , RW, 0x0  , DPDB, 0			,0},		 
	{"UCON3     			",	0x5000C004, 12-1, RW, 0x0  , DPDB, 0			,0},	       
	{"UFCON0[1/2]fifo reset, autoclear",	0x5000C008, 8-1 , RW, 0x0  , DPPB, 0xf7			,0},	       
	{"UTRSTAT3  			",	0x5000C010, 3-1 , RO, 0x6  , DPDB, 0			,0},	   
	{"UERSTAT3  			",	0x5000C014, 4-1 , RO, 0x0  , DPDB, 0			,0},	   
	{"UFSTAT3  				",	0x5000C018, 15-1, RO, 0x0  , DPPB, 0x7f7f		,0},
	{"UTXH3(reset undet.)   ",	0x5000C020, 8-1 , WO, 0x0  , DPDB, 0			,0},//reset undet.
	{"URXH3(reset undet.)	",	0x5000C024, 8-1 , RO, 0x0  , DPDB, 0			,0},//reset undet.
	{"UBRDIV3(reset undet.)	",	0x5000C028, 16-1, RW, 0x0  , DPDB, 0			,0},//reset undet.
	{"UDIVSLOT3 			",	0x5000C02C, 16-1, RW, 0x0  , DPDB, 0			,0},			
};

//Externs
extern bool TestSFRn(const REGINFOn* psRegInfo, int count);//sfrreadwriten.c

//Test Functions
bool UART_SFR_test();
void TestUart(void);
void Uart_LoopBack(void);
void TestUartbyMode(void);

void UART_ChangeConsole(void);
void UART_Selectport(void);
void UART_Selecttransfermode(void);
void UART_Configure(void);

// buffer for test
//char TestString[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART Tx interrupt test is good!!!!\r";
char TestString[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART Tx interrupt test is good!!!! ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART Tx interrupt test is good!!!!\r";
//local
char *g_pTxString;
char *g_pRxString;
//char TestString[]="UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU!!!!\r"; //Test string for Toggling Value on the oscilloscope

extern unsigned char	g_UART_portTx;
extern unsigned char	g_UART_portRx;
extern bool 		g_UART_bTXtest;
extern bool 		g_UART_bRXtest;
extern unsigned int	g_UART_TXdatasize;
extern unsigned int	g_UART_TXdatacnt;
extern unsigned int	g_UART_RXdatasize;
extern unsigned int	g_UART_RXdatacnt;

extern unsigned int	g_UART_baudrate;
extern bool				g_UART_EnableFifo;
extern unsigned char	g_UART_TxTrig;
extern unsigned char	g_UART_RxTrig;
extern bool				g_UART_RXTimeOuten;

extern unsigned char	g_UART_DmaRxDMD_HS;
extern unsigned char	g_UART_DmaRxTSZ;

extern unsigned char	g_UART_DmaTxDMD_HS;
extern unsigned char	g_UART_DmaTxTSZ;

bool TestUartbyModePingpongtestDMA(void);
bool TestUartbyModePingpongtestInt(void);
bool TestUartbyModePingpongtestPolling(void);

void * func_uart_test[][2]=
{	
	(void *)UART_SFR_test	,		"UART SFR reset value, r/w test             ",
	(void *)TestUart		, 		"UART Test	                                ",	
	(void *)TestUartbyMode	, 	"UART Test	by Mode",	
	(void *)Uart_LoopBack, 		"loop back\n",
	
	(void *)TestUartbyModePingpongtestPolling, "ping pong test Polling",	
	(void *)TestUartbyModePingpongtestInt, "ping pong test Interrup",
	(void *)TestUartbyModePingpongtestDMA, "ping pong test DMA\n",	
		
	(void *)UART_Selecttransfermode,"Select transfer mode                  ",	
	(void *)UART_Configure	,     "Set for test",
	(void *)UART_Selectport	, 	"Select port                   ",			
	(void *)UART_ChangeConsole, 	"Change Console                          ",					
	0,0
};

void Test_UART(void)
{
	int i;
	
	printf("\n======  UART Test program start ======\n");
		
	while(1)
	{
		i=0;
		printf("\n\n");
		while(1)
		{   //display menu
			printf("%2d:%s",i,func_uart_test[i][1]);
			i++;
			if((int)(func_uart_test[i][0])==0)
			{
				printf("\n");
				break;
			}
			printf("\n");
		}

		printf("\nPress Enter key to exit : ");

		i = GetIntNum();
		if(i==-1) break;		// return.
		if(i>=0 && (i<((sizeof(func_uart_test)-1)/8)) )	// select and execute...
			( (void (*)(void)) (func_uart_test[i][0]) )();
	}	
	printf("\n====== UART Test program end ======\n");
}


//should execute at first
bool UART_SFR_test()
{
	bool bret;

	switch(g_UART_portTx)
	{
		case 0:
		printf("test UART0\n");		
		bret=TestSFRn(sRegInfoUART0, sizeof(sRegInfoUART0)/sizeof(REGINFOn));		
		break;

		case 1:
		printf("test UART1\n");
		bret=TestSFRn(sRegInfoUART1, sizeof(sRegInfoUART1)/sizeof(REGINFOn));
		break;

		case 2:
		printf("test UART2\n");
		bret=TestSFRn(sRegInfoUART2, sizeof(sRegInfoUART2)/sizeof(REGINFOn));
		break;

		case 3:
		printf("test UART3\n");
		bret=TestSFRn(sRegInfoUART3, sizeof(sRegInfoUART3)/sizeof(REGINFOn));
		break;		
	}

	return bret;
}




void TestUart(void)
{
	unsigned char ch;
	bool bret, bAFC2;
	int strsize;
	ch = UartConfig(&bAFC2);	
	UART_userguide(ch);	
	if( UartOpen(ch,1,bAFC2) == SENDBREAK ) 
	{
		printf("\n\nSend Break Signal has been transfered");
		return; 	
	} 	
	// UART Tx test with interrupt	
	printf("\n[Uart channel %d Tx Test]\n",ch);	
	g_pTxString= (char* )UART_TXBUF;
	UART_TxstrMake(g_pTxString, g_UART_TXdatasize);
	TxString(ch, g_pTxString, g_UART_TXdatasize,0,0);
	
	
	printf("\nTx Done~ \n");	

	printf("0x%x : rxfifo 0 \n", rUFSTAT0 );

	// UART Rx test with interrupt 
	printf("\n[Uart channel %d Rx Test]\n",ch);
	printf("Case 1 : Interrupt mode. After typing characters and pressing ENTER key.\n");
	printf("Case 2 : Interrupt FIFO mode & DMA mode. After typing characters and pressing ENTER key until FIFO level trigger.\n");	
	printf(" Then, you will see those characters.\n");
//	printf("\nRx : %s \n",RxString(ch));
	g_pRxString=RxString(ch, (char *)UART_RXBUF, &bret, 0,0);
	if(g_pRxString!=0)
	{
		bret = UART_RxstrVerify(g_pRxString, g_UART_RXdatasize);
		printf("RX test result : %d,  including return : %d\n", bret, g_UART_RXdatasize);
		UART_RxstrPrint(g_pRxString, 100);		
	}
	printf("\nRx Done~ \n");

	// Test End
	printf("\nComplete UART test!!! \n");
	UartClose(ch, UART_DUPLEX0);
	
	SetDbgUart(1); // change channel setting for debug port set
//	Console(1);
}



//UART_TxstrMake(g_pTxString, g_UART_TXdatasize);
//UART_RxBufferClear(g_pRxString, g_UART_RXdatasize+2);//1mbyte
bool TestUartbyModePingpongUnit(unsigned char ch, UART_CON* pUartCon,
						    void (*func_start)(void), bool (*func_test)(void))
{
	int strsize;
	bool bret=1;

	UART_assignUartCon(ch, pUartCon);
//	UART_userguide(ch);	
	UART_SelectOpClock(pUartCon->cOpClock);
	if( UartOpen(ch,1,(bool)pUartCon->fAfc) == SENDBREAK ) 
	{
		printf("\n\nSend Break Signal has been transfered");
		return 1; 	
	} 	

	printf("\npress enter to start test\n");
	//getchar();
	
	// UART Tx test with interrupt	
	printf("\n[Uart channel %d Tx Test]\n",ch);	
	g_pTxString= (char* )UART_TXBUF;
		
	TxString(ch, g_pTxString, g_UART_TXdatasize, func_start, func_test);
	printf("\nTx Done~ \n");			
		
	printf("press enter to rx\n");

	printf("0x%x : rxfifo 0 \n", rUFSTAT0 );

	// UART Rx test with interrupt 
	g_pRxString= (char* )UART_RXBUF;
	
	printf("\n[Uart channel %d Rx Test]\n",ch);
	printf("Case 1 : Interrupt mode. After typing characters and pressing ENTER key.\n");
	printf("Case 2 : Interrupt FIFO mode & DMA mode. After typing characters and pressing ENTER key until FIFO level trigger.\n");	
	printf(" Then, you will see those characters.\n");
	//printf("\nRx : %s \n",RxString(ch));
	g_pRxString=RxString(ch, (char *)UART_RXBUF, &bret, 0, 0);
	if(g_pRxString!=0)
	{
		bret = UART_RxstrVerify(g_pRxString, g_UART_RXdatasize);
		printf("RX test result : %d,  including return : %d\n", bret, g_UART_RXdatasize);
		UART_RxstrPrint(g_pRxString, 100);		
	}
	printf("\nRx Done~ \n");


	// Test End
	printf("\nComplete UART test!!! \n");
	UartClose(ch, UART_DUPLEX0);
	SetDbgUart(1); // change channel setting for debug port set
	
	return bret;
}

//												 /-- 0 : non fifo 1 : fifo
//												/		/- tx interrupt (1)
//interrupt test                                                /           /   /-tx trigger level(1:16)
//											    |           |   | /-rx interrput (1)
//											    |           |   | |  /- rx trigger level(3:32)
//											    |           |   | |  |       /- 0 : tx pulse
//											    |           |   | |  |	   | /- 0 : rx pulse
//											    |           |   | |  |       | |  /- 0 : tx interrupt
//											    |           |   | |  |       | |  | /- 0 : rx interrupt
//											    |           |   | |  |       | |  | |      /- 1: rx error interrupt
static UART_CON	UartConINTTxP[] ={{4000000  ,0,0,0,0,  3,3,0,0,1,  0,0,0,0,0,  0,0,0,0,0,  0,0,0,0,0}//non fifo-ok[1/5]
								,{4000000  ,0,0,0,1,  3,3,0,0,1,  0,0,0,0,0,  0,0,0,0,0,  0,0,0,0,0}//fifo
								,{4000000  ,0,0,0,1,  3,3,0,0,1,  1,0,0,0,0,  0,0,0,0,0,  0,0,0,0,0}//fifo
								,{4000000  ,0,0,0,1,  3,3,0,0,1,  2,0,0,0,0,  0,0,0,0,0,  0,0,0,0,0}//fifo
								,{4000000  ,0,0,0,1,  3,3,0,0,1,  3,0,0,0,0,  0,0,0,0,0,  0,0,0,0,0}//fifo
};
static UART_CON	UartConINTRxP[]={{4000000  ,0,0,0,0,  3,3,0,0,0,  0,1,0,0,0,  0,0,0,0,1,  0,0,0,0,0}//non fifo-[1/5]]
								,{4000000  ,0,0,0,1,  3,3,0,0,0,  0,1,0,0,0,  0,0,0,0,1,  0,0,0,0,0}//fifo-[2/5]
								,{4000000  ,0,0,0,1,  3,3,0,0,0,  0,1,1,0,0,  0,0,0,0,1,  0,0,0,0,0}//fifo[3/5]
								,{4000000  ,0,0,0,1,  3,3,0,0,0,  0,1,2,0,0,  0,0,0,0,1,  0,0,0,0,0}//fifo[4/5]
								,{4000000  ,0,0,0,1,  3,3,0,0,0,  0,1,3,0,0,  0,0,0,0,1,  0,0,0,0,0}//fifo[5/5]	
};

static UART_CON	UartConPollingTxP[] ={{4000000  ,0,0,0,0,  3,3,0,0,1,  0,0,0,0,0,  0,0,1,0,0,  0,0,0,0,0}//non fifo-ok[1/5]
								,{4000000  ,0,0,0,1,  3,3,0,0,1,  0,0,0,0,0,  0,0,1,0,0,  0,0,0,0,0}//fifo
								,{4000000  ,0,0,0,1,  3,3,0,0,1,  1,0,0,0,0,  0,0,1,0,0,  0,0,0,0,0}//fifo
								,{4000000  ,0,0,0,1,  3,3,0,0,1,  2,0,0,0,0,  0,0,1,0,0,  0,0,0,0,0}//fifo
								,{4000000  ,0,0,0,1,  3,3,0,0,1,  3,0,0,0,0,  0,0,1,0,0,  0,0,0,0,0}//fifo

};
static UART_CON	UartConPollingRxP[]={{4000000  ,0,0,0,0,  3,3,0,0,0,  0,1,0,0,0,  0,0,0,1,0,  0,0,0,0,0}//non fifo-[1/5]]
								,{4000000  ,0,0,0,1,  3,3,0,0,0,  0,1,0,0,0,  0,0,0,1,0,  0,0,0,0,0}//fifo-[2/5]
								,{4000000  ,0,0,0,1,  3,3,0,0,0,  0,1,1,0,0,  0,0,0,1,0,  0,0,0,0,0}//fifo[3/5]
								,{4000000  ,0,0,0,1,  3,3,0,0,0,  0,1,2,0,0,  0,0,0,1,0,  0,0,0,0,0}//fifo[4/5]
								,{4000000  ,0,0,0,1,  3,3,0,0,0,  0,1,3,0,0,  0,0,0,1,0,  0,0,0,0,0}//fifo[5/5]	
};

static UART_CON	UartConDMATxP[] ={{4000000  ,0,0,0,0,  3,3,0,0,2,  0,0,0,0,0,  0,0,0,0,0,  0,1,0,0,0}
};
static UART_CON	UartConDMARxP[]={{4000000  ,0,0,0,0,  3,3,0,0,0,  0,3,0,0,0,  0,0,0,0,0,  0,0,0,1,0}
};
//DMA
bool TestUartbyModePingpongtestDMA()
{
	bool bret =0;
	int failnum=0;
	int i=0;
	int j=0;
	int jstart=0;

	//g_UART_TXdatasize=1024;
	g_UART_TXdatasize=1048574;//for dma
	//g_UART_TXdatasize=10485760;
	g_UART_RXdatasize=g_UART_TXdatasize;
	g_UART_portTx=3;	
	g_UART_portRx=3;	
	
	g_pTxString= (char* )UART_TXBUF;
	g_pRxString= (char* )UART_RXBUF;
	UART_TxstrMake(g_pTxString, g_UART_TXdatasize);

	if(g_UART_bTXtest)//tx
	{
		for(i=0;i<300;i++)
		//for(i=0;i<5;i++)
		{
			//for(j=2;j<5;j++)
			{
				//Delay(100000);//100us order 1sec
				Delay(30000);//100us order 1sec
				bret=TestUartbyModePingpongUnit(g_UART_portTx,	&UartConDMATxP[j],  0,0);//with out afc
				
				if(!bret) failnum++;				
				printf("fail num : %d\n", failnum);
				
				if(i==100) g_UART_portTx =2;
				else if(i==200) g_UART_portTx =0;
			}
			//jstart=(jstart==2)?0:jstart+1;
		}
	}
	else//rx
	{
		for(i=0;i<300;i++)
		//for(i=0;i<5;i++)
		{
			//for(j=2;j<5;j++)
			{
				UART_RxBufferClear(g_pRxString, g_UART_RXdatasize+2);
				bret=TestUartbyModePingpongUnit(g_UART_portRx,	&UartConDMARxP[j],  0,0);//with out afc
				if(!bret) failnum++;
				printf("fail num : %d\n", failnum);		
				if(i==100) g_UART_portRx =2;
				else if(i==200) g_UART_portRx =0;					
			}			
		}		
	}
	if(!failnum) return 1;
	else return 0;

⌨️ 快捷键说明

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