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回でよいのだろうと考えました。

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

 

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

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

    現状ではMOSIからの信号どころか、クロックが出ている様子もなく、どうなっているのか皆目判らないという状況です。

    疑っているところは、SPDRレジスタへのアクセスはワードアクセスで、ハードウェアマニュアルに記されている通りに上位側の16ビットにデータをいれているものの、バッファにデータが埋まっていないから送出されていないのではないかというところです。
  • Higetaka様
    お世話になっております。
    ご回答ありがとうございます。
    実は、お示しいただきましたアプリケーションノートにつきましては真っ先に試しました。
    試してみて(必要な箇所には手を加えて)動かず、現在に至っております。
  • わわいです
    まあ、そのコードだけでは、RSPIやら割り込み周りやらの初期設定でなにをどうしてるのかがわからないので、アドバイスのしようがないとおもわれます。
    まずは割り込み無しでいいので全て自分でコードを書いて、RSPIのレジスタの値を確認しながら進めていってはどうでしょうか。