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

📄 sw-uart.c

📁 AVR单片机模拟USB实现CDC类串行口
💻 C
字号:
/* Name: sw-uart.c
 * Project: AVR USB driver for CDC interface on Low-Speed USB
 * Author: Osamu Tamura
 * Creation Date: 2006-06-22
 * Tabsize: 4
 * Copyright: (c) 2006 by Recursion Co., Ltd.
 * License: Proprietary, free under certain conditions. See Documentation.
 *
 *  2006-07-10 software-UART interrupt handling time reduced.
 */

/*
General Description:
*/

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>   /* needed by usbdrv.h */
#include "oddebug.h"
#include "uart.h"
#include "usbdrv.h"

#if !UART_CFG_HAVE_USART

extern uchar    bit_reverse( uchar x );

/* UART buffer */
uchar    urptr, uwptr, irptr, iwptr;
uchar    rx_buf[RX_SIZE], tx_buf[TX_SIZE];


void uartInit(ulong baudrate, uchar parity, uchar stopbits, uchar databits)
{

    PRR     = (1<<PRADC);
    ACSR    = (1<<ACD);


    UART_DDR    |= (1<<UART_CFG_TXD);
    UART_DDR    &= ~(1<<UART_CFG_RXD);

    GIMSK    &= ~(1<<PCIE);
    TCCR0A   = 0;
    TCCR0B   = 0;
    TCCR1    = 0;

	USISR   = 0xe0;						    /* clear all interrupt flags */
	USICR   = (1<<USIOIE)|(1<<USIWM0)|(1<<USICS0);	/* 3 wire mode       */

#if UART_CFG_INVERT
	USIDR   = 0;
#else
	USIDR   = 0xff;
#endif

    OCR0A    =
    OCR1A    = (F_CPU/64L) / (unsigned int)baudrate - 1;
    OCR1C    = 0;
    DT1A     = -(OCR1A>>1);        /* 1.5 sample bit */

    TCCR0A   = 2;                 /* CTC */
    DT1B     = 1;
    TIMSK    = (1<<OCIE1A);

    PCMSK    = 1<<UART_CFG_RXD;   /*  PCINTn  */
    GIMSK    |= (1<<PCIE);
}

void uartPoll(void)
{

    /* receive data     */
    if( DT1B==0 ) {
        DT1B     = 1;
        uartRxBufAppend( EEDR );
    }

    /*  transmit data   */
    if( irptr!=uwptr && TCCR0B==0 ) {
        uchar       data;

        data    = bit_reverse( tx_buf[irptr] );
        irptr   = (irptr+1) & TX_MASK;

        TCNT0   = 0;
		USISR   = 0x4b;						/* interrupt at D4  */
        EEARL   = 0;  	    				/* usi_phase  */

#if UART_CFG_INVERT
		OCR0B   = ~((data<<4) | 0x0f);
#else
		OCR0B   = ((data<<4) | 0x0f);	    /* D4-7, stop bit   */
#endif
        cli();
#if UART_CFG_INVERT
		USIDR   = ~(data>>1);
#else
		USIDR   = (data>>1);				/* startbit, D0-3   */
#endif
        TCCR0B  = 3;                        /* start timer0: 1/64 clk */
        sei();

        /*    usb -> rs232c:  ready to receive?    */
        if( usbAllRequestsAreDisabled() && uartTxBytesFree()>8 ) {
            usbEnableAllRequests();
        }
    }
}

uchar uartRxIsBusy(void)
{
    return OCR1C;
}

#endif      /* UART_CFG_HAVE_USART */


⌨️ 快捷键说明

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