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

📄 usart.c

📁 ATMEL AT91SAM926x 测试程序。在ADS环境下测试AT91SAM926x串口。
💻 C
字号:
//*----------------------------------------------------------------------------
//*         ATMEL Microcontroller Software Support  -  ROUSSET  -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name           : usart.c
//* Object              : USART Modem test written in C
//* Creation            : NLe  Jul 13 2005
//*
//* Return		 0  	: success
//*			-1	: US TX/RX error
//*			-3	: US RTS/CTS 
//*			-4	: US no loopback detected, timeout
//*----------------------------------------------------------------------------
#include "main.h"

#define AT91C_US0_TIMEOUT  2000000
#define SZ 512
#define USART_SYS_LEVEL 4
unsigned int scount = 0;
unsigned char S0Buffer[SZ];
int printback;

//*----------------------------------------------------------------------------
//* \fn    AT91F_TestModem
//* \brief 
//*----------------------------------------------------------------------------
int AT91F_TestModem (AT91PS_USART pUsart, char *msg)
{

  	char *test_string = msg;
  	int len, i, loop = 0;
  	int delay = AT91C_US0_TIMEOUT;
	
	len = strlen(test_string);
  	// Send Test String
  	// TX/RX loopback
  	for (i=0; i<len; i++)
  	{
    	// Wait USART Ready to Transmit
    	while ((!AT91F_US_TxReady(pUsart)) && (loop < AT91C_US0_TIMEOUT)) loop ++;
    	if (loop == AT91C_US0_TIMEOUT) return -4; // Timeout
    
    	// Send Char
    	AT91F_US_PutChar (pUsart, test_string[i]);
    	delay = AT91C_US0_TIMEOUT;
    	while (delay--);
  
    	loop = 0;
    	// Wait Character is received
    	//while ((!AT91F_US_RxReady(pUsart)) && (loop < AT91C_US0_TIMEOUT)) loop ++;
    	//if (loop == AT91C_US0_TIMEOUT) return -4; // Timeout
    
    	// Compare character
    	//if (test_string[i] != AT91F_US_GetChar (pUsart)) return -1;
  	}	
  
  	return 0;
}

//*------------------------- Internal Function --------------------------------
//#define USART_pt (AT91PS_USART)AT91C_BASE_US0
//*----------------------------------------------------------------------------
//* Function Name       : Usart_c_irq_handler
//* Object              : C handler interrupt function called by the interrupts
//*                       assembling routine
//* Input Parameters    : <RTC_pt> time rtc descriptor
//* Output Parameters   : increment count_timer0_interrupt
//*----------------------------------------------------------------------------
void Usart_c_irq_handler(void)
{

	
	AT91PS_USART USART_pt = AT91C_BASE_US0;
	unsigned int status;
	unsigned short rec;
	// get Usart status register
	
	status = USART_pt->US_CSR;
	
	if(scount==0)memset(S0Buffer, 0, SZ);
	
	if ( status & AT91C_US_RXRDY){
		
		rec = AT91F_US_GetChar(USART_pt);
		
		S0Buffer[scount] = rec;
		//AT91F_US_PutChar (USART_pt, S0Buffer[count]);  //回显US0 
		if(!printback)AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_DBGU, S0Buffer[scount]);
		
		scount++;
		
	}

	// 错误判断
	if ( status & AT91C_US_OVRE) {
		// clear US_RXRDY
		 AT91F_US_GetChar(USART_pt);
		 AT91F_US_PutChar (USART_pt, 'O');
	}

	// Check error
	if ( status & AT91C_US_PARE) {
		 AT91F_US_PutChar (USART_pt, 'P');
	}

	if ( status & AT91C_US_FRAME) {
		 AT91F_US_PutChar (USART_pt, 'F');
	}

	if ( status & AT91C_US_TIMEOUT){
		USART_pt->US_CR = AT91C_US_STTTO;
		 AT91F_US_PutChar (USART_pt, 'T');
	}

		// 中断返回
        AT91C_BASE_AIC->AIC_IVR   = 0;            // Debug variant of vector read (protect mode is used)
        AT91C_BASE_AIC->AIC_ICCR  = AT91C_ID_SYS; // Clear  timer #0 interrupt
        AT91C_BASE_AIC->AIC_EOICR = 0;            // Signal end of interrupt
	
}

