usart.c File Reference


Detailed Description

PDC and interrupt control example application.

This file gives an example of using the PDC to burst data on the USART. With and without the use of interrupts.

Author:
Atmel Corporation: http://www.atmel.com
Support email: avr32@atmel.com
Name
RELEASE_1_0
Revision
1.9
RCSfile
usart.c,v
Date
2006/05/09 10:32:56

Definition in file usart.c.

#include "usart.h"

Include dependency graph for usart.c:

Go to the source code of this file.

Functions

int usart_linit (volatile struct avr32_usart_t *usart, const struct usart_options_t *opt, const long cpuHz)
 Setup the usart to use the standard RS232 protocol.
int usart_lwriteLine (volatile struct avr32_usart_t *usart, const char *string)
 write one character string to the usart
int usart_putchar (volatile struct avr32_usart_t *usart, const int character)
 Send a character with the usart.
void usart_reset (volatile struct avr32_usart_t *usart)
 This function will reset the USART, and disable TX and RX.
static int usart_set_baudrate (volatile struct avr32_usart_t *usart, unsigned int baudrate, const long cpuHz)
 This function will calculate a clock divider(CD) and fractional part(FP) that gets the usart as close to a wanted baudrate as possible.


Function Documentation

int usart_linit volatile struct avr32_usart_t *  usart,
const struct usart_options_t opt,
const long  cpuHz
 

Setup the usart to use the standard RS232 protocol.

Parameters:
usart base address of the usart
opt options needed to set up RS232 communcation (see usart_options_t)
cpuHz frequency of the selected clock
Returns:
status
Return values:
USART_OK on success
USART_ERROR_ARGUMENT on wrong arguments

Definition at line 147 of file usart.c.

References usart_options_t::baudrate, usart_options_t::channelmode, usart_options_t::charlength, usart_options_t::paritytype, usart_options_t::stopbits, USART_ERROR_ARGUMENT, USART_OK, usart_reset(), and usart_set_baudrate().

Referenced by main().

00150 {
00151     int retval;
00152 
00153     /* reset the usart and shutdown RX and TX */
00154     usart_reset(usart);
00155 
00156     /* control input values */
00157     if (opt == 0) {
00158         return USART_ERROR_ARGUMENT;
00159     }
00160     if (opt->charlength < 5 || opt->charlength > 9) {
00161         return USART_ERROR_ARGUMENT;
00162     }
00163     if (opt->paritytype > 7) {
00164         return USART_ERROR_ARGUMENT;
00165     }
00166     if (opt->stopbits > 2+255) {
00167         return USART_ERROR_ARGUMENT;
00168     }
00169     if (opt->channelmode > 3) {
00170         return USART_ERROR_ARGUMENT;
00171     }
00172 
00173     retval = usart_set_baudrate(usart, opt->baudrate, cpuHz);
00174 
00175     if (retval != USART_OK) {
00176         return retval;
00177     }
00178 
00179     if (opt->charlength == 9) {
00180         /* charlength set to 9 bits; MODE9 dominates CHRL */
00181         usart->mr |= AVR32_USART_MR_MODE9_MASK;
00182     } else {
00183         /* CHRL gives the charlength(- 5) when USART_MODE9=0 */
00184         usart->mr |=
00185             ((opt->charlength-5)<<AVR32_USART_MR_CHRL_OFFSET);
00186     }
00187 
00188     usart->mr |= (opt->channelmode<<AVR32_USART_MR_CHMODE_OFFSET)|
00189                  (opt->paritytype<<AVR32_USART_MR_PAR_OFFSET);
00190 
00191     if (opt->stopbits > 2) {
00192         /* set two stop bits */
00193         usart->mr |= (2<<AVR32_USART_MR_NBSTOP_OFFSET);
00194         /* and a timeguard period gives the rest */
00195         usart->ttgr = (opt->stopbits-2);
00196     } else {
00197         /* insert 1, 1.5 or 2 stop bits */
00198         usart->mr |= (opt->stopbits<<AVR32_USART_MR_NBSTOP_OFFSET);
00199     }
00200 
00201     /* enable TX and RX */
00202     usart->cr |= AVR32_USART_CR_TXEN_MASK|AVR32_USART_CR_RXEN_MASK;
00203 
00204     return USART_OK;
00205 }

Here is the call graph for this function:

int usart_lwriteLine volatile struct avr32_usart_t *  usart,
const char *  string
 

write one character string to the usart

Parameters:
usart base address of the usart
string pointer to an array of chars
Returns:
status
Return values:
USART_OK on success
USART_TX_BUSY on timeout

Definition at line 244 of file usart.c.

References USART_OK, and usart_putchar().

