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

📄 sw-uart.c

📁 小日本用mega8 做的软件模拟USB 转232
💻 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 "oddebug.h"#include "uart.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/3);        /* 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();
    }
}
uchar uartRxIsBusy(void){    return OCR1C;}
#endif      /* UART_CFG_HAVE_USART */

⌨️ 快捷键说明

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