📄 usart.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 + -