現在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);}
//----------------------------------------------------//受信部ソース②(対応策)//----------------------------------------------------
SCIF2.SCSCR.BIT.RE = 1; // 受信動作を許可
sd_1byte_t(DUMMY); //空送信(内部クロック利用の為、擬似的に外部クロックを生成する)
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; } }}