始めまして。
現在SH7268を利用してダイレクトメモリアクセスコントローラのテストを行っております。ダイレクトメモリアクセスコントローラの起動要因はFIFO 内蔵シリアルコミュニケーションインタフェースとしております。
PF17をイネーブル信号として、DMACを利用しシリアル4byteのデータ送信を行うプログラムを作成しました。(詳細下部ソース)DMA チャネルコントロールレジスタのトランスファエンドフラグ(TE)が1になるとイネーブル信号が終了するよう作成しているつもりなのですがオシロスコープで確認したところ、シリアル送信1byte目の3clk目あたりでイネーブル信号が終了している模様です。ちなみにその後、シリアル4byteのデータ送信自体は完了しているようです。この為、DMA転送要求直後にTEビットがセットされていると思われます。DMA転送完了後にTEビットがセットされるようにするにはどの様にしたら宜しいでしょうか。お手数おかけしますがご回答よろしくお願い致します。
//-------------------------------------------------------------------//以下ソース//-------------------------------------------------------------------void main(){char Gate_st[4] = {1,2,3,4};
sd_init();dma_sdt_init();while(1){PORT.PFDR1.BIT.PF17DR = 0; // CS選択dma_sdt_start(Gate1_st,4);PORT.PFDR1.BIT.PF17DR = 1; // CS選択解除}
}
//DMA初期化(CH1)void dma_sdt_init(){CPG.STBCR2.BYTE &= ~0x20; //DMAスタンバイ解除DMAC.CHCR1.BIT.DE = 0; //DMA転送禁止DMAC.CHCR1.BIT.TC = 0; //一回の転送要求で一回転送DMAC.CHCR1.BIT.DM = 0; //転送毎に転送先アドレス固定DMAC.CHCR1.BIT.SM = 1; //転送毎に転送元アドレス増加DMAC.CHCR1.BIT.RS = 8; //転送要求=DMA拡張リソースセレクタDMAC.CHCR1.BIT.TS = 0; //転送サイズ=1byteDMAC.DAR1.LONG = (unsigned long)&SCIF2.SCFTDR.BYTE; //転送先アドレス指定DMAC.DMARS0.BYTE.CH1 = 0x89; //転送要求元設定(SCIF2・送信)DMAC.DMAOR.BIT.DME = 1; //全CHのDMA転送開始(CH2初期化で実行)}
//DMA転送実行(CH1)void dma_sdt_start(long add,long cnt){char dummy;DMAC.SAR1.LONG = add; //転送元アドレス指定DMAC.DMATCR1.LONG = cnt; //転送回数指定dummy = DMAC.CHCR1.BIT.TE; //空読みDMAC.CHCR1.BIT.TE = 0; //転送終了フラグリセット
DMAC.CHCR1.BIT.DE = 1; //DMA転送開始while(DMAC.CHCR1.BIT.TE == 0){}; //DMA転送終了待ちDMAC.CHCR1.BIT.DE = 0; //DMA転送終了}
//SCI初期化void sd_port_init(){CPG.STBCR4.BIT.MSTP45 = 0; // SCI2スタンバイ解除SCIF2.SCSCR.BIT.TE = 0; // 送信動作を禁止SCIF2.SCSCR.BIT.RE = 0; // 受信動作を禁止SCIF2.SCFCR.BIT.TFRST = 1; // リセット動作を許可SCIF2.SCFCR.BIT.RFRST = 1; // リセット動作を許可SCIF2.SCFSR.BIT.ER = 0;SCIF2.SCFSR.BIT.DR = 0;SCIF2.SCFSR.BIT.BRK = 0;
SCIF2.SCFSR.BIT.TDFE = 0;SCIF2.SCFSR.BIT.RDF = 0;
SCIF2.SCLSR.BIT.ORER = 0;SCIF2.SCSMR.BIT.CA = 1; // クロック同期式SCIF2.SCSMR.BIT.CHR = 0; // 8ビットデータSCIF2.SCSMR.BIT.CKS = 0x00; // P1φクロック// (※LSBファースト)SCIF2.SCSCR.BIT.CKE = 0x00; // 内部クロック/SCK端子は同期クロック出力
SCIF2.SCBRR.BIT.D = 14; // n=0 ビットレート1M(bit/s)SCIF2.SCFCR.BIT.RTRG = 0; // 受信FIFOデータ数トリガ 8SCIF2.SCFCR.BIT.TTRG = 0; // 送信FIFOデータ数トリガ
SCIF2.SCFCR.BIT.RFRST = 0; // 受信FIFOデータレジスタ リセット動作を禁止SCIF2.SCFCR.BIT.TFRST = 0; // 送信FIFOデータレジスタ リセット動作を禁止
SCIF2.SCSCR.BIT.TIE = 1; // 送信割込みを許可SCIF2.SCSCR.BIT.RIE = 1; // 受信割込みを許可SCIF2.SCSCR.BIT.TE = 1; // 送信動作を許可// SCIF2.SCSCR.BIT.RE = 1; // 受信動作を許可