00245 {
00246     int retVal = USART_OK;
00247 
00248     while (*string != '\0') {
00249         retVal = usart_putchar(usart, *string++);
00250 
00251         if (retVal != USART_OK) {
00252             return retVal;
00253         }
00254     }
00255 
00256     return USART_OK;
00257 }

Here is the call graph for this function:

int usart_putchar volatile struct avr32_usart_t *  usart,
const int  character
 

Send a character with the usart.

Parameters:
usart base address of the usart
character character to write
Returns:
status
Return values:
USART_OK on success
USART_TX_BUSY on timeout

Definition at line 217 of file usart.c.

References USART_DEFAULT_TIMEOUT, USART_OK, and USART_TX_BUSY.

Referenced by usart_lwriteLine().

00218 {
00219     int timeout = USART_DEFAULT_TIMEOUT;
00220 
00221     do {
00222         --timeout;
00223     } while ((usart->csr & AVR32_USART_CSR_TXRDY_MASK) == 0 && timeout > 0);
00224 
00225     if (timeout == 0) {
00226         return USART_TX_BUSY;
00227     }
00228 
00229     usart->thr = character;
00230 
00231     return USART_OK;
00232 }

void usart_reset volatile struct avr32_usart_t *  usart  ) 
 

This function will reset the USART, and disable TX and RX.

Parameters:
usart Base address of the usart

Definition at line 55 of file usart.c.

Referenced by usart_linit().

00056 {
00057     /* Disable all usart interrupts, interrupts needed should be set
00058        explicitly on every reset */
00059     usart->idr = 0xFFFFffff;
00060 
00061     /* Reset mode and other registers that could cause unpredictable
00062        behaviour after reset */
00063     usart->mr = 0;
00064     usart->rtor = 0;
00065     usart->ttgr = 0;
00066 
00067     /* Shutdown RX and TX (will be reenabled when setup
00068        is completed successfully), reset status bits and turn
00069        off DTR and RTS */
00070     usart->cr = AVR32_USART_CR_RSTRX_MASK|
00071                 AVR32_USART_CR_RSTTX_MASK|
00072                 AVR32_USART_CR_RSTSTA_MASK|
00073                 AVR32_USART_CR_RSTIT_MASK|
00074                 AVR32_USART_CR_RSTNACK_MASK|
00075                 AVR32_USART_CR_DTRDIS_MASK|
00076                 AVR32_USART_CR_RTSDIS_MASK;
00077 }

static int usart_set_baudrate volatile struct avr32_usart_t *  usart,
unsigned int  baudrate,
const long  cpuHz
[static]
 

This function will calculate a clock divider(CD) and fractional part(FP) that gets the usart as close to a wanted baudrate as possible.

Parameters:
usart base address of the usart
baudrate wanted baudrate
cpuHz frequency of the selected clock
Returns:
status
Return values:
USART_OK on success
USART_ERROR_ARGUMENT if wanted baudrate is impossible with given clockspeed

Definition at line 93 of file usart.c.

References USART_ERROR_ARGUMENT, and USART_OK.

Referenced by usart_linit().

00096 {
00097     int cd; /* clock divider */
00098 
00099     /*
00100      *             ** BAUDRATE CALCULATION **
00101      *
00102      *                 selected clock                       selected clock
00103      *     baudrate = ----------------   or     baudrate = ----------------
00104      *                16 x (CD + FP/8)                      8 x (CD + FP/8)
00105      *
00106      *       (with 16x oversampling)              (with 8x oversampling)
00107      */
00108     if (baudrate > (cpuHz/16)) {
00109         /* use 8x oversampling */
00110         usart->mr |= (AVR32_USART_MR_OVER_MASK);
00111         cd = cpuHz / (8 * baudrate);
00112 
00113         if (cd < 2) {
00114             /* wanted baudrate is too high */
00115             return USART_ERROR_ARGUMENT;
00116         }
00117 
00118         usart->brgr = (cd << AVR32_USART_BRGR_CD_OFFSET);
00119     } else {
00120         /* use 16x oversampling */
00121         usart->mr &= ~(AVR32_USART_MR_OVER_MASK);
00122         cd = cpuHz / (16 * baudrate);
00123 
00124         if (cd > 65535) {
00125             /* wanted baudrate is too low */
00126             return USART_ERROR_ARGUMENT;
00127         }
00128 
00129         usart->brgr = (cd << AVR32_USART_BRGR_CD_OFFSET);
00130     }
00131 
00132     return USART_OK;
00133 }


Generated on Wed May 10 15:03:15 2006 for AVR32108 - Peripheral Direct Memory Access Driver by  doxygen 1.4.6-NO