You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
1.8 KiB
96 lines
1.8 KiB
/** @file usart1.c
|
|
@author Michael Hayes
|
|
@date 10 March 2005
|
|
|
|
@brief Routines for interfacing with the usart1 on an Atmega32u2
|
|
*/
|
|
#include "system.h"
|
|
#include "usart1.h"
|
|
#include <avr/io.h>
|
|
|
|
void
|
|
usart1_baud_divisor_set (uint16_t divisor)
|
|
{
|
|
UBRR1H = (divisor - 1) >> 8;
|
|
UBRR1L = (divisor - 1) & 0xFF;
|
|
}
|
|
|
|
|
|
uint8_t
|
|
usart1_init (const usart1_cfg_t *cfg)
|
|
{
|
|
uint8_t bits;
|
|
|
|
usart1_baud_divisor_set (cfg->baud_divisor);
|
|
|
|
/* Default to 8 bits. */
|
|
bits = cfg->bits;
|
|
if (bits < 5 || bits > 8)
|
|
bits = 8;
|
|
|
|
/* Enable receiver and transmitter. */
|
|
UCSR1B = BIT (RXEN1) | BIT (TXEN1);
|
|
|
|
/* Set frame format: asynchronous USART, 1 stop bit, no parity. */
|
|
UCSR1C = ((bits - 5) << UCSZ10) | (0 << UPM10);
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
/** Return non-zero if there is a character ready to be read. */
|
|
bool
|
|
usart1_read_ready_p (void)
|
|
{
|
|
return (UCSR1A & BIT (RXC1)) != 0;
|
|
}
|
|
|
|
|
|
/** Return non-zero if a character can be written without blocking. */
|
|
bool
|
|
usart1_write_ready_p (void)
|
|
{
|
|
return (UCSR1A & BIT (UDRE1)) != 0;
|
|
}
|
|
|
|
|
|
/** Return non-zero if transmitter finished. */
|
|
bool
|
|
usart1_write_finished_p (void)
|
|
{
|
|
return (UCSR1A & BIT (TXC1)) != 0;
|
|
}
|
|
|
|
|
|
/** Write character to USART1. This blocks until the character can be
|
|
written into transmit register. */
|
|
void
|
|
usart1_putc (char ch)
|
|
{
|
|
while (!usart1_write_ready_p ())
|
|
continue;
|
|
|
|
UDR1 = ch;
|
|
}
|
|
|
|
|
|
/** Read character from USART1. This blocks until a character is read. */
|
|
int8_t
|
|
usart1_getc (void)
|
|
{
|
|
/* Wait for something in receive buffer. */
|
|
while (!usart1_read_ready_p ())
|
|
continue;
|
|
|
|
return UDR1;
|
|
}
|
|
|
|
|
|
/** Write string to USART1. This blocks until the string is written. */
|
|
void
|
|
usart1_puts (const char *str)
|
|
{
|
|
while (*str)
|
|
usart1_putc (*str++);
|
|
}
|