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

📄 uart.h

📁 AVR单片机模拟USB实现CDC类串行口
💻 H
字号:

/* Name: uart.h
 * Project: AVR USB driver for CDC interface on Low-Speed USB
 * Author: Osamu Tamura
 * Creation Date: 2006-06-18
 * Tabsize: 4
 * Copyright: (c) 2006 by Recursion Co., Ltd.
 * License: Proprietary, free under certain conditions. See Documentation.
 */

#ifndef __uart_h_included__
#define __uart_h_included__

#include <avr/io.h> /* for TXEN or TXEN0 resp., if available */

#ifndef uchar
#define uchar   unsigned char
#endif

#ifndef ulong
#define ulong   unsigned long
#endif

#ifndef UART_CFG_HAVE_USART
#if (defined TXEN || defined TXEN0)
#   define UART_CFG_HAVE_USART     1
#else
#   define UART_CFG_HAVE_USART     0
#endif
#endif
/* Define this to 1 if MCU has USART(s). If defined 0, software UART routines are
 * selected. Software UART is supported on ATtiny45 and 85.
 * If not defined: Guess from AVR type.
 */

#ifndef UART_DEFAULT_BPS
#define UART_DEFAULT_BPS     4800
#endif
/* 4800bps is the maximum speed by software UART.
   The baud rate will be automatically configured after opening device anyway.
*/

/* These are the USART port and TXD, RXD bit numbers.
*/
#if UART_CFG_HAVE_USART
/* ATmega8, 48, 88, 168 */
#define UART_CFG_PORTNAME   D
#define UART_CFG_RXD        0
#define UART_CFG_TXD        1

#define	RX_SIZE		256      /* UART receive buffer size (must be 2^n ) <=256 */
#define	TX_SIZE		128      /* UART transmit buffer size (must be 2^n, 16<= ~ <=256 ) */

#if !defined URSEL
//#define	USE_UART_RXD_INTERRUPT	/* enables UART receiver interrupt for high speed transfer */
#endif

#else
/* ATtiny45, 85 */
#define UART_CFG_PORTNAME   B
#define UART_CFG_RXD        5
#define UART_CFG_TXD        1

#define UART_CFG_INVERT     0
/* Define this to 1 if TXD and RXD connected to RS-232C line directly
 */ 

#define	RX_SIZE		64       /* UART receive buffer size (must be 2^n ) <=256 */
#define	TX_SIZE		64       /* UART transmit buffer size (must be 2^n, 16<= ~ <=256 ) */

#endif

#define	RX_MASK		(RX_SIZE-1)
#define	TX_MASK		(TX_SIZE-1)

/* ------------------------------------------------------------------------- */
/* ------------------------ General Purpose Macros ------------------------- */
/* ------------------------------------------------------------------------- */
#define OD_CONCAT(a, b)             a ## b
#define UART_OUTPORT(name)          OD_CONCAT(PORT, name)
#define UART_INPORT(name)           OD_CONCAT(PIN, name)
#define UART_DDRPORT(name)          OD_CONCAT(DDR, name)

#define UART_CFG_PORT     UART_OUTPORT(UART_CFG_PORTNAME)
#define UART_PIN          UART_INPORT(UART_CFG_PORTNAME)
#define UART_DDR          UART_DDRPORT(UART_CFG_PORTNAME)


#ifndef __ASSEMBLER__

/* allow ATmega8 compatibility */
#if defined URSEL
#define UBRR0H    UBRRH
#define UBRR0L    UBRRL
#define UCSR0A    UCSRA
#define UCSR0B    UCSRB
#define UCSR0C    UCSRC
#define UDR0      UDR

/* UCSR0A */
#define RXC0      RXC
#define UDRE0     UDRE
#define FE0       FE
#define DOR0      DOR
#define UPE0      PE
#define U2X0      U2X

/* UCSR0B */
#define RXCIE0    RXCIE
#define UDRIE0    UDRIE
#define RXEN0     RXEN
#define TXEN0     TXEN

/* UCSR0C */
#define UPM00     UPM0
#define USBS0     USBS
#define UPBS0     UPBS
#define UCSZ00    UCSZ0
#endif

/* ------------------------------------------------------------------------- */
/*	---------------------- Type Definition --------------------------------- */
/* ------------------------------------------------------------------------- */
typedef union usbDWord {
    ulong	dword;
    uchar   bytes[4];
} usbDWord_t;


extern uchar    urptr, uwptr, irptr, iwptr;
extern uchar    rx_buf[RX_SIZE], tx_buf[TX_SIZE]; 

extern void uartInit(ulong baudrate, uchar parity, uchar stopbits, uchar databits);
extern void uartPoll(void);
extern uchar uartRxIsBusy(void);

static inline void  uartTxBufAppend(uchar c)
{
uchar   uwnxt;

    uwnxt = (uwptr+1) & TX_MASK;
    if( uwnxt==irptr )
        return;         /* buffer overflow */
    tx_buf[uwptr] = c;
    uwptr = uwnxt;
}

static inline void  uartRxBufAppend(uchar c)
{
uchar   iwnxt;

    iwnxt = (iwptr+1) & RX_MASK;
    if( iwnxt==urptr )
        return;         /* buffer overflow */

    rx_buf[iwptr] = c;
    iwptr = iwnxt;
}

/* The following function returns the amount of bytes available in the TX
 * buffer before we have an overflow.
 */
static inline uchar uartTxBytesFree(void)
{
    return (irptr - uwptr - 1) & TX_MASK;
}

/* The following function sets *ptr to the current read position and returns
 * the number of bytes which can currently be read from this read position.
 */
static inline uchar uartRxBytesAvailable(uchar **ptr)
{
    *ptr = &rx_buf[urptr];
    if(iwptr >= urptr){
        return iwptr - urptr;
    }else{  /* buffer end is between read and write pointer, return continuous range */
        return RX_SIZE - urptr;
    }
}

/* The following function must be called after uartRxBytesAvailable() to
 * remove the bytes from the receiver buffer.
 */
static inline void  uartRxDidReadBytes(uchar numBytes)
{
    urptr = (urptr + numBytes) & RX_MASK;
}


#endif	/*  #ifndef __ASSEMBLER__  */
#endif  /*  __uart_h_included__  */

⌨️ 快捷键说明

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