/*! \file uart2.h \brief Dual UART driver with buffer support. */ //***************************************************************************** // // File Name : 'usart.h' // Title : Dual UART driver with buffer support // Author : Pascal Stang - Copyright (C) 2000-2002 // Created : 11/20/2000 // Revised : 07/04/2004 // Version : 1.0 // Target MCU : ATMEL AVR Series // Editor Tabs: 4 // // This code is distributed under the GNU Public License // which can be found at http://www.gnu.org/licenses/gpl.txt // /// \ingroup driver_avr /// \defgroup uart2 UART Driver/Function Library for dual-UART processors (uart2.c) /// \code #include "uart2.h" \endcode /// \par Overview /// This is a UART driver for AVR-series processors with two hardware /// UARTs such as the mega161 and mega128. This library provides both /// buffered and unbuffered transmit and receive functions for the AVR /// processor UART. Buffered access means that the UART can transmit /// and receive data in the "background", while your code continues /// executing.  Also included are functions to initialize the UARTs, /// set the baud rate, flush the buffers, and check buffer status. /// /// \note For full text output functionality, you may wish to use the rprintf /// functions along with this driver. /// /// \par About UART operations /// Most Atmel AVR-series processors contain one or more hardware UARTs /// (aka, serial ports). UART serial ports can communicate with other /// serial ports of the same type, like those used on PCs. In general, /// UARTs are used to communicate with devices that are RS-232 compatible /// (RS-232 is a certain kind of serial port). /// \par /// By far, the most common use for serial communications on AVR processors /// is for sending information and data to a PC running a terminal program. /// Here is an exmaple: /// \code /// uartInit(); // initialize UARTs (serial ports) /// uartSetBaudRate(0, 9600); // set UART0 speed to 9600 baud /// uartSetBaudRate(1, 115200); // set UART1 speed to 115200 baud /// /// rprintfInit(uart0SendByte); // configure rprintf to use UART0 for output /// rprintf("Hello UART0\r\n"); // send "hello world" message via UART0 /// /// rprintfInit(uart1SendByte); // configure rprintf to use UART1 for output /// rprintf("Hello UART1\r\n"); // send "hello world" message via UART1 /// \endcode /// /// \warning The CPU frequency (F_CPU) must be set correctly in \c global.h /// for the UART library to calculate correct baud rates. Furthermore, /// certain CPU frequencies will not produce exact baud rates due to /// integer frequency division round-off. See your AVR processor's /// datasheet for full details. // //***************************************************************************** //@{ #ifndef USART_H #define USART_H #include "drvbase.h" #include "buffer.h" //! Default uart baud rate. /// This is the default speed after a uartInit() command, /// and can be changed by using uartSetBaudRate(). #define UART0_DEFAULT_BAUD_RATE 9600 ///< default baud rate for UART0 #define UART1_DEFAULT_BAUD_RATE 9600 ///< default baud rate for UART1 // buffer memory allocation defines // buffer sizes #ifndef UART0_TX_BUFFER_SIZE #define UART0_TX_BUFFER_SIZE 0x0010 ///< number of bytes for uart0 transmit buffer #endif #ifndef UART0_RX_BUFFER_SIZE #define UART0_RX_BUFFER_SIZE 0x0080 ///< number of bytes for uart0 receive buffer #endif #ifndef UART1_TX_BUFFER_SIZE #define UART1_TX_BUFFER_SIZE 0x0010 ///< number of bytes for uart1 transmit buffer #endif #ifndef UART1_RX_BUFFER_SIZE #define UART1_RX_BUFFER_SIZE 0x0080 ///< number of bytes for uart1 receive buffer #endif // define this key if you wish to use // external RAM for the UART buffers //#define UART_BUFFER_EXTERNAL_RAM #ifdef UART_BUFFER_EXTERNAL_RAM // absolute address of uart0 buffers #define UART0_TX_BUFFER_ADDR 0x1000 #define UART0_RX_BUFFER_ADDR 0x1100 // absolute address of uart1 buffers #define UART1_TX_BUFFER_ADDR 0x1200 #define UART1_RX_BUFFER_ADDR 0x1300 #endif //! Type of interrupt handler to use for uart interrupts. /// Value may be SIGNAL or INTERRUPT. /// \warning Do not change unless you know what you're doing. #ifndef UART_INTERRUPT_HANDLER #define UART_INTERRUPT_HANDLER SIGNAL #endif // compatibility for the mega161 #ifndef RXCIE #define RXCIE RXCIE0 #define TXCIE TXCIE0 #define UDRIE UDRIE0 #define RXEN RXEN0 #define TXEN TXEN0 #define CHR9 CHR90 #define RXB8 RXB80 #define TXB8 TXB80 #endif #ifndef UBRR0L #define UBRR0L UBRR0 #define UBRR1L UBRR1 #endif // functions //! Initializes UARTs. /// \note After running this init function, the processor /// I/O pins that used for uart communications (RXD, TXD) /// are no long available for general purpose I/O. void uartInit(void); //! Initializes UART0 only. void uart0Init(void); //! Initializes UART1 only. void uart1Init(void); //! Initializes transmit and receive buffers. /// Automatically called from uartInit() void uart0InitBuffers(void); void uart1InitBuffers(void); //! Redirects received data to a user function. /// void uartSetRxHandler(u08 nUart, void (*rx_func)(unsigned char c)); //! Sets the uart baud rate. /// Argument should be in bits-per-second, like \c uartSetBaudRate(9600); void uartSetBaudRate(u08 nUart, u32 baudrate); //! Returns pointer to the receive buffer structure. /// cBuffer* uartGetRxBuffer(u08 nUart); //! Returns pointer to the transmit buffer structure. /// cBuffer* uartGetTxBuffer(u08 nUart); //! Sends a single byte over the uart. /// void uartSendByte(u08 nUart, u08 data); //! SendByte commands with the UART number hardcoded /// Use these with printfInit() - example: \c printfInit(uart0SendByte); void uart0SendByte(u08 data); void uart1SendByte(u08 data); //! Gets a single byte from the uart receive buffer. /// Returns the byte, or -1 if no byte is available (getchar-style). int uart0GetByte(void); int uart1GetByte(void); //! Gets a single byte from the uart receive buffer. /// Function returns TRUE if data was available, FALSE if not. /// Actual data is returned in variable pointed to by "data". /// Example usage: /// \code /// char myReceivedByte; /// uartReceiveByte(0, &myReceivedByte ); /// \endcode u08 uartReceiveByte(u08 nUart, u08* data); //! Returns TRUE/FALSE if receive buffer is empty/not-empty. /// u08 uartReceiveBufferIsEmpty(u08 nUart); //! Flushes (deletes) all data from receive buffer. /// void uartFlushReceiveBuffer(u08 nUart); //! Add byte to end of uart Tx buffer. /// void uartAddToTxBuffer(u08 nUart, u08 data); //! AddToTxBuffer commands with the UART number hardcoded /// Use this with printfInit() - example: \c printfInit(uart0AddToTxBuffer); void uart0AddToTxBuffer(u08 data); void uart1AddToTxBuffer(u08 data); //! Begins transmission of the transmit buffer under interrupt control. /// void uartSendTxBuffer(u08 nUart); //! sends a buffer of length nBytes via the uart using interrupt control. /// u08 uartSendBuffer(u08 nUart, char *buffer, u16 nBytes); //! interrupt service handlers void uartTransmitService(u08 nUart); void uartReceiveService(u08 nUart); #endif