2010-11-24 52 views
0

我在Atxmega256上遇到了USART流量控制問題。我正在與使用RTS/CTS進行流量控制的調制解調器進行通信。一旦調制解調器將CTS設置爲低電平,我想停止發送數據直到它再次變高。我目前使用中斷驅動的USART例程,似乎無法找到停止發送的好方法。如果我只是在CTS變低時停止發送,則發送緩衝區中的所有數據仍將被髮送並因此丟失。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,只有發送移位寄存器和發送保持寄存器,所以如果您的代碼在CTS停用後立即停止寫入USART,則應該沒問題。

1

我有同樣的問題,你描述,儘管atxmega128a1。我通過使用DMA傳輸來實現這一功能,並僅監控來自主環路的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波特率運行。