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

📄 usart.c

📁 关于测试at91sam9260的各种驱动和功能的测试源代码。
💻 C
字号:
/*************************************** Copyright (c) *************************************************
*
*			            POLAR STAR
*				   北天星国际有限公司
*				   http://www.po-star.com
*
*文 件 名: usart.c    
*文件描述:串口及modem测试
*
*Return		 0  	: success
*			-1	: US TX/RX error
*			-3	: US RTS/CTS 
*			-4	: US no loopback detected, timeout
*编译环境:ADS1.2
*
*
********************************************************************************************************/


#include "main.h"

#define AT91C_US0_TIMEOUT  200000

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

  	char test_string[12]="test_string";
  	int i, loop = 0;
  	int delay = AT91C_US0_TIMEOUT;
	
  	// Send Test String
  	// TX/RX loopback
  	for (i=0; i<12; 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;
  	}	
  
  	// RTS/CTS
  	pUsart->US_CR |= AT91C_US_RTSEN;  // Clear RTS
  
  	delay = AT91C_US0_TIMEOUT;
  	while (delay--);
  	if ((pUsart->US_CSR & AT91C_US_CTS ) != 0) return -3;
  
  	pUsart->US_CR |= AT91C_US_RTSDIS; // Set RTS
  
  	delay = AT91C_US0_TIMEOUT;
  	while (delay--);
  	if ((pUsart->US_CSR & AT91C_US_CTS ) != AT91C_US_CTS ) return -3;
  
  	if (pUsart == (AT91PS_USART)AT91C_BASE_US0)
  	{
  		// Test DTR/DSR/RI
	  	// RTS/CTS
	  	pUsart->US_CR |= AT91C_US_DTREN;  // Clear DTR
	  
	  	delay = AT91C_US0_TIMEOUT;
	  	while (delay--);
	  	if ((pUsart->US_CSR & AT91C_US_DSR ) != 0) return -5;
	  	if ((pUsart->US_CSR & AT91C_US_RI ) != 0) return -5;
	  
	  	pUsart->US_CR |= AT91C_US_DTRDIS; // Set DTR
	  
	  	delay = AT91C_US0_TIMEOUT;
	  	while (delay--);
	  	if ((pUsart->US_CSR & AT91C_US_DSR ) != AT91C_US_DSR ) return -5;
	  	if ((pUsart->US_CSR & AT91C_US_RI ) != AT91C_US_RI) return -5;
	}

	return 0;
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_TestUSART
//* \brief 
//*----------------------------------------------------------------------------
void AT91F_TestUSART(AT91PS_USART pUsart)
{
    int uStatus;
    
   	if (pUsart == (AT91PS_USART)AT91C_BASE_US0)
  	{
  		// Init USART0
    	AT91F_US0_CfgPMC ();
    	AT91F_US0_CfgPIO ();
  	} else {
  	    // Init USART1
	    AT91F_US1_CfgPMC ();
	    AT91F_US1_CfgPIO ();  	
  	}

    AT91F_US_Close (pUsart);
    
    // Configure USART
    AT91F_US_Configure (pUsart,
                        AT91C_MASTER_CLOCK,     
                        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);

    // Enter Main Test
    uStatus = AT91F_TestModem(pUsart);
    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;

	AT91F_DBGU_Printk("\n\r-I- Step 4. RS232 COM Port 0 Test\n\r");
	AT91F_DBGU_Printk("-I- Connect Loopback plug onto COM Port 0\n\r");
	    
    while(!AT91F_US_RxReady((AT91PS_USART)AT91C_BASE_DBGU)){}
    dummy = AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU);

	AT91F_TestUSART(AT91C_BASE_US0);
	
	AT91F_DBGU_Printk("\n\r-I- Step 5. RS232 COM Port 1 Test\n\r");
	AT91F_DBGU_Printk("-I- Connect Loopback plug onto COM Port 1\n\r");
	    
    while(!AT91F_US_RxReady((AT91PS_USART)AT91C_BASE_DBGU)){}
    dummy = AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU);

	AT91F_TestUSART(AT91C_BASE_US1);
}

⌨️ 快捷键说明

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