Teacup_Firmware/stepper/serial.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(uint16_t baud)
{
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);
}