首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Atxmega USART流量控制

Atxmega USART流量控制
EN

Stack Overflow用户
提问于 2010-11-24 18:18:55
回答 2查看 2.3K关注 0票数 0

我在Atxmega256上遇到了一些关于USART流量控制的问题。我正在与使用RTS/CTS进行流量控制的调制解调器通信。一旦调制解调器将CTS设置为低,我想停止发送数据,直到它再次变高。我目前正在使用中断驱动的USART例程,似乎找不到停止发送的好方法。如果我只是在CTS变低时停止发送,发送缓冲区中已准备好的数据仍将被发送,因此会丢失。

我已经尝试了以下方法来禁用/启用发送:

代码语言:javascript
复制
if(false == clearToSend()) {
  USART_TxdInterruptLevel_Set(data->usart, USART_TXCINTLVL_OFF_gc);
  while(false == clearToSend()) {}
  USART_TxdInterruptLevel_Set(data->usart, USART_TXCINTLVL_LO_gc);
}

不幸的是,这似乎永久禁用了发送。有什么想法吗?

向Fredrik致以最好的问候

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-26 16:21:17

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

XMEGA系列没有任何深度USART FIFO,只有传输移位寄存器和传输保持寄存器,因此,如果您的代码在CTS停用后立即停止写入USART,您应该没有问题。

票数 1
EN

Stack Overflow用户

发布于 2012-05-22 17:35:52

我遇到了你所描述的同样的问题,只是使用了atxmega128a1。我只为USART发射器实现了这一点,使用DMA传输,并从主循环监控RTS引脚。我知道当RTS引脚断言时,我的USART<->USB接口的FIFO中还有32个字节。

当引脚有效时,我将直接存储器存取触发源(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传输。我使用的是运行在2 2MHz波特率的FTDI FT232H。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4265672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档