2010-11-24 12 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転送を使ってUSARTトランスミッタに対してのみ実装し、メインループからRTSピンをモニタしました。私は私のUSART < - > USBインターフェイスのFIFOに32バイト残っていることを知っているRTSピンがアサートしたとき。

ピンがアサートされると、DMAトリガソース(DMA.CH0.TRIGSRC)がDMA_CH_TRIGSRC_USARTC0_DRE_gcからDMA_CH_TRIGSRC_OFF_gcに変更されます。このようにして、DMAはもはや起動されず、送信が停止されます。 RTSピンが再びLowになると、トリガソースをDMA_CH_TRIGSRC_USARTC0_DRE_gcに戻します。

この方法では、RTS回線のポーリング監視とDMA USART転送を使用する必要があります。私は2MHzのボーレートで動作するFTDI FT232Hでこれを使用しています。