RSPIのMISOA信号とSPDRより読み取った値が異なってしまいます。

お世話になっております。

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になるのか、何処に原因があるのかわかりません。

リードするタイミングでしょうか。お手数をおかけしますが、ご教示願います。

 

※ コードの作成では、過去スレッドのつくしさんの回答を参考にさせていただきました。

Parents
  • こんにちは、
    MSBファーストとして、波形を確認すると最初のフレームでH'FFとなってませんか?
    その次の波形でH'02が受信されているように見えます。
    最初はH'FFで次のデータがH'02になってませんか?
  • SA様
    お世話になっております。

    > MSBファーストとして、波形を確認すると最初のフレームでH'FFとなってませんか?

    最初のフレームのMISOAの波形は0xFFに見えますが、この期間はSPDRからMOSIAに0x05が送出されています。
    スレーブであるFRAMは、そのコマンド(0x05)を受けて0x02を返してきています。
    SPDRは、送信と受信で共用しており、そのそれぞれでフレームバッファにシフトレジスタで送っていますので、レジスタに残っているのはちょっと考えにくいです。
Reply
  • SA様
    お世話になっております。

    > MSBファーストとして、波形を確認すると最初のフレームでH'FFとなってませんか?

    最初のフレームのMISOAの波形は0xFFに見えますが、この期間はSPDRからMOSIAに0x05が送出されています。
    スレーブであるFRAMは、そのコマンド(0x05)を受けて0x02を返してきています。
    SPDRは、送信と受信で共用しており、そのそれぞれでフレームバッファにシフトレジスタで送っていますので、レジスタに残っているのはちょっと考えにくいです。
Children
  • チョコです。
    横から失礼します。
    シフトレジスタが送信と受信で共用しているということなので,送信と受信は並行して実行していることに
    なります(RSPIは送受信動作に設定されている)。
    つまり,コマンド(0x05)をMOSI端子から送信しているときにも,RSPIはMISO端子からデータを受信して
    シフトレジスタに取り込んでいるはずです。0x05を送信しているときのMISO信号がHighなので,受信
    データは0xFFになっていると考えられます。
    この状態で,次にデータを受信するために0x00を書き込んでいるようですが,RX113のマニュアルの
    「32.3.6.1 全二重同期式シリアル通信(SPCR.TXMD = 0)」の「図32.24 SPCR.TXMD = 0 の動作例」に
    動作の説明があり,その下には,
    「(2)SPDR レジスタの受信バッファに以前の受信データがある状態でシリアル転送が終了すると、RSPI は
    SPSR.OVRF フラグを“1” にしてシフトレジスタの受信データを破棄します。」
    と書かれています。
    つまり,コマンドを送信完了したら,そのときに受信したデータを読み出してから次の受信動作を起動
    すべきではないでしょうか。