Использую 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)
/////////////////////////////////////////////////////////////////////////////////////////////
Где косяк?