2010-11-24 3 views
0

У меня возникли проблемы с управлением потоком USART на Atxmega256. Я общаюсь с модемом, который использует RTS/CTS для управления потоком. Как только модем устанавливает CTS на низкий уровень, я хочу прекратить отправку данных, пока он снова не достигнет высоких значений. В настоящее время я использую процедуры USART с прерываниями и не могу найти хороший способ остановить отправку. Если я просто прекращаю отправку, когда CTS становится низким, данные allready в буферах отправки будут по-прежнему отправляться и, следовательно, потеряться.Управление потоком Atxmega USART

Я попытался последующие отключить/включить отправку:

if(false == clearToSend()) { 
    USART_TxdInterruptLevel_Set(data->usart, USART_TXCINTLVL_OFF_gc); 
    while(false == clearToSend()) {} 
    USART_TxdInterruptLevel_Set(data->usart, USART_TXCINTLVL_LO_gc); 
} 

К сожалению, это, кажется, отключить передачу на постоянной основе. Есть идеи?

С наилучшими пожеланиями Фредрик

ответ

1

После того, как стартовый бит посылается к проволоке, вы должны отправить остальные биты, включая стоп-бит, иначе вы будете повредить данные. Невозможно прекратить отправку данных мгновенно, когда CTS деактивируется, и распространять практику, чтобы разрешить несколько дополнительных байт до прекращения отправки.

Серия XMEGA не имеет никакого глубокого USART FIFO, только регистра сдвига передачи и регистра переноса передачи, поэтому, если ваш код перестает записываться в USART, как только CTS деактивируется, вы должны быть в порядке.

1

У меня была такая же проблема, как вы описали, хотя и с atxmega128a1. Я реализовал это только для передатчика USART, используя передачи DMA и отслеживая вывод RTS из основного контура. Я знаю, что у меня осталось 32 байта в FIFO моего интерфейса USART < -> USB, когда выдает вывод RTS.

Когда контакт подтверждает, я меняю источник триггера DMA (DMA.CH0.TRIGSRC) с DMA_CH_TRIGSRC_USARTC0_DRE_gc на DMA_CH_TRIGSRC_OFF_gc. Таким образом, DMA больше не запускается и останавливает передачу. Когда контакт RTS снова становится низким, я меняю источник триггера на DMA_CH_TRIGSRC_USARTC0_DRE_gc.

Этот метод требует опроса по мониторингу линии RTS и использования передач DMA USART. Я использую это с FTDI FT232H, работающим на скорости 2 МГц.

Смежные вопросы