SH7268・FIFO 内蔵シリアルコミュニケーションインタフェースを利用したシリアル受信時に同期クロックが発行されない

現在SH7268を利用してFIFO 内蔵シリアルコミュニケーションインタフェースのテストを行っております。
シリアル1byteのデータ受信を行うプログラムを作成しました。(詳細下部ソース)
クロック同期式・クロックソース=内部クロックを選択しております。

しかし、データ送信時には送信レジスタへデータを書き込めば自動的に
同期クロックを生成してくれるのですが
データ受信時に受信レジスタへアクセスしても同期クロックの生成は行ってくれないようです。
この為、ダミーデータの送信を行った後に受信レジスタへアクセスを行っております。(受信部ソース②参照)

今後DMACコントローラを用いたシリアル受信を想定している為
受信レジスタへアクセスすれば自動的に同期クロックを生成したいのですがどのようにしたらよろしいでしょうか?
ご回答よろしくお願い致します。

//-------------------------------以下ソース------------------------------------

//----------------------------------------------------
//共通部
//----------------------------------------------------

void main(){
char val;

port_init();
sd_port_init();

while(1){
val = sd_1byte_r();
}
}

void port_init(){

PORT.PFCR3.BIT.PF13MD = 4; // SCK2
PORT.PFCR3.BIT.PF14MD = 4; // RxD2
PORT.PFCR4.WORD = 0x5A04; // TxD2

}

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; // 受信動作を許可

}

//----------------------------------------------------
//受信部ソース①(理想)
//----------------------------------------------------

unsigned char sd_1byte_r(){
unsigned char moji,r_flag = 0, val = 0;

SCIF2.SCSCR.BIT.RE = 1; // 受信動作を許可
val = SCIF2.SCFRDR.BIT.D;

while(1){
r_flag = SCIF2.SCFSR.BIT.RDF;
val = SCIF2.SCFDR.BIT.R;
if( r_flag == 1 ){ //RDREビットが1
moji = SCIF2.SCFRDR.BIT.D;

SCIF2.SCFSR.BIT.RDF = 0;
SCIF2.SCSCR.BIT.RE = 0; // 受信動作を禁止
break;
}
}
return(moji);
}


//----------------------------------------------------
//受信部ソース②(対応策)
//----------------------------------------------------

unsigned char sd_1byte_r(){
unsigned char moji,r_flag = 0, val = 0;

SCIF2.SCSCR.BIT.RE = 1; // 受信動作を許可

sd_1byte_t(DUMMY); //空送信(内部クロック利用の為、擬似的に外部クロックを生成する)

while(1){
r_flag = SCIF2.SCFSR.BIT.RDF;
val = SCIF2.SCFDR.BIT.R;
if( r_flag == 1 ){ //RDREビットが1
moji = SCIF2.SCFRDR.BIT.D;

SCIF2.SCFSR.BIT.RDF = 0;
SCIF2.SCSCR.BIT.RE = 0; // 受信動作を禁止
break;
}
}
return(moji);
}

void sd_1byte_t(unsigned char chara){
unsigned char t_flag = 0,dummy;

while(1){
t_flag = SCIF2.SCFSR.BIT.TDFE;
if( t_flag == 1 ){ // TDFEビットが1(TDRからTSRにデータ転送済み)
SCIF2.SCFTDR.BIT.D = chara;
SCIF2.SCFSR.BIT.TDFE = 0;
SCIF2.SCFSR.BIT.TEND = 0;
break;
}
}
}

Parents
  • 「データ受信時に受信レジスタへアクセス」してもということで、
    SCIF2.SCFRDR.BIT.Dは受信データレジスタですから、
    これを読み込んでもクロックは出ないのではないでしょうか、
    (読み込んだ後にクロックを出しても意味がないと思いますので)、
    要するに読み込みのタイミングがわからないので受信時にクロックを出すようになって
    いないのではないかと思います、
    私も前に(ずいぶん昔MMCをやった時にそのようなことになったと思います)、
    ダミークロックというかこちら側からクロック出力してやる設定なので、
    なにかしらクロックがないと受信データは入ってきません。
Reply
  • 「データ受信時に受信レジスタへアクセス」してもということで、
    SCIF2.SCFRDR.BIT.Dは受信データレジスタですから、
    これを読み込んでもクロックは出ないのではないでしょうか、
    (読み込んだ後にクロックを出しても意味がないと思いますので)、
    要するに読み込みのタイミングがわからないので受信時にクロックを出すようになって
    いないのではないかと思います、
    私も前に(ずいぶん昔MMCをやった時にそのようなことになったと思います)、
    ダミークロックというかこちら側からクロック出力してやる設定なので、
    なにかしらクロックがないと受信データは入ってきません。
Children
No Data