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