Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

RSPIにおけるデータ転送のビット数とフレーム数について

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

CPU:RX113

使用する機能:RSPI

RX113をマスターとし、デバイスとなるFRAMメモリのデバイスIDを読み出すことを考えています。

送出するコマンドは、8ビットの0x9F

このコマンドを送出すると、デバイスより32ビットのデータが返ってくることになっています。

● 現在の設定

  コマンド数1、転送フレーム数1

  ビット長:8ビット

この設定で、次のコードを実行しますと、図に示しましたように、最後の8ビット( Product ID ( 2nd Byte ) )が欠落してしまいます。

( メモリメーカーが示している、Manufacturer ID,Continuation code,Product ID(1st Byte)までは正しく返されています )

//
// FRAM デバイスID 読み込み
//

  Y_RSPI0_Start();
  PORT5.PODR.BIT.B3 = 0;        // チップセレクト -> FRAM

  while(RSPI0.SPSR.BIT.SPTEF == 0);
  // RDID コマンド送信 ( 送信バイト数:1、データ:0x9F )
  RSPI0.SPDR.WORD.H = 0x009F;    // データの送信
  while(RSPI0.SPSR.BIT.IDLNF == 1);  // 送信完了待ち

  RSPI0.SPDR.WORD.H = 0x0000;    // ID受信用ダミー(1)
  while(RSPI0.SPSR.BIT.IDLNF == 1);  // 送信完了待ち

  RSPI0.SPDR.WORD.H = 0x0000;    // ID受信用ダミー(2)
  while(RSPI0.SPSR.BIT.IDLNF == 1);  // 送信完了待ち

  RSPI0.SPDR.WORD.H = 0x0000;    // ID受信用ダミー(3)
  while(RSPI0.SPSR.BIT.IDLNF == 1);   // 送信完了待ち

  RSPI0.SPDR.WORD.H = 0x0000;    // ID受信用ダミー(4) <--- この行の送信分が欠けてしまう。
  while(RSPI0.SPSR.BIT.IDLNF == 1);   // 送信完了待ち

 

  while(RSPI0.SPSR.BIT.SPRF == 0);   // 受信バッファフルの確認 (1)

  FRAM_DEVICE_ID1 = RSPI0.SPDR.WORD.H;
  // while(RSPI0.SPSR.BIT.SPRF == 0); // 受信バッファフルの確認 (1)
  FRAM_DEVICE_ID2 = RSPI0.SPDR.WORD.H;

  PORT5.PODR.BIT.B3 = 1; // チップセレクト 解除

  Y_RSPI0_Stop();

 

上記コードを実行した時の、波形

 

転送フレームが1であるから最後の8ビットが欠けてしまったのであろうと、フレーム数を2にしたら、今度は先頭の8ビットしかデータが返ってきませんでした。

そもそもフレームの理解ができていないのですが、今回のように、送信8ビット、受信32ビットを実行するにはどのようにしたらよいのでしょうか。

ハードウェアマニュアルを読みましたが、正直なところよくわかりませんでした。

大変お手数をおかけしますが、ご教示願います。

 

 

