📄 sw-uart.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 + -