SH7268・ダイレクトメモリアクセスコントローラのTEビットが適切なタイミングでセットされない

始めまして。

現在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; //転送サイズ=1byte
DMAC.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データ数トリガ 8
SCIF2.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; // 受信動作を許可

}

 

 

Parents
  • わわいです
    動作の説明を見る限り、通常の動作のように見えます

    FIFO付きのSCIのため、FIFOが空いている限り連続してDMA転送が行なわれ、それが終了したらTEが立ちます
    このため、
    >オシロスコープで確認したところ、シリアル送信1byte目の3clk目あたりでイネーブル信号が終了している模様です。

    という動作となると思われます
Reply
  • わわいです
    動作の説明を見る限り、通常の動作のように見えます

    FIFO付きのSCIのため、FIFOが空いている限り連続してDMA転送が行なわれ、それが終了したらTEが立ちます
    このため、
    >オシロスコープで確認したところ、シリアル送信1byte目の3clk目あたりでイネーブル信号が終了している模様です。

    という動作となると思われます
Children