e2 studioの環境でr_spiを使って、SPIのSlaveを実装したい

現在行っていることは下記のとおりです。

①Stack Configurationの画面からNew Stack→Connectivity→SPI(r_spi)を選択して、Receive Interrupt PriorityとTransmit Buffer Empty Interrupt Priorityを決めてCreate Project Contentを実行

②ソースコードの中では、

err = R_SPI_Open(&g_spi1_ctrl, &g_spi1_cfg);

err = R_SPI_CallbackSet(&g_spi1_ctrl, spi_callback, g_spi1_ctrl.p_context, NULL);

を行っています。

このとき、下記のようなRead関数をなにかしらのタイミングで実行するのかなと考えています。

err = R_SPI_Read(&g_spi1_ctrl, spi_rx_buff, 2, SPI_BIT_WIDTH_16_BITS);

それがCallbackのタイミングになるのか、他レジスタを監視しながらといったことになるのかが

よくわかっていません。

今回のSlaveの使い方としては、Master側とは1:1関係になっていて、

Master側から情報が来たら、読み取って他のI/Fで外部に渡す形を想定しています。

Parents
  • RA6T2がスレーブでRX72Mがマスタの通信はやったことがあります。

    設定が

    Enable Support for using DTC : Enabled

    Enable Transmitting from RXI Interrupt : Enabled

    Operation Mode : Slave

    Select SSL (Slave Select) : SSL0 (0番だけがスレーブモードで使用できるという制約がおそらくあります)

    ですかね?

    マスタが動作をするタイミング関係なしに1SPI通信が終わったら再度通信APIを呼び出してやる必要があります。

    私は割り込みハンドラの中で受信完了を大域変数で渡して、その変数を定期的に監視し、次の通信用APIを実行するようにしました。

    SPI通信は受信したデータの応答は次の通信サイクルに送信するのですが、

    [通信処理繰頭]ここを繰り返す(割り込みハンドラでやっても良いが最初のキックは割り込みハンドラ外でやる必要がある)

    SPI完了「待ち中」なら抜ける

    受信バッファの解析

    送信バッファ作成

    SPI完了待ち確認をする大域変数を「待ち中」に変更

    R_SPI_WriteReadを呼ぶ(マイコンによってR_SPI_B_WriteReadにかわります)

    [通信処理臀]

    <割り込みハンドラ>

    受信完了なら待機変数をSPI受信完了へ変更

    こんな手順をすればマスタが通信を開始すると通信処理がくるくると動作します。

  • Anonymous
    Anonymous in reply to Yamamoto

    早速、詳しい回答をいただきありがとうございます。

    基板はハード担当者が既に作成しており、

    SPIは2つ使うことになっており、2つともSlave使用を想定しているのですが

    制約がある場合は別の方法を検討する必要がありそうですね…

  • Anonymous
    Anonymous in reply to Anonymous

    あと、今回はクロック同期式動作を使用することになりそうです。

Reply Children
No Data