DMAを使用したUART受信について

毎度お世話になっております。

V850ES/JH3-Eを使用しております。

DMA0の転送起動要因としてUARTC3の受信完了割り込み(INTUC3R)を指定しています。

例えば、DMA0の転送回数を5回、5バイトの受信があった場合、最初の1バイトを受信した時点でDMA0が転送を開始し、その後の4バイトで起こる受信割込みは無視される、という認識で正しいでしょうか。

また、このとき無視される受信割込みの割り込み要求フラグ(UC3RIF)は、DMA転送完了割り込み内でクリアする必要があるのでしょうか。

あと、通信速度が遅い場合、UARTC0の受信レジスタが更新されていないのにDMA0がデータの取得に行ってしまう、ということは起こりうるのでしょうか。

毎度質問ばかりで申し訳ありませんが、
以上、よろしくお願いいたします。
Parents
  • SHの場合は、SCIのみの割り込みでプログラムを作成しておいて、DMAの設定を追加することでSCIの割り込み許可設定を修正しなくても上手く動作できます。チョコさんの書き込みからV850の場合はDMAの設定追加だけではSCIからCPUの割り込みは残ってしまうためSCIの設定変更も必要になるとの理解で良いでしょうか?

    ここからはマト外れの可能性もありますが、ご愛嬌でお許しください。
    dai_toryさんがどこでDMAを起動しているかが気になります。1バイト目の受信完了時にDMAによる4バイト分の転送を起動しているようにも予想されます。プログラムの初期化でDMAを初期化起動しておけば、SCIからCPUへの割り込みは全くかからなくなります。指定したイベントで指定されたサイズ分の転送が実行されるので先取りすることはありません。DMAの割り込みを許可しておいて指定回数分の転送が完了すると、DMAからCPUに割り込みが発生して、DMAを再設定・再起動が一般的に思えます。ここまでは、すとさんの説明の一部の繰り返しと思ってます。
    もしかすると、、、。通信は非同期システム間で実行されるので一貫性のあるかたまりの先頭バイトを見つけてデータを取り込むような処理が必要になります。SCIの割り込みで先頭バイトの判断をしてからDMAで残りを転送を実施しているならば、3かたまり分(15バイト)以上のリングバッファを用意しておいて、とりあえずSCIからのデータを取り込んで、必要なときに最新のまとまったデータを読み出すのが良いと思います。UARTBなら2かたまり以上の16バイトのFIFOがあるからリングバッファやDMA無しで行けそうですね。
Reply
  • SHの場合は、SCIのみの割り込みでプログラムを作成しておいて、DMAの設定を追加することでSCIの割り込み許可設定を修正しなくても上手く動作できます。チョコさんの書き込みからV850の場合はDMAの設定追加だけではSCIからCPUの割り込みは残ってしまうためSCIの設定変更も必要になるとの理解で良いでしょうか?

    ここからはマト外れの可能性もありますが、ご愛嬌でお許しください。
    dai_toryさんがどこでDMAを起動しているかが気になります。1バイト目の受信完了時にDMAによる4バイト分の転送を起動しているようにも予想されます。プログラムの初期化でDMAを初期化起動しておけば、SCIからCPUへの割り込みは全くかからなくなります。指定したイベントで指定されたサイズ分の転送が実行されるので先取りすることはありません。DMAの割り込みを許可しておいて指定回数分の転送が完了すると、DMAからCPUに割り込みが発生して、DMAを再設定・再起動が一般的に思えます。ここまでは、すとさんの説明の一部の繰り返しと思ってます。
    もしかすると、、、。通信は非同期システム間で実行されるので一貫性のあるかたまりの先頭バイトを見つけてデータを取り込むような処理が必要になります。SCIの割り込みで先頭バイトの判断をしてからDMAで残りを転送を実施しているならば、3かたまり分(15バイト)以上のリングバッファを用意しておいて、とりあえずSCIからのデータを取り込んで、必要なときに最新のまとまったデータを読み出すのが良いと思います。UARTBなら2かたまり以上の16バイトのFIFOがあるからリングバッファやDMA無しで行けそうですね。
Children
No Data