Это для 485? Так я переключаю на передачу:
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Запрет приема
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void USART1_Disable_Recive(void)
{
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//UCSR0B &= ~(1 << RXEN0);
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
//Global_Bus_RS485_Dir_TX();
}
Так отправляю:
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Передача байта
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void USART1_Transmit(u8_t data)
{
u16_t tmphead;
tmphead = (usart1.tx_head + 1) & USART1_TX_BUFFER_MASK;
while (tmphead == usart1.tx_tail);
usart1.tx_buf[tmphead] = data;
usart1.tx_head = tmphead;
usart1.flags &= ~(1<<USART1_FLAG_TX_COMPLETE);
usart1.flags &= ~(1<<USART1_FLAG_SHIFT_REG_EMPTY);
#ifdef ALLOW_USART1_TX_DELAY
USART1_TX_Timeout_Init();
#else
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
#endif
}
Так прерывание обрабатываю:
//******************************************************************************************
//Обработчики прерывания USART1
//******************************************************************************************
void USART1_IRQHandler(void)
{
u8_t data;
u16_t tmptail;
u16_t tmphead;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
data = USART_ReceiveData(USART1);
tmphead = ( usart1.rx_head + 1 ) & USART1_RX_BUFFER_MASK;
usart1.rx_head = tmphead;
if ( tmphead == usart1.rx_tail )
{
//ERROR! Receive buffer overflow
}
usart1.rx_buf[tmphead] = data;
}
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
{
tmphead = usart1.tx_head;
if( tmphead != usart1.tx_tail )
{
tmptail = ( usart1.tx_tail + 1 ) & USART1_TX_BUFFER_MASK;
usart1.tx_tail = tmptail;
USART_SendData(USART1, usart1.tx_buf[tmptail]);
}
else
{
USART_ClearITPendingBit(USART1, USART_IT_TC);
USART_ITConfig(USART1, USART_IT_TC, ENABLE);
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
usart1.flags |= (1<<USART1_FLAG_TX_COMPLETE);
}
}
if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)
{
USART_ClearITPendingBit(USART1, USART_IT_TC);
if((usart1.flags & (1<<USART1_FLAG_TX_COMPLETE)) != 0)
{
usart1.flags &= ~(1<<USART1_FLAG_TX_COMPLETE);
usart1.flags |= (1<<USART1_FLAG_SHIFT_REG_EMPTY);
USART1_Enable_Recive();
USART_ITConfig(USART1, USART_IT_TC, DISABLE);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}
}
if(USART_GetITStatus(USART1, USART_IT_LBD) != RESET)
{
USART_ClearITPendingBit(USART1, USART_IT_LBD);
USART1_LBD_Flag_Clr();
}
if(USART_GetITStatus(USART1, USART_IT_ORE) != RESET)
{
USART_ClearITPendingBit(USART1, USART_IT_ORE);
}
}
Как раз if(USART_GetITStatus(USART1, USART_IT_TC) != RESET) проверяет, что данные переданы и можно переключиться на прием..