RSPI通信による1バイトデータの送信について

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

RSPI通信のソフトウェアを組んでいたのですが、どうもうまく動かず、根本に立ち返って検証を試みております。

MPUは、RX113

SPIのベースビットレートは、5Mbit/s。

クロック同期式(3線式)としております。

1バイトのコマンドデータを富士通のFRAMに送出するコードを次のように記述して試してみました。

 

※ 上記「1バイトのコマンドデータ」は、FRAMのライトイネーブルコマンドです。

  R_RSPI0_Start();
  PORTC.PODR.BIT.B4 = 0;         // チップセレクト -> FRAM
  while(RSPI0.SPSR.BIT.SPTEF == 0);
  RSPI0.SPDR.WORD.H = 0x0006;     // データの送信
  RSPI0.SPCR.BIT.SPTIE = 0;        // 送信バッファエンプティ割り込み許可ビット -> 0
  RSPI0.SPCR2.BIT.SPIIE = 1;       // RSPIアイドル割り込み許可ビット -> 1
  while(RSPI0.SPSR.BIT.IDLNF == 1);   // 送信完了待ち
  PORTC.PODR.BIT.B4 = 1;         // チップセレクト 解除

  R_RSPI0_Stop();             // SPIの終了処理(割り込み禁止)

おそらく何処かに誤りがあると思うのですが、ロジアナで観測するところ、MOSIの端子からデータが出力されません。

ビットレートを落としても状況は変わりませんでした。

ハードウェアマニュアルを読みますと、「SPDRへ送信データをライト」は、フレーム数分アクセスするようにと書かれていましたが、今回の使い方では転送フレーム数は1フレームなので、書き込みのアクセスは1回でよいのだろうと考えました。

大変お手数をおかけしますが、データが出力されない原因など、ご教示お願いします。

 

Parents
  • 追伸です。(少々気になったこと)
    現在のところ、送受信の処理に割り込みを使うことは考えていないのですが、この場合初期設定は、
     ・転送データ処理 -> 「割り込みサービスルーチンで処理する」を選択せず、「DTCで処理する」を選択するものなのか。
    このあたりがよくわからないまま、現在の設定は「割り込みサービスルーチンで処理する」を選択した状態になっています。
  • コード生成を使っているなら、R_SPI0_Send()を使ってみてはどうでしょうか。
  • ご返信ありがとうございます。
    R_SPi0_Send() のコードは見てはいたのですが、まずは確実に動作をつかみたいと考えて、1バイトのコマンドを送信することにしました。
    基本的な部分がわかっていないと、よく解っていないままに動くであろうコードを使用して、不具合が発生した時に手が付けられなくなってしまうという危険性があります。

    さきに書きましたコードは、おそらくRSPIの肝要な部分のみで構成したソースだとは思うのですが、これすら動かない原因がわからないのでは後に進めないと考えております。
    もしかしましたら、とんでもない間違いをしているかもしれません。そのような部分を潰しておきたいのです。
  • わわいです
    コード生成を使わないなら、R_RSPI0_Start関数も自分で組みましょう。
    ナカミの分からない関数をもってきて動かそうとしても徒労でしかないです
  • 少々私も勘違いしたのですが、コード生成では「R_SPI0_Send()」というコードは生成されていないですね。
    生成されているのは、「MD_STATUS R_RSPI0_Send_Receive(…)」ですが、このコードの中にはSPDRへのデータ入力は無くて、これは何だろう?と首を傾げています。
    コードの説明にはデータを送れるようなことが書かれていますが??
  • 設定により、送信のみならR_SPI0_Send()、送受信同時ならR_SPI0_Send_Receive()という事かもしれません。
    SPDR操作は割り込みで実装されている可能性があります。
    ---
    RSPIを直接制御しているサンプルおよび詳細なアプリケーションノートがあり、参考になるかもしれません。
    RX111用なのですが、RX113でも使えそうな気がします。
    RX111のページから、サンプルコードのタブを選び、
    「マイクロコンピュータの周辺」→「通信機能」→「シリアルインタフェース(クロック非同期式、クロック同期式)」
    を選択して検索すると
    「RX ファミリ RSPI を使ったクロック同期式シングルマスタ制御ソフトウェア」 (R01AN1196JJ0111 )
    が出てきます。(アプリケーションボートとCソースあり)
  • Higetaka様
    お世話になっております。
    ご回答ありがとうございます。
    実は、お示しいただきましたアプリケーションノートにつきましては真っ先に試しました。
    試してみて(必要な箇所には手を加えて)動かず、現在に至っております。
  • わわいです
    まあ、そのコードだけでは、RSPIやら割り込み周りやらの初期設定でなにをどうしてるのかがわからないので、アドバイスのしようがないとおもわれます。
    まずは割り込み無しでいいので全て自分でコードを書いて、RSPIのレジスタの値を確認しながら進めていってはどうでしょうか。
  • わわい様
    お世話になっております。ご回答ありがとうございます。

    SPI通信の前処理(割り込み無し)を作成してみました。
    コードは次の通りです。
    これで試したところ、RSPCKAは出てきました。
    しかし、肝心のデータ(MOSI)は出てきません。

    void Y_RSPI0_Start(void)
    {
    // ポーリング用のSPI通信前処理( 割り込み無し )

    volatile uint8_t dummy;

    /* Clear error sources */
    dummy = RSPI0.SPSR.BYTE; // 読み込んでから書くための処理
    RSPI0.SPSR.BYTE = 0xA0U;

    /* Disable idle interrupt */
    RSPI0.SPCR2.BIT.SPIIE = 0U;

    /* SPEビットの許可 */
    RSPI0.SPCR.BIT.SPE = 1;
    }

    データ送信のコードは次の通りです。

    //
    // FRAM WRENコマンドの送信
    //

    Y_RSPI0_Start();

    PORTC.PODR.BIT.B4 = 0; // チップセレクト -> FRAM
    while(RSPI0.SPSR.BIT.SPTEF == 0);
    RSPI0.SPDR.WORD.H = 0x0600; // データの送信

    RSPI0.SPCR.BIT.SPTIE = 0; // 送信バッファエンプティ割り込み許可ビット -> 0
    RSPI0.SPCR2.BIT.SPIIE = 1; // RSPIアイドル割り込み許可ビット -> 1
    while(RSPI0.SPSR.BIT.IDLNF == 1); // 送信完了待ち
    PORTC.PODR.BIT.B4 = 1; // チップセレクト 解除

    Y_RSPI0_Stop(); // SPIの終了処理

     

    ロジアナの画像:MOSIの信号が出ていません。

  • SA様、わわい様、Higetaka様 および本スレッドをご覧になられた皆様

    お世話になっております。
    お蔭様で、データが送信できない問題は解決いたしました。
    ありがとうございました。
Reply Children
  • パールマン様

    わたと申します。

    現在RX111で本件と同様な問題がでておりまして、
    原因がつかめていない状態です。

    もしも差支えなければ、
    どのような対処で問題が解決したのか内容を記載していただけませんでしょうか。
    よろしくお願いいたします。