Прием и передача данных через USART XMEGA
Posted by Nosaer | Posted in Электроника , Atmel , XMEGA
В передаче данных по USART нет ничего сложного. Сначала вы ждете пока регистр данных опустошится, а предыдущие данные будут отправлены. А потом просто подставляете в регистр передачи данных, новую посылку.
Флаг DREIF оповещает о наличии данных в регистре передачи данных. Этот бит находится в регистре состояния USART. Более подробно об этом вы можете узнать на странице 278 в руководстве к МК XMEGA.
Код для отправки одного символа, довольно прост:
void sendChar(char c)Если нужно отправить строку из символов:
{
while( !(USARTC0_STATUS & USART_DREIF_bm) ); //Wait until DATA buffer is empty
USARTC0_DATA = c;
void sendString(char *text)В качестве примера:
{
while(*text)
{
sendChar(*text++);
}
}
int main(void)Для чтения данных по USART осуществляется практически так же. Используется тот же регистр данных, только необходимо проверять другой бит в регистре STATUS:
{
setUpSerial();
while(1)
{
_delay_ms(3000);
sendString("Hello World!\n\r");
}
}
char usart_receiveByte()Обычно используют прерывания, для получения данных.
{
while( !(USARTC0_STATUS & USART_RXCIF_bm) ); //Interesting DRIF didn't work.
return USARTC0_DATA;
}
При передаче данных полезно делать проверку на ошибки:
//Биты Регистра STATUSОбщий код с функцией инициализации и функциями приема передачи, у меня выглядит так:
//#define USART_FERR_bm Флаг ошибки в посылке
//#define USART_PERR_bm Ошибка паритета
//#define USART_BUFOVF_bm Флаг переполнения буфера
//#define USART_DREIF_bm Флаг прерывания по опустошению буфера
//USART_RXCIF_bm Флаг по завершению передачи
char getChar0(void)
{
char buffer0;
while (1)
{
while( !(USARTC0_STATUS & USART_RXCIF_bm) );
buffer0=USARTC0_DATA;
if ((USARTC0_STATUS & (USART_FERR_bm | USART_PERR_bm | USART_BUFOVF_bm))==0)
return buffer0;
};
}
// Функция включения USART_C0, cкорость 115200 bod
void StartUsartC0()
{
USARTC0_BAUDCTRLB = 0;
USARTC0_BAUDCTRLA = 0x04;
USARTC0_CTRLA = 0; //Отключение прерываний
USARTC0_CTRLC = USART_CHSIZE_8BIT_gc; //8 data bits, no parity and 1 stop bit
USARTC0_CTRLB = USART_TXEN_bm | USART_RXEN_bm; //Включение приема передатчика
PORTC_OUTSET = PIN3_bm;
PORTC_DIRSET = PIN3_bm;
PORTC_OUTCLR = PIN2_bm;
PORTC_DIRCLR = PIN2_bm;
}
// Функция получения данных USART_C0.
char getChar0(void)
{
char buffer0;
while (1)
{
while( !(USARTC0_STATUS & USART_RXCIF_bm) );
buffer0=USARTC0_DATA;
if ((USARTC0_STATUS & (USART_FERR_bm | USART_PERR_bm | USART_BUFOVF_bm))==0)
return buffer0;
};
}
// Фунуция передачи данных USART_C0
void sendChar0(char c0)
{
while( !(USARTC0_STATUS & USART_DREIF_bm) );
USARTC0_DATA = c0;
}