SH7269 DMA転送を使用したUART送信について

はじめまして。kstと申します。

SH7269にて、DMAの転送元(SAR7)をグローバル変数の配列、転送先(DAR7)を送信シフトレジスタ(SCFTDR_1)として、DMA転送を使用したUART送信を試みています。

送信自体は成功しているのですが、送信データが全て0となる事象が発生しました。

デバッガ上で、SAR7に指定した配列のアドレスが設定されており、配列に0でない値が入っていることは確認できています。

転送元配列の宣言時に初期値を与えたところ、その値が送信されましたが、その後配列の値を書き換えても、初期値が送信されました。

そのため、現在の値に関わらず変数宣言時の初期値が送られる挙動となっているように思われます。

 

DMA転送ではROM領域の転送しかできないということでしょうか?

それとも見落としているレジスタ設定があるのでしょうか?

DMAの設定は以下のようにしています。

----------------------------------------------------------------------------------------------------

//DMACのモジュールスタンバイ解除
CPG.STBCR2.BIT.MSTP8 = 0;


//DMAC7の転送を停止
DMAC.CHCR7.BIT.DE = 0x0;

//転送元のアドレスを指定
DMAC.SAR7.LONG = (unsigned long)&SndData[0];


//転送先のアドレスを指定
DMAC.DAR7.LONG = (unsigned long)&SCIF1.SCFTDR.BYTE;

//転送回数指定
DMAC.DMATCR7.LONG = SndSize;

//チャネルコントロールレジスタの設定

DMAC.CHCR7.LONG = 0x00001800;


//転送要因をTXD1に設定
DMAC.DMARS3.BYTE.CH7 = 0x85;

//DMAマスタを有効
DMAC.DMAOR.WORD = 0x0001;

//DMAC7の転送を許可
//DMAC.CHCR7.BIT.DE = 0x1;

----------------------------------------------------------------------------------------------------

よろしくお願いいたします。

Parents
  • SHの話題という事で、レスがつかないですね。

    自分も使っていないので使い方については書けませんが、この現象は典型的なキャッシュコヒーレンシの問題に見えます。

    取りあえず、キャッシュを無効化するかライトスルーへの変更で現象は変わるのではないでしょうか?

    根本的には、CPUがデータを用意した後でDMA開始する前に該当領域のキャッシュをフラッシュする必要があります。

Reply
  • SHの話題という事で、レスがつかないですね。

    自分も使っていないので使い方については書けませんが、この現象は典型的なキャッシュコヒーレンシの問題に見えます。

    取りあえず、キャッシュを無効化するかライトスルーへの変更で現象は変わるのではないでしょうか?

    根本的には、CPUがデータを用意した後でDMA開始する前に該当領域のキャッシュをフラッシュする必要があります。

Children
  • 回答ありがとうございます。

    ご指摘の通り、キャッシュコヒーレンシの問題でした。

    DMA開始前に該当領域をライトバックすることで、意図したデータが送信できました。

    ありがとうございました。

  • 上手くいったようで、良かったです。

    DMA・DTCはCPUとは別の小さなCPUみたいな物でデバッグがし難いんですよね。

    自分もつい先日RX231のDTCで、仕様を見落としててハマってました。

    ただ、ちゃんと使えばCPUだけでは不可能な性能が達成出来るので、上手く使いたいですね。

    自分は3MbpsのUART×2chの送受信を割込制御では取りこぼしていたのですが、DTCを使う事で問題無く出来るようになりました。