2010-11-24 10 views
0

Ich habe einige Probleme mit USART Flusskontrolle auf dem Atxmega256. Ich kommuniziere mit einem Modem, das RTS/CTS zur Flusskontrolle verwendet. Sobald das Modem CTS auf low setzt, möchte ich keine Daten mehr senden, bis es wieder high wird. Ich benutze derzeit Interrupt-gesteuerte USART-Routinen und finde keine gute Möglichkeit, das Senden zu stoppen. Wenn ich gerade aufhört zu senden, wenn CTS niedrig wird, werden die Daten, die bereits in den Sendepuffern sind, immer noch gesendet und daher verloren.Atxmega USART Flusskontrolle

Ich habe die Folge versucht zu deaktivieren/aktivieren Senden:

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

Leider, dass die Sende dauerhaft zu deaktivieren scheint. Irgendwelche Ideen?

Mit freundlichen Grüßen Fredrik

Antwort

1

Sobald das Startbit an den Draht geschickt wird, haben Sie den Rest der Bits einschließlich des Stop-Bit senden oder aber Sie werden die Daten beschädigt. Es ist nicht möglich, das Senden von Daten sofort zu stoppen, wenn CTS deaktiviert wird, und es ist üblich, einige zusätzliche Bytes zuzulassen, bevor das Senden angehalten wird.

Die XMEGA-Serie hat kein tiefes USART-FIFO, nur das Sende-Schieberegister und ein Sende-Halteregister. Wenn Ihr Code nicht mehr in den USART schreibt, sobald der CTS deaktiviert ist, sollten Sie in Ordnung sein.

1

Ich hatte das gleiche Problem, das Sie beschrieben, wenn auch mit einem atxmega128a1. Ich implementierte dies nur für den USART-Sender durch Verwendung von DMA-Übertragungen und überwachte den RTS-Pin von der Hauptschleife. Ich weiß, dass ich 32 Bytes im FIFO meiner USART < -> USB-Schnittstelle übrig habe, wenn der RTS-Pin bestätigt.

Wenn der Pin bestätigt, ändere ich die DMA-Triggerquelle (DMA.CH0.TRIGSRC) von DMA_CH_TRIGSRC_USARTC0_DRE_gc zu DMA_CH_TRIGSRC_OFF_gc. Auf diese Weise wird der DMA nicht länger ausgelöst und die Übertragung wird angehalten. Wenn der RTS-Pin wieder niedrig wird, ändere ich die Trigger-Quelle zurück zu DMA_CH_TRIGSRC_USARTC0_DRE_gc.

Diese Methode erfordert eine abgefragte Überwachung der RTS-Leitung und die Verwendung von DMA USART-Übertragungen. Ich verwende dies mit einem FTDI FT232H, der mit 2 MHz Baudrate läuft.