Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: XMega USART
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Sirko
-
Sirko
Использую 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)

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

Где косяк?
Sirko
Понял источник, - когда разрешаю прерывыания, то сразу попадаю в обработчик. Почему?
Перед разрешением, сбрасываю флаги прерываний. Пробовал сбрасывать установкой их в "1" и пробовал "0", - эффект одинаковый
Палыч
Цитата(Sirko @ Jan 17 2012, 11:24) *
Понял источник, - когда разрешаю прерывыания, то сразу попадаю в обработчик. Почему?
Перед разрешением, сбрасываю флаги прерываний. Пробовал сбрасывать установкой их в "1" и пробовал "0", - эффект одинаковый

Какие прерывания? Какие флаги? Флаг DREIF, например, не сбрасывается записью в него ни единицы, ни нуля.
Sirko
Понял.

Сбивает с толку вот эта фраза.

• Bit 5 - DREIF: USART Data Register Empty Flag
The DREIF indicates if the transmit buffer (DATA) is ready to receive new data. The flag is one
when the transmit buffer is empty, and zero when the transmit buffer contains data to be transmitted
that has not yet been moved into the Shift Register. DREIF is set after a reset to indicate
that the Transmitter is ready. Always write this bit to zero when writing the STATUS register.
DREIF is cleared by writing DATA. When interrupt-driven data transmission is used, the Data
Register Empty interrupt routine must either write new data to DATA in order to clear DREIF or
disable the Data Register Empty interrupt. If not, a new interrupt will occur directly after the
return from the current interrupt.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.