Atxmega USART контроль потока - PullRequest
       18

Atxmega USART контроль потока

0 голосов
/ 24 ноября 2010

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 22 мая 2012

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

1 голос
/ 26 ноября 2010

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

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

...