Прием и передача данных через USART XMEGA

Posted by Reason89 | Posted in , ,


    В передаче данных по 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)
{
    setUpSerial();
    while(1)
    {
        _delay_ms(3000);
        sendString("Hello World!\n\r");
    }
}
Для чтения данных по USART осуществляется практически так же. Используется тот же регистр данных, только необходимо проверять другой бит в регистре STATUS:
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;
}



Comments (0)

Отправить комментарий