0

Atxmega256 の USART フロー制御に問題があります。フロー制御に RTS/CTS を使用するモデムと通信しています。モデムが CTS を Low に設定したら、再び High になるまでデータの送信を停止したいと考えています。現在、割り込み駆動の 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);
}

残念ながら、それは送信を永久に無効にしているようです。何か案は?

よろしくフレドリック

4

2 に答える 2

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回線のポーリング監視とDMAUSART転送の使用が必要です。これを2MHzボーレートで動作するFTDIFT232Hで使用しています。

于 2012-05-22T09:35:51.977 に答える
1

スタート ビットがワイヤに送信されたら、ストップ ビットを含む残りのビットを送信する必要があります。そうしないと、データが破損します。CTS が非アクティブ化されたときにデータの送信を即座に停止することはできず、送信が停止される前に数バイト余分に許可するのが一般的な方法です。

XMEGA シリーズには深い USART FIFO がなく、送信シフト レジスタと送信保持レジスタだけがあるため、CTS が非アクティブになるとすぐにコードが USART への書き込みを停止しても問題ありません。

于 2010-11-26T08:21:17.083 に答える