73 lines
1.2 KiB
C
73 lines
1.2 KiB
C
#include "serial.h"
|
|
|
|
#include "ringbuffer.h"
|
|
|
|
#define BUFSIZE 64 + sizeof(ringbuffer)
|
|
#define BAUD 19200
|
|
|
|
volatile uint8_t _rx_buffer[BUFSIZE];
|
|
volatile uint8_t _tx_buffer[BUFSIZE];
|
|
|
|
void serial_init()
|
|
{
|
|
ringbuffer_init(rx_buffer, BUFSIZE);
|
|
ringbuffer_init(tx_buffer, BUFSIZE);
|
|
|
|
UCSR0A = 0;
|
|
UCSR0B = (1 << RXEN0) | (1 << TXEN0);
|
|
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
|
|
|
|
UBRR0 = ((F_CPU / 16) / BAUD) - 1;
|
|
|
|
UCSR0B |= (1 << RXCIE0) | (1 << UDRIE0);
|
|
}
|
|
|
|
ISR(USART_RX_vect)
|
|
{
|
|
ringbuffer_writechar(rx_buffer, UDR0);
|
|
}
|
|
|
|
ISR(USART_UDRE_vect)
|
|
{
|
|
if (ringbuffer_canread(tx_buffer))
|
|
{
|
|
UDR0 = ringbuffer_readchar(tx_buffer);
|
|
}
|
|
else
|
|
{
|
|
UCSR0B &= ~(1 << UDRIE0);
|
|
}
|
|
}
|
|
|
|
uint16_t serial_rxchars()
|
|
{
|
|
return ringbuffer_canread(rx_buffer);
|
|
}
|
|
|
|
uint16_t serial_txchars()
|
|
{
|
|
return ringbuffer_canread(tx_buffer);
|
|
}
|
|
|
|
uint8_t serial_popchar()
|
|
{
|
|
return ringbuffer_readchar(rx_buffer);
|
|
}
|
|
|
|
uint16_t serial_recvblock(uint8_t *block, int blocksize)
|
|
{
|
|
return ringbuffer_readblock(rx_buffer, block, blocksize);
|
|
}
|
|
|
|
void serial_writechar(uint8_t data)
|
|
{
|
|
ringbuffer_writechar(tx_buffer, data);
|
|
UCSR0B |= (1 << UDRIE0);
|
|
}
|
|
|
|
void serial_writeblock(uint8_t *data, int datalen)
|
|
{
|
|
ringbuffer_writeblock(tx_buffer, data, datalen);
|
|
UCSR0B |= (1 << UDRIE0);
|
|
}
|