generic USART access implementation
More...
#include "config.h"
#include "usarts.h"
#include <avr/interrupt.h>
#include "xpal_board.h"
#include "usarts_int.h"
#include "usarts_all.h"
#include "baud-params.h"
Detailed Description
generic USART access implementation
Function Documentation
change baud rate for USART
usart_change_baudrate() increases or decreases the baudrate of the USART according to the sign of incdec.
- Parameters:
-
| uc | pointer to USART control structure |
| incdec | >0: increase rate, <0: decrease rate by one step |
- Returns:
- baud rate after change
{
const struct serial_param_s *p;
uint16_t rate_used = UBRRn(uc);
uint8_t using_2x = UCSRnA(uc) & _BV(U2X0);
uint16_t rate;
uint8_t use_2x;
for (p = serial_param; (rate = pgm_read_word(&p->rate)); p++) {
if (rate == rate_used && (using_2x!=0) == (pgm_read_byte(&p->use_2x) != 0))
break;
}
if (rate == 0) return 0;
if (incdec < 0) {
if (p == serial_param)
return pgm_read_dword (&p->baud);
p--;
rate = pgm_read_word(&p->rate);
use_2x = pgm_read_byte (&p->use_2x);
} else if (incdec > 0) {
p++;
rate = pgm_read_word (&p->rate);
if (rate == 0)
return pgm_read_dword (&p[-1].baud);
use_2x = pgm_read_byte (&p->use_2x);
} else {
return pgm_read_dword (&p->baud);
}
UBRRn(uc) = rate;
if (use_2x)
UCSRnA(uc) |= _BV(U2X0);
else
UCSRnA(uc) &= ~_BV(U2X0);
return pgm_read_dword (&p->baud);
}
disable USART
- Parameters:
-
| uc | pointer to USART control structure |
{
UCSRnB(uc) &= ~(_BV(RXCIE0)|_BV(TXCIE0)|_BV(UDRIE0)
|_BV(RXEN0)|_BV(TXEN0));
}
enable USART
This actually switches on the USART indicated by uc.
- Parameters:
-
| uc | pointer to USART control structure |
power-off USART
This puts the USART into power-down mode
- Parameters:
-
| uc | pointer to USART control structure |
| onoff | when 0, power-off; else power-on |
set baud rate for USART
- Parameters:
-
| uc | pointer to USART control structure |
| baud | wanted rate |
- Returns:
- actual rate, 0 if not possible
{
const struct serial_param_s *p;
baudrate_t bd;
for (p = serial_param; (bd = pgm_read_dword(&p->baud), bd && (bd != baud)); p++);
if (bd) {
uint16_t rate = pgm_read_word (&p->rate);
uint8_t use_2x = pgm_read_byte (&p->use_2x);
UBRRn(uc) = rate;
if (use_2x)
UCSRnA(uc) |= _BV(U2X0);
else
UCSRnA(uc) &= ~_BV(U2X0);
return baud;
}
return 0;
}