diff options
Diffstat (limited to 'src/uart.c')
-rw-r--r-- | src/uart.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/uart.c b/src/uart.c new file mode 100644 index 0000000..3ba75db --- /dev/null +++ b/src/uart.c @@ -0,0 +1,74 @@ +#include <avr/io.h> +#include <stdio.h> +#include <util/setbaud.h> + +/** UART notes + * UCSR0A: + * 0: MP communication mode + * 1: U2X (double trans speed) + * 2: USART parity error + * 3: Data overrun (udr0 not read before next frame) + * 4: Frame error + * 5: Data register empty (new data can be transmitted) + * 6: USART transmit complete + * 7: USART recieve complete + * ____________________________________________________________ + * UCSR0B: + * 0: transmit data bit 8 + * 1: recieve data bit 8 + * 2: USART char size 0 (used with UCSZ01 and UCSZ00 to set data frame size) + * 3: Transmitter enable + * 4: Reciever enable + * 5: USART data reg empty interrupt table + * 6: TX complete int enable + * 7: RX complete int enable + * ____________________________________________________________ + * UCSR0C: + * 0: Clock polarity (1: falling edge trasmit, recieve rising edge) + * 1: USART char size 0 + * 2: USART char size 1 + * 3: USART stop bit select (1: 1 stop bit, 0: 2 stop bits) + * 4: USART parity mode (00: async, 01: sync) + * 5: USART Parity mode (02: master SPI) + * 6: USART mode select (00: async 01: sync) + * 7: USART mode select (02: master SPI) + * ____________________________________________________________ + * UBRR0(H,L): baudrates + * + **/ + +//TODO replace with static void and just use high level functions? +void uart_sendbyte(uint8_t byte) { + if(byte == '\n') uart_sendbyte('\r'); + loop_until_bit_is_set(UCSR0A, UDRE0); + UDR0 = byte; +} + +//TODO replace with static void and just use high level functions? +uint8_t uart_recvbyte() { + loop_until_bit_is_set(UCSR0A, RXC0); + return UDR0; +} + +void uart_init() { + //set baud rate + UBRR0H = UBRRH_VALUE; + UBRR0L = UBRRL_VALUE; + + +/** +TODO figure out why USE_2X is enable when it shoudn't be + //set baud rate +#ifdef USE_2X //is set by header + UCSR0A |= _BV(U2X0); +#else + UCSR0A &= ~(_BV(U2X0)); +#endif +**/ + + UCSR0A &= ~(_BV(U2X0)); + + UCSR0C = ((_BV(UCSZ01)) | _BV(UCSZ00)); // set 8 bit char size, yes the '=' is intentional + UCSR0B = (_BV(RXEN0) | _BV(TXEN0)); + +} |