unsigned int Usart_getc(AT91PS_USART pUsart){
    while(!AT91F_US_RxReady(pUsart));
    return((int)AT91F_US_GetChar(pUsart));
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_TestUSART
//* \brief 
//*----------------------------------------------------------------------------
void AT91F_TestUSART(AT91PS_USART pUsart)
{
    int uStatus;
    char *msg;
    unsigned int c;
    
    scount = 0;
    printback = 0;
    
    
   	if (pUsart == (AT91PS_USART)AT91C_BASE_US0)
  	{
  		// Init USART0
    	AT91F_US0_CfgPMC ();
    	AT91F_US0_CfgPIO ();
    	msg = "\n\rCOM1 test string!\n\r";
  	} else if(pUsart == (AT91PS_USART)AT91C_BASE_US1){
  	    // Init USART1
	    AT91F_US1_CfgPMC ();
	    AT91F_US1_CfgPIO ();  	
	    msg = "\n\rCOM2 test string!\n\r";
  	} else if(pUsart == (AT91PS_USART)AT91C_BASE_US2){
  	    // Init USART2
	    AT91F_US2_CfgPMC ();
	    AT91F_US2_CfgPIO ();  	
	    msg = "\n\rCOM3 test string!\n\r";
  	} else if(pUsart == (AT91PS_USART)AT91C_BASE_US3){
  	    // Init USART3
	    AT91F_US3_CfgPMC ();
	    AT91F_US3_CfgPIO ();  	
	    msg = "\n\rCOM4 test string!\n\r";
  	}
	
    AT91F_US_Close (pUsart);
    
    // Configure USART
    AT91F_US_Configure (pUsart,
                        99300000,     
                        AT91C_US_ASYNC_MODE,  	// mode Register to be programmed
                        AT91C_BAUD_RATE,		// baudrate to be programmed
                        0);                   	// timeguard to be programmed



    // Enable Transmitter Receiver
    AT91F_US_EnableTx(pUsart);
    AT91F_US_EnableRx(pUsart);
    
    //* open interrupt
	//AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_US0, USART_SYS_LEVEL, AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, Usart_c_irq_handler);
	
	//AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0);

    // Enter Main Test
    uStatus = AT91F_TestModem(pUsart, msg);
    
    AT91F_DBGU_Printk("\n\rUsart receive test press 'x' to exit...\n\r");
    
    while(1){
    	if((((AT91PS_USART)AT91C_BASE_DBGU)->US_RHR & 0x1FF) == 'x')goto OUT;
    	if(pUsart->US_CSR & AT91C_US_RXRDY){
    		c = (((AT91PS_USART)pUsart)->US_RHR & 0x1FF);
    		pUsart->US_THR = (c & 0x1FF);
    	}
    }

OUT:    
    switch(uStatus) 
    {
        case 0: AT91F_DBGU_Printk("-I- Test OK\n\r");
                break;

        case -1: AT91F_DBGU_Printk("-E- Test FAILED: USART RX/TX Error\n\r");
                 break;

        case -3: AT91F_DBGU_Printk("-E- Test FAILED: USART RTS/CTS Error\n\r");
                 break;
    
        case -4: AT91F_DBGU_Printk("-E- Test FAILED: check that loopback plug is connected on RS232 COM Port\n\r");
                 break;

        case -5: AT91F_DBGU_Printk("-E- Test FAILED: USART DTR/DSR/RI Error\n\r");
                 break;
          
        default: break;
    }
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_TestCOMPorts
//* \brief 
//*----------------------------------------------------------------------------
void AT91F_TestCOMPorts(void)
{
    volatile int dummy;
	unsigned int port = 0;

	AT91F_DBGU_Printk("We use the 115200 baudrate for all the 4 COM Port\n\r");
	AT91F_DBGU_Printk("Connect one of your PC's COM Port to a COM Port you want to test then input the number(1-4)\n\r");
	port = (char)AT91F_Wait4KeyPressed();
	
	uprintf("Port %c is select\n\r", port);
	switch(port){
		case '1':	AT91F_TestUSART(AT91C_BASE_US0);
				break;
				
		case '2':	AT91F_TestUSART(AT91C_BASE_US1);
				break;
				
		case '3':	AT91F_TestUSART(AT91C_BASE_US2);
				break;
				
		case '4':	AT91F_TestUSART(AT91C_BASE_US3);
				break;
				
		default: break;	
	}			
}

⌨️ 快捷键说明

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