реклама на сайте
подробности

 
 
> XMega USART
Sirko
сообщение Jan 13 2012, 13:54
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



-

Сообщение отредактировал Sirko - Jan 13 2012, 14:10
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Sirko
сообщение Jan 16 2012, 20:52
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Использую USART в полудуплексе. Отдельно режим прием, отдельно - передача.
Столкнулся вот с такой особенностью:
Каждый раз при переключении с приема на передачу, на выходе TXD что-то возникает. Что, сказать затрудняюсь, но на терминале появляется 0x00.

Вот код "переключателя":
CODE
#define F_CPU 29491200UL
#define BAUD 115200UL
#define BSCALE 1
#define CLOCK2X 0

Init(){
ATOMIC_BLOCK(ATOMIC_RESTORESTATE){
// PORTD.OUT |= PIN3_bm; // Установить вывод TxD в "1"
// PORTD.DIRSET = PIN3_bm; // Настроить его как выход
u16 *p = (u16*) &USART.BAUDCTRLA;
*p = (u16)((((F_CPU / (BAUD * 16 /(1+CLOCK2X*2))) - 1) / (u8)(pow(2, BSCALE)))
| (BSCALE << (8 + USART_BSCALE0_bp)));

USART.CTRLC = USART_CMODE_ASYNCHRONOUS_gc // Асинхронная передача
| USART_CHSIZE_8BIT_gc // Длинаданных 8 битов
| USART_PMODE_EVEN_gc; // Включить проверку четности
USART.CTRLB |= USART_CLK2X_bm * CLOCK2X; // Бит удвоенной скорости (если необходимо)
}
}

/////////////////////////////////////////////////////////////////////////////////////////////

#define SetReceivMode() \
do{ \
USART.CTRLA = USART_TXCINTLVL_OFF_gc /* Запретить прерывания TXC */\
| USART_DREINTLVL_OFF_gc; /* Запретить прерывания DRE */\
u08 tmp = USART.DATA; /* Сбросить флаг RXC */\
USART.CTRLA = USART_RXCINTLVL_LO_gc; /* Разрешить прерывания RXC */\
USART.CTRLB |= USART_RXEN_bm; /* Разрешить работу приемника */\
}while(0)

/////////////////////////////////////////////////////////////////////////////////////////////

#define SetTransmitMode() \
do{ \
USART.CTRLB &= ~USART_RXEN_bm; /* Отключить приемник*/\
USART.CTRLA = USART_RXCINTLVL_OFF_gc; /* Запретить прерывания приема данных */\
USART.STATUS |= USART_DREIF_bm /* Сбросить флаг DRE */\
| USART_TXCIF_bm; /* Сбросить флаг TXC */\
USART.CTRLB |= USART_TXEN_bm; /* Разрешить работу передатчика */\
USART.CTRLA = USART_TXCINTLVL_LO_gc /* Разрешить прерывания TXC */\
| USART_DREINTLVL_LO_gc; /* Разрешить прерывания DRE */\
}while(0)

/////////////////////////////////////////////////////////////////////////////////////////////

Где косяк?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 21:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01413 секунд с 7
ELECTRONIX ©2004-2016