お世話になっております。
RX113のRSPIで、富士通のFRAMをスレーブデバイスとして接続し、通信を行っております。
無事にFRAMにステータスリードのコマンドを送信して、下図の通りバス上では正しいレスポンス(0x10)が返ってきました。
しかし、読み取ったSPDRの値はなぜか(0xFF)という値でした。
送受信のソースは次の通りです。
//// FRAM ステータスレジスタ 読み込み// Y_RSPI0_Start(); PORTC.PODR.BIT.B4 = 0; // チップセレクト -> FRAM
while(RSPI0.SPSR.BIT.SPTEF == 0); // RDSR コマンド送信 ( 送信バイト数:1、データ:0x05 )
RSPI0.SPDR.WORD.H = 0x0005; // データの送信 while(RSPI0.SPSR.BIT.IDLNF == 1); // 送信完了待ち RSPI0.SPDR.WORD.H = 0x0000; // レスポンス受信用のクロック送出 while(RSPI0.SPSR.BIT.IDLNF == 1); // 送信完了待ち
while(RSPI0.SPSR.BIT.SPRF == 0); // 受信バッファフルの確認 FRAM_READ_STR = RSPI0.SPDR.WORD.H;
PORTC.PODR.BIT.B4 = 1; // チップセレクト 解除 Y_RSPI0_Stop();
バス上の信号(0x10)が何故0xFFになるのか、何処に原因があるのかわかりません。
リードするタイミングでしょうか。お手数をおかけしますが、ご教示願います。
※ コードの作成では、過去スレッドのつくしさんの回答を参考にさせていただきました。
LEON様
SPTEFに変えて試してみましたところ、さらに摩訶不思議な状態になってしまいました。
それが下図です。
なんと、3線式で、全ての処理を終えてからチップセレクトを1にしているはずなのに、コマンド(0x05)を送信したところで強制的にポートが1に変わり、受信用に出しているはずのクロックも出なくなるという状態になりました。コマンドを送出したあとの命令が全部無視された状態です。(?o?;)これって何??
画像をよく観察すると、どうもSPIのバスラインを初期化しているように見えます。
ソースは、次の通りです。
試験用に入れた命令のコメントアウトがあちこちにあるため、読みにくいソースになってしまっていますが、ご容赦願います。
スレーブに送出するコマンドと、受信用に送出するときに入れていたIDLNFをSPTEFに変更したところ、上図に示す波形になってしまいました。
//// FRAM ステータスレジスタ 読み込み//
Y_RSPI0_Start(); PORTC.PODR.BIT.B4 = 0; // チップセレクト -> FRAM
RSPI0.SPDR.WORD.H = 0x0005; // データの送信 // dummy = RSPI0.SPSR.BYTE; while(RSPI0.SPSR.BIT.SPTEF == 0); // 送信完了待ち // while(RSPI0.SPSR.BIT.IDLNF == 1); // 送信完了待ち
RSPI0.SPDR.WORD.H = 0x0000; // 受信用ダミー送出 // dummy = RSPI0.SPSR.BYTE; while(RSPI0.SPSR.BIT.SPTEF == 0); // 送信完了待ち // while(RSPI0.SPSR.BIT.IDLNF == 1); // 送信完了待ち
while(RSPI0.SPSR.BIT.SPRF == 0); // 受信バッファフルの確認 // dummy = RSPI0.SPDR.WORD.H;
// RSPI0.SPSR.BIT.SPTEF = 1; // 送信バッファエンプティフラグのクリア // dummy = RSPI0.SPSR.BYTE; // while(RSPI0.SPSR.BIT.SPRF == 0); // 受信バッファフルの確認
FRAM_READ_STR = RSPI0.SPDR.WORD.H; // RSPI0.SPSR.BIT.SPRF = 1;
PORTC.PODR.BIT.B4 = 1; // チップセレクト 解除 PORTF.PODR.BIT.B7 = 0;
Y_RSPI0_Stop();