SH7268・ダイレクトメモリアクセスコントローラを利用したシリアル通信でのよみこみが出来ない

始めまして。

現在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データ数トリガ 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
  • わわいです
    すみません、新たな質問に気が付きませんで。
    いまさら移動するのは何なんでここで続けさせてもらいます

    送信は使わない、受信のみという場合なら、ダミーの送信を行ってそのときに受信するという方がスマートですが、送信の処理が加わることになりますね。

    別の方法としては、タイマの出力でクロックを出して、クロックが出ている間に読み出しを行い、規定の読み込みが終わったらタイマ出力を止めに行く、という方法もありますが
  • 了解しました。
    従来の通り、ダミーの送信を行った後に受信を行おうと思います。
    (今回使用しているマイコンとは異なりますがrenesasが配布しているサンプルコードの中で今回行いたい内容と同じように
    クロックをマイコンからのみ発行するものを見つけましたが、やはりダミーの送信を行っていました。)
Reply
  • 了解しました。
    従来の通り、ダミーの送信を行った後に受信を行おうと思います。
    (今回使用しているマイコンとは異なりますがrenesasが配布しているサンプルコードの中で今回行いたい内容と同じように
    クロックをマイコンからのみ発行するものを見つけましたが、やはりダミーの送信を行っていました。)
Children
No Data