表題の件が発生しており、至難しております。
なにか抜けている点ありましたらご教授・ご指摘いただければと思います
ひとまずやりたいはRAMからRAMへのデータ転送を任意回数行いたく、DMAを駆動したのですが、様々設定を変えてみても1回しか転送が行われず、何が原因なのか難儀しております
問題が解決しないため、現在転送回数をひとまず2回にしてどのように働くかを見ています
実行しているコード例
---------マイコン起動時に以下のコードを実行
//DMA MSTP_DMAC = 0; IEN(DMAC,DMAC0I) = 0; IPR(DMAC,DMAC0I) = 6; DMAC0.DMCNT.BIT.DTE = 0; //転送停止
---------データ転送を試験するときに、以下のコードを実行
//DMA DMAC0.DMCNT.BIT.DTE = 0; //転送停止
//0:DMA転送要求なし DMAC0.DMREQ.BIT.SWREQ = 0;
//DMA アドレスモード //DM 転送先アドレス更新モード設定 b7 b6 インクリメント 10 //SM 転送元アドレス更新モード設定 b15 b14 アドレス固定 00 DMAC0.DMAMD.BIT.DM = 2; DMAC0.DMAMD.BIT.SM = 0;
//DCTG 転送要求選択 b1 b0 ソフトウェア 00 //SZ データ転送サイズ b9 b8 8bit 00 //DTS リピート領域選択 b13 b12 リピート領域、ブロック領域は設定しない 10 //MD 転送モード設定 b15 b14 ノーマル転送 00 DMAC0.DMTMD.BIT.DCTG = 0; DMAC0.DMTMD.BIT.MD = 0;// DMAC0.DMTMD.BIT.DTS = 2; DMAC0.DMTMD.BIT.SZ = 0; //転送元、転送先、転送回数 DMAC0.DMSAR = (void*)0x8570869; DMAC0.DMDAR = (void*)0x857082d; DMAC0.DMCRA = (uint32)2;
IR(DMAC,DMAC0I) = 0;//要因解除
IEN(DMAC,DMAC0I) = 1;
//転送終了割り込み許可 DMAC0.DMINT.BIT.DTIE = 1; //転送許可 DMAC0.DMCNT.BIT.DTE = 1;
DMAC.DMAST.BIT.DMST = 1;
//1:DMA転送要求あり DMAC0.DMREQ.BIT.SWREQ =1;
-------実行結果
srcData 0x1 0x2 0x3 0x4 0x5 0x6distData 0x1 0x0 0x0 0x0 0x0 0x0 //←0x1が2回転送されることを期待したが、1度しか転送されていない模様
レジスタ群の設定値(実行後)
DMAC0.DMSTS 0 //←DMAコントローラは停止している模様DMAC0.DMSAR 8570869 //←転送本アドレスは固定されていて、予定通りDMAC0.DMDAR 857082e //←転送先アドレスは1回インクリメントされているDMAC0.DMCRA 1 //←転送カウントレジスタが1回デクリメントされている、0になることを期待していたDMAC0.DMAMD 80DMAC0.DMTMD 0DMAC0.DMCNT 1DMAC0.DMREQ 0
なにか指摘有りましたら幸いです。
上記コードで、2バイト転送する場合は、DMAの要求
DMAC0.DMREQ.BIT.SWREQ =1;
を2回実行する必要があると思います。
(DMACの起動トリガを、通信モジュールの受信割り込みに設定した場合、(ソースアドレスは、受信モジュールのRXバッファ)、1回の割り込みで、複数回転送する動作は変です。受信データが10バイトと決まっている場合、転送回数を10に設定すると、10回転送終了後に割り込みが入り、再度アドレスが初期化される動作。転送回数は、1度のトリガで転送される回数ではなく、規定の転送回数転送を行ったタイミングで、次のアクションを起こしたい値。)
DMACを起動する度に、何バイトか(可変)転送する場合は、ブロック転送モードで、都度ブロックサイズを指定する必要があると思います。
コメントありがとうございます。
なるほど、たしかに、マニュアルのDMACm.DMCRALレジスタの設定により、最大65535回データの指定転送回数を設定できます。とあるので、転送回数設定できるだけで、転送できるわけではないのですね。
転送指定回数を設定できるといったが、転送できるとは言っていない。ノーマル転送モードでは1転送ごとに都度の要求の指示、DMAC0.DMREQ.BIT.SWREQ =1をその転送回数ソフトで実行しなければならないということですね。
ブロック転送モードを検討いたします、ありがとうございました