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.
235 lines
4.1 KiB
235 lines
4.1 KiB
/*
|
|
* hal_usart.c
|
|
*
|
|
* Created: 08-Nov-18 17:40:43
|
|
* Author: Edwin
|
|
*/
|
|
|
|
|
|
// http://ee-classes.usc.edu/ee459/library/documents/avr_intr_vectors/
|
|
|
|
#define BAUD_PRESCALE(baude_val) (((F_CPU / (baude_val * 16UL))) - 1)
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "hal_usart.h"
|
|
#include "dummy.h"
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
static charSize_t charakterSize = charSize_8BIT;
|
|
|
|
static fptr_t rxCallback = dummy;
|
|
static fptr_t dataRegEmptyCallback = dummy;
|
|
static fptr_t txCallback = dummy;
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void hal_USART_enableModule()
|
|
{
|
|
PRR &= ~(1 <<PRUSART0);
|
|
}
|
|
|
|
void hal_USART_dissableModule()
|
|
{
|
|
PRR |= (1 <<PRUSART0);
|
|
}
|
|
|
|
uint8_t hal_USART_readDataReg()
|
|
{
|
|
return UDR0;
|
|
}
|
|
|
|
uint16_t hal_USART_readDataReg_9Bit()
|
|
{
|
|
return (((UCSR0B & 0x01) << 8) | UDR0);
|
|
}
|
|
|
|
void hal_USART_writeDataReg(uint8_t data)
|
|
{
|
|
UDR0 = data;
|
|
}
|
|
|
|
void hal_USART_writeDataReg_9Bit(uint16_t data)
|
|
{
|
|
UCSR0B |= (data >> 8);
|
|
UDR0 = data;
|
|
}
|
|
|
|
// not sure yet
|
|
uint8_t hal_USART_checkRxFrameErr()
|
|
{
|
|
return ((UCSR0A & (1 << FE0)) >> FE0);
|
|
}
|
|
// not sure yet
|
|
uint8_t hal_USART_checkRxDataOverRun()
|
|
{
|
|
return ((UCSR0A & (1 << DOR0)) >> DOR0);
|
|
}
|
|
|
|
uint8_t hal_USART_checkRxParityErr()
|
|
{
|
|
return ((UCSR0A & (1 << UPE0)) >> UPE0);
|
|
}
|
|
|
|
void hal_USART_enableDoubleTxSpeed()
|
|
{
|
|
UCSR0A = (UCSR0A & (1 << MPCM0)) | (1 << U2X0);
|
|
}
|
|
|
|
void hal_USART_dissableDoubleTxSpeed()
|
|
{
|
|
UCSR0A = (UCSR0A & (1 << MPCM0));
|
|
}
|
|
|
|
void hal_USART_enableMultiProcessorComMode()
|
|
{
|
|
UCSR0A = (UCSR0A & (1 << U2X0)) | (1 << MPCM0);
|
|
}
|
|
|
|
void hal_USART_dissableMultiProcessorComMode()
|
|
{
|
|
UCSR0A = (UCSR0A & (1 << U2X0));
|
|
}
|
|
|
|
void hal_USART_RxEnable()
|
|
{
|
|
UCSR0B |= (1 << RXEN0);
|
|
}
|
|
|
|
void hal_USART_RxDissable()
|
|
{
|
|
UCSR0B &= ~(1 << RXEN0);
|
|
}
|
|
|
|
void hal_USART_TxEnable()
|
|
{
|
|
UCSR0B |= (1 << TXEN0);
|
|
}
|
|
|
|
void hal_USART_TxDissable()
|
|
{
|
|
UCSR0B &= ~(1 << TXEN0);
|
|
}
|
|
|
|
void hal_USART_setMode(mode_t mode)
|
|
{
|
|
UCSR0C &= ~((1 << UMSEL00) | (1 << UMSEL01));
|
|
UCSR0C |= (mode << UMSEL00);
|
|
}
|
|
|
|
void hal_USART_setParityMode(parityMode_t mode)
|
|
{
|
|
UCSR0C &= ~((1 << UPM00) | (1 << UPM01));
|
|
UCSR0C |= (mode << UPM00);
|
|
}
|
|
|
|
void hal_USART_setStopBits(stopBit_t bit)
|
|
{
|
|
UCSR0C &= ~(1 << USBS0);
|
|
UCSR0C |= (bit << USBS0);
|
|
}
|
|
|
|
void hal_USART_setCharSize(charSize_t size)
|
|
{
|
|
/*
|
|
UCSR0C &= ~((1 << UCSZ00) | (1 << UCSZ01));
|
|
//UCSR0C |= (1 << UCSZ00) | (1 << UCSZ01);
|
|
UCSR0C |= (size & 0x03) << 1;
|
|
*/
|
|
charakterSize = size;
|
|
size &= 0x07;
|
|
|
|
UCSR0B &= ~(1 << UCSZ02);
|
|
UCSR0C &= ~((1 << UCSZ00) | (1 << UCSZ01));
|
|
|
|
//UCSR0B |= size & 0x04;
|
|
UCSR0C |= (size & 0x03) << 1;
|
|
|
|
}
|
|
|
|
void hal_USART_setClockPolarity(clkPol_t polarity)
|
|
{
|
|
UCSR0C &= ~(1 << UCPOL0);
|
|
UCSR0C |= (polarity << UCPOL0);
|
|
}
|
|
|
|
void hal_USART_setBaudRate(uint32_t baudRate)
|
|
{
|
|
//baudRate &= 0x0FFF;
|
|
UBRR0L = ((((F_CPU / (baudRate * 16UL))) - 1));
|
|
UBRR0H = (((((F_CPU / (baudRate * 16UL))) - 1)) >> 8);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
void hal_USART_registerRxCallback(fptr_t callback)
|
|
{
|
|
rxCallback = callback;
|
|
UCSR0B |= (1 << RXCIE0);
|
|
}
|
|
|
|
void hal_USART_unregisterRXCallback()
|
|
{
|
|
UCSR0B &= ~(1 << RXCIE0);
|
|
rxCallback = dummy;
|
|
}
|
|
|
|
void hal_USART_registerDataRegEmptyCallback(fptr_t callback)
|
|
{
|
|
UCSR0B |= (1 << UDRIE0);
|
|
dataRegEmptyCallback = callback;
|
|
}
|
|
|
|
void hal_USART_unregisterDataRegEmptCallback()
|
|
{
|
|
UCSR0B &= ~(1 << UDRIE0);
|
|
dataRegEmptyCallback = dummy;
|
|
}
|
|
|
|
void hal_USART_registerTxCallback(fptr_t callback)
|
|
{
|
|
UCSR0B |= (1 << TXCIE0);
|
|
txCallback = callback;
|
|
}
|
|
|
|
void hal_USART_unregisterTXCallback()
|
|
{
|
|
UCSR0B &= ~(1 << TXCIE0);
|
|
txCallback = dummy;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
void hal_USART_putc(const char send)
|
|
{
|
|
// Do nothing for a bit if there is already
|
|
// data waiting in the hardware to be sent
|
|
while ((UCSR0A & (1 << UDRE0)) == 0);
|
|
UDR0 = send;
|
|
}
|
|
|
|
void hal_USART_puts(const char *send)
|
|
{
|
|
// Cycle through each character individually
|
|
while (*send != '\0')
|
|
{
|
|
hal_USART_putc(*send++);
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
ISR (USART_RX_vect)
|
|
{
|
|
rxCallback();
|
|
}
|
|
|
|
ISR(USART_UDRE_vect)
|
|
{
|
|
dataRegEmptyCallback();
|
|
}
|
|
|
|
ISR(USART_TX_vect)
|
|
{
|
|
txCallback();
|
|
} |