始めまして。
現在SH7268を利用してダイレクトメモリアクセスコントローラのテストを行っております。
ダイレクトメモリアクセスコントローラの起動要因はFIFO 内蔵シリアルコミュニケーションインタフェースとしております。
PF17をイネーブル信号として、DMACを利用しシリアル4byteのデータ受信を行うプログラムを作成しました。(詳細下部ソース)
シリアル通信内容をオシロスコープで確認したところ、DMACのCHCRレジスタ・DEビットをセットし転送開始命令を行っているにも関わらず
シリアル通信用の同期クロックが全く出ておらず、TEビットが延々とセットされていません。
どの設定に問題があると考えられるでしょうか。
お手数おかけしますがご回答よろしくお願い致します。
//-------------------------------------------------------------------//以下ソース//-------------------------------------------------------------------void main(){char Gate_st[4];
sd_init();dma_sdr_init();while(1){PORT.PFDR1.BIT.PF17DR = 0; // CS選択dma_sdr_start(&Gate1_st,4);PORT.PFDR1.BIT.PF17DR = 1; // CS選択解除}
}
//DMA初期化(CH2)void dma_sdr_init(){ CPG.STBCR2.BYTE &= ~0x20; //DMAスタンバイ解除 DMAC.CHCR2.BIT.DE = 0; //DMA転送禁止 DMAC.CHCR2.BIT.TC = 0; //一回の転送要求で1回転送 DMAC.CHCR2.BIT.DM = 1; //転送毎に転送先アドレス増加 DMAC.CHCR2.BIT.SM = 0; //転送毎に転送元アドレスは固定 DMAC.CHCR2.BIT.RS = 8; //転送要求=DMA拡張リソースセレクタ DMAC.CHCR2.BIT.TS = 0; //転送サイズ=1byte DMAC.SAR2.LONG = (unsigned long)&SCIF2.SCFRDR.BYTE; //転送元アドレス指定 DMAC.DMARS1.BYTE.CH2 = 0x8A; //転送要求元設定(SCIF2・受信) DMAC.DMAOR.BIT.DME = 1; //全CHのDMA転送開始}
//DMA転送実行(CH2)void dma_sdr_start(long add,unsigned short cnt){ char dummy; DMAC.DAR2.LONG = add; //転送先アドレス指定 DMAC.DMATCR2.LONG = cnt; //転送回数指定 dummy = DMAC.CHCR2.BIT.TE; //空読み DMAC.CHCR2.BIT.TE = 0; //転送終了フラグリセット
SCIF2.SCSCR.BIT.RE = 1; // 受信動作を許可 DMAC.CHCR2.BIT.DE = 1; //DMA転送開始 while(DMAC.CHCR2.BIT.TE == 0){}; //DMA転送終了待ち DMAC.CHCR2.BIT.DE = 0; //DMA転送終了 SCIF2.SCSCR.BIT.RE = 0; // 受信動作を禁止}
//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; // 受信動作を許可