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

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

 

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

  • LEONです。
    RX113は使ったこと無いですが、
    ・SPDRに書き込んだ後、SPTEFのクリア
    ・SPDRからリードした後、SPRFのクリア
    が必要じゃないんでしょうか。
  • こんにちは、
    MSBファーストとして、波形を確認すると最初のフレームでH'FFとなってませんか?
    その次の波形でH'02が受信されているように見えます。
    最初はH'FFで次のデータがH'02になってませんか?
  • 先のレスで、私の他CPU処理では SPTEF、SPRF をクリアしてましたが、必須ではないかもしれません。早とちりですみません。

    ・オシロのMISOAデータは、MSBから展開されますから 0x10 ではなく 0x02 のようです。
     富士通FRAMの型番が不明ですが、MB85RQ4MLの場合ステータスレジスタは以下の通りでした。
      Bit1:WEL:ライトイネーブルラッチ
       1=書き込み可能。WRENコマンドでセット
       0=書き込み不可。WRDIコマンドでもリセット

    以下は、既知設定済みかもしれませんが、お確かめ下さい。
    ・CPU側シングルマスタ/FRAM側シングルスレーブの設定?
    ・SPDRのワードアクセスの送信データ/受信データはLSB詰め。
    ・SPCMD0.LSBF=0 0:MSBファースト
    ・SPCMD0.SPB=0100~0111: 8Bit長
  • SA様
    お世話になっております。

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

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

    いえ、気になさらないでください。
    > ・オシロのMISOAデータは、MSBから展開されますから 0x10 ではなく 0x02 のようです。

    はい、その通りです。2進と16進をごっちゃに書いてしまいました。0x02が正解です。

    > 以下は、既知設定済みかもしれませんが、お確かめ下さい。
    > ・CPU側シングルマスタ/FRAM側シングルスレーブの設定?
    > ・SPDRのワードアクセスの送信データ/受信データはLSB詰め。
    > ・SPCMD0.LSBF=0 0:MSBファースト
    > ・SPCMD0.SPB=0100~0111: 8Bit長

    はい。 CPU側はシングルマスタの設定です。(MSTRビット)
    接続されるデバイス(今回はFRAM)には、シングルスレーブなどを設定する機能はありましたでしょうか。
    そこは意識していなかったです。
    SPDRのワードアクセスは、ワードです。
    送信データのSPDRへの書き込みはハードウェアマニュアルに書かれている通りにLSB詰めで書いています。
    送信データは、0x0006と書いています。
    MSBファーストであること、8ビット長であることも確認いたしました。
  • チョコです。
    横から失礼します。
    シフトレジスタが送信と受信で共用しているということなので,送信と受信は並行して実行していることに
    なります(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” にしてシフトレジスタの受信データを破棄します。」
    と書かれています。
    つまり,コマンドを送信完了したら,そのときに受信したデータを読み出してから次の受信動作を起動
    すべきではないでしょうか。
  • パールマン様
    こんにちは、追加で確認ですが、
    全二重同期式シリアル通信(SPCR.TXMD = 0)でしょうか?
    お教え願います。
  • 今回使用しているFRAMの型番は、MB85RS512Tという512K(64Kx8)ビットのメモリです。
    メモリセルへの書き込み/読み出しの評価のために、まずはWRENコマンドを送信したわけです。
    その後、ステータスレジスタを確認しようとしたら、バスの波形と読み出しのデータが違っていたと…(涙)
  • はい、その通りです。
  • LEONです。
    > .... まずはWRENコマンドを送信したわけです。...
    > その後、ステータスレジスタを確認しようとしたら....
    > .... 送信データは、0x0006と書いています。

    WREN(0x06)コマンドですよね。ステータスリードコマンド後であれば RDSR(0x05)か
    ダミーライトの 0x00 だと思うのですが。
    表32.8 1項に該当しませんか?
     発生条件:送信バッファフルの状態でSPDRレジスタを書き込み
     RSPI動作:送信バッファ内容を保持。書き込みデータ欠落
     エラー検出:なし

    IDLNFをチェックしてますが、SPTEFチェックではどうなんでしょう。


    チョコさんが示唆されてますように、要所にダミーリードを入れてみるとか。
    もちろん、SPTEF、SPRFのルールは守った上で。

     ・SPDR ← WREN    WREN(06)書き込み許可
     ・ ★ダミーリード

     ・SPDR ← RDSR    RDSR(05)ステータスリード
     ・ ★ダミーリード
     ・SPDR ← 0x00    ダミーライト
     ・データ ← SPDR   受信データをリード

     # ライト+ダミーリード。ダミーライト+リード
     # (なんだかダミーだらけ.... PPAP みたい。)
     # 策の案は検証できず、効果があるかどうかわかりません。


    > シングルスレーブ....
    RSPI構成で外部にFRAM1個のみの接続であれば、必然的にシングルスレーブになろうかと。
    複数のFRAM等接続のマルチスレーブの可能性もあったので、念のための確認でした。