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
  • わわいです
    ざっとみたところ、ポート設定がなされていないようにみえます
    RxD、TxD、CKSのラインのポート設定を適切にしてください。

    で、最初はまず、ソフトウエアポーリングで、受信動作を確認してから、DMA駆動に切り替えるというふうにしたほうが不具合の所在がはっきりしていいです
  • 現在、SCFCRレジスタのRTRGビット(受信FIFO データ数トリガ)は「0」と設定されておりました。
    この為、1byte以上のデータを受信するまでは同期クロックが発行されるはずですが
    受信レジスタへのアクセスを行っても一切同期クロックは発行されていません。

    本題の質問から趣旨がかわってしまっている為、質問し直そうと思います。
    その際、またご回答頂けますと幸いです。
  • 同期式での受信の場合、一般的には外部からのクロック供給を受けての受信で使用します
    これは、この受信につながる相手側の送信のタイミングで送信側がクロックを出すためです

    どういう用途でこれを使用されるかはわかりませんが、受信側がクロックを出す必要があるんでしょうか
Reply
  • 同期式での受信の場合、一般的には外部からのクロック供給を受けての受信で使用します
    これは、この受信につながる相手側の送信のタイミングで送信側がクロックを出すためです

    どういう用途でこれを使用されるかはわかりませんが、受信側がクロックを出す必要があるんでしょうか
Children
  • シリアルの通信相手はメモリとなります。
    メモリに書き込んだ内容を読み込む際に受信を行います。
    書き込みも読み込みもマイコン主導となります。
    そしてメモリ側ではクロックを生成する事が出来ません。
    この為に受信時にもマイコンからクロック供給する必要があります。

    やはり、一旦送信を行って擬似的にクロックを生成し、
    その後に受信を行うしかないのでしょうか?
  • わわいです
    すみません、新たな質問に気が付きませんで。
    いまさら移動するのは何なんでここで続けさせてもらいます

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

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