リストの皆さん、いつもお世話になっております。
件名のCPUについて教えて下さい。
シリアルポート0(ゼロ)を同期クロック付送受信させています。
同期クロックはCPU(SCK0)から出力しています。
スレーブはこのクロックに同期してCPUにデータを返信します。
で問題ですが。
同期クロックを1Mbpsより早くすると受信するデータが1bitズレマス。
例えば、スレーブの送信が0xaaであれば、CPUの受信データは0x55となってしまいます。
スレーブからの送信データのクロックエッジ(立ち上がり)に対してのタイミングは
セットアップ時間=60nS、ホールド時間=120nSで一見してノイズもなく問題ない波形です。
(測定個所はCPU端子付近)
まとめますと
OK 1Mbps=(XTAL20Mhz駆動でCKS=00、BRR=4)
NG 2.5Mbps=(XTAL20Mhz駆動でCKS=00、BRR=1)
以下ソースです。
/* シリアルポート初期化部分抜粋 */
MSTPCR.BIT.B5 = 0; /* MODULE SCI0 ENABLE........... */
Nop();
/*SCI0.BRR = 4;*/ /* 1Mbps for 20MHz........... */
/*SCI0.BRR = 1;*/ /* 2.5Mbps for 20MHz.......... */
SCI0.BRR = 0; /* 5Mbps for 20MHz.......... */
SCI0.SMR.BIT.CA = 1; /* SERIAL CLK ENABLE............. */
SCI0.SCMR.BIT.SDIR = 1; /* MSB FIRST MODE!............ */
Nop();
SCI0.SCR.BIT.TE = 1;
SCI0.SCR.BIT.RE = 1;
/* 送受信関数 */
unsigned char SendAndReceive0(unsigned char send_data)
{
while(!SCI0.SSR.BIT.TDRE){} /* WAIT TO COMPLETE SENDING DATA */
SCI0.TDR = send_data; /* SEND DATA SET... */
SCI0.SSR.BIT.TDRE = 0; /* SEND START... */
while(!SCI0.SSR.BIT.RDRF){} /* WAIT TO COMPLETE TO RECEIVE DATA */
SCI0.SSR.BIT.RDRF = 0;
return(SCI0.RDR);
}
P.S. 送受信ビット方向はMSBファーストです。
(LSBファースト(デフォルト)でも同様の結果でした。)
以上、何卒宜しくお願い致します。