※ 一連の質問で未だ受信データの取り込みは解決できておりませんが、先にSPIバスにデータが現れることを確認することを先に進めております。

  • In reply to パールマン:

    シーケンスの送出後、設定したフレーム数分の受信データがシフトレジスタから受信バッファ(SPRX)に転送されたとき、SPRFが1になり、その後に受信バッファにたまっている2フレーム分の応答を読み出せば良いはずです。
  • In reply to パールマン:

    R_RSPI0_Create()内の
    RSPI0.SPBR = _63_RSPI0_DIVISOR;
    の値は何ですか?  (一寸調べてもわかんなかったので)
  • In reply to Higetaka:

    Higetaka様

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

    > シーケンスの送出後、設定したフレーム数分の受信データがシフトレジスタから受信バッファ(SPRX)に転送されたとき、

    > SPRFが1になり、その後に受信バッファにたまっている2フレーム分の応答を読み出せば良いはずです。

    やはり、その筈ですよね… 

    しかし、別のスレッドで書かせて頂いていますが、「送信完了」となったのちに

      while(RSPI0.SPSR.BIT.SPRF == 0);

    で受信バッファフルの状態を待って、

      FRAM_READ_STR = RSPI0.SPDR.WORD.H;

    で受信データの取り込みを試みておりましたが、悉く、全てのデータが‘0xFF’となっているのです。

    バスのロジアナ波形が正しいのに、なぜバッファのデータが0xFFなのか…全く判らず、かなり困っておりました。

    原因がわからないので、一旦保留にしておいたのです。

    今回Higetakaさんに教えていただいた後はロングワードアクセスとなりましたので、

      FRAM_READ_STR = RSPI0.SPDR.LONG;

    になるかと思いますので、明日試作機で試してみます。

     

    と、現在自宅で書きながら考えたのですが…

    ワードアクセスで評価している時、送信データは上位16ビットに書き込むということになっているので、

    受信も同様に考えてSPDR上位16ビットを読んでいました。

    ハードウェアマニュアルのPage1076の説明は、

    「SPDR レジスタは、RSPI 送受信用のデータを格納するバッファです。
    ロングワードアクセス(SPLW ビットが“1”)のときは、SPDR をアクセスしてください。
    ワードアクセス(SPLW ビットが“0”)のときは、SPDR の上位側16 ビット(H)をアクセスしてください。」

    と説明されています。

    SPDRの上位16ビット(H)とは、別の表現ではSPDR[31:16]ですよね。

    一方で、同マニュアルのPage1076-1077をあらためて読みますと、次のように説明されています。

    「 受信バッファは、データの受信が完了すると受信データを格納します。オーバラン発生時は、受信バッファの値を更新しません。

     また、データ長が32 ビット以外の場合、SPRXn(n=0 ~ 3)の非参照ビットには、SPTXn(n=0 ~ 3)の非参照ビットが格納されます。
    たとえば、データ長が9 ビットのデータを受信した場合はSPRXn[8:0] には受信データが格納され、SPRXn[31:9] にSPTXn[31:9] が格納されます。」

    つまり、受信したステータスリードなどの8ビットデータはSPDR[7:0]に居たということになるのでしょうか。

    ならば、ワードアクセスでSPDRの上位側16ビット(H)をアクセスするのは送信の時のみ? (汗;)

  • In reply to パールマン:

    確認してみましたが、やはり読めませんでした。orz
  • In reply to LEON:

    LEON様
    おはようございます。

    > R_RSPI0_Create()内の
    > RSPI0.SPBR = _63_RSPI0_DIVISOR;
    > の値は何ですか?  (一寸調べてもわかんなかったので)

    10進数の99です。(0x63)

    RSPIのビットレートを決定する定数の1つでして、次の計算によりビットレートが求められます。

    ビットレート = PCLK/( 2 * (n+1)* 2^N )

    上記の式のnは、SPBRレジスタの数字=99(10)、Nは、SPCMDnレジスタのベースビットレートの数字=今回は0

    今回はPCLK=ICLK=20MHz ですので、

    ビットレートは、100Kbit/s となります。

    速い速度に設定してしまいますと、安物のロジアナが追いつかなくて、動きが捉えられないので、遅く設定しています。
  • In reply to パールマン:

    2回読み出すのがポイントです。
    FFなのは、1フレーム目の時のMISOの状態を読み出しているからでは?
    ---
    xxx = RSPI0.SPDR.LONG;
    FRAM_DEVICE_ID = RSPI0.SPDR.LONG;
    ---
    とやってみてください。

    受信バッファサイズは32bit x 4なので、LONGで読めば全部が見えるはずです。
    ただし、1フレーム目は8bitしか送っていないので、対応するどこかがFFになっているはずです。
  • In reply to LEON:

    LEON様
    おはようございます。

    > あと、MISOAはちゃんと入力設定になっていますか?
    > # RXの記述法がちょっとわかってないもんで。

    RSPIの初期化ソース(コード生成)では、次の通りに記述されています。

    /* Set MISOA pin */
    MPC.P52PFS.BYTE = 0x0DU;   // <- マルチファンクションピンコントローラにおけるRSPIの組み設定
    PORT5.ODR0.BYTE &= 0xDFU;  // <- オープンドレイン関係の設定。(今回は関係ない…はず…)
    PORT5.ODR0.BYTE |= 0x10U;   // <- 同上
    PORT5.PMR.BYTE |= 0x04U;   // <- 周辺機能として使用 (今回はRSPIのMISOA)

    MISOAに関する設定で、他に設定する項目はありますでしょうか。
    マルチファンクションピンコントローラの設定とPMRレジスタの設定以外に、個別に入力設定を行わなければならないとしたら…
  • In reply to Higetaka:

    Higetaka様

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

    > 2回読み出すのがポイントです。

    > FFなのは、1フレーム目の時のMISOの状態を読み出しているからでは?

    > ---

    > xxx = RSPI0.SPDR.LONG;

    > FRAM_DEVICE_ID = RSPI0.SPDR.LONG;

    ---

    とやってみてください。

    あ゛、読めました ! 

    確かに1回目の読み込みはFFでしたが、2回目の読み込みは上図の通り、正しい値が読み取れました。

    ただ、わからないのは、この32ビットのデータ(デバイスID)は読み取ることができましたが、

    ステータスレジスタなど、8ビットのデータは相変わらず読めず、FFになってしまうのです。

    もしかして、強制的に32ビットのクロックを送出してあげないと読み取れないとかでしょうか。

  • In reply to パールマン:

    8ビットのデータ(ステータスレジスタの状態)を返すコマンドを試した結果が次の図です。

    図1 2フレームを用いて、8ビットのデータを受信してみた

    正しい値「0x02」を連続4回送ってきています。

    そして、SPDRの値は…

    図2 SPDRの値=0

    なぜか0.

    32ビットの波形が示す値は、0x02020202

    何故だろう?  また問題が増えてしまいました orz

    正しく取れれば、余計な部分はマスクしてしまえばよいのですが、違う値では使えません。orz

  • In reply to パールマン:

    ビットレートの丁寧な解説までありがとうございます。
    また、開発試作状況。遅いビットレートの背景も了解しました。
    実用では、数MHz~のビットレート、RSPIの割り込み方式を実現したいところですね。

    おっ、読めたような兆し。 Hint
     2回目の(コマンド発行)時に、1回目の(コマンド発行で)受信したデータが読める。

    ( )内は、今回用に入れてみましたが。1フレーム、2フレームでビット数が違ったり。
    エミュレータでいろいろ調べると、原因、対策が見えてきますよ。
  • In reply to LEON:

    LEON様
    お世話になっております。
    0x02020202が0になってしまう原因は、なにかありそうです。
    スレッド新しくしますので、よろしくお願いします。

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page