Atxmega USART流量控制

时间:2010-11-24 10:18:55

标签: serial-port modem avr-gcc flow-control

我在Atxmega256上遇到了USART流量控制的麻烦。我正在与使用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 个答案:

答案 0 :(得分:1)

一旦将起始位发送到线路,您必须发送包括停止位在内的其余位,否则您将损坏数据。当CTS被停用时,不可能立即停止发送数据,并且通常的做法是在发送停止之前允许一些额外的字节

XMEGA系列没有任何深USART FIFO,只有发送移位寄存器和发送保持寄存器,所以如果CTS被禁用后代码停止写入USART,那么你应该没问题。

答案 1 :(得分:1)

我遇到了你描述的同样的问题,尽管有一个atxmega128a1。我通过使用DMA传输仅对USART发送器实现了这一功能,并监视主循环中的RTS引脚。我知道当RTS引脚置为有效时,我的USART< - > USB接口的FIFO中剩下32个字节。

当引脚置为有效时,我将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,波特率为2MHz。