DTCを用いたRSPI通信時の割り込みについて

皆様

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

 

RX71Mマイコンを使用して、DTCによりRSPIから32bitのデータを連続送受信することを試みています。

現時点でDTCが正常に起動して、実際に通信も起きていることが確認できたのですが、

CPUへの割り込みが2回発生してしまう問題があります。

DTCはFITモジュールを使用しており、CPU割り込みはDTCの全転送終了後に1度発生する設定にしてあります。

 

DTCの転送回数を2回や4回などに変更しても、同じようにCPU割り込みは2回発生しています。

 

通信の流れは以下のようにしています。

 

①RSPI0の割り込みを無効化

②DTC起動要因の設定(FITモジュールのR_DTC_Create, R_DTC_Control関数)

③RSPI0の割り込みを有効化

④RSPI.SPDR.LONGレジスタに最初の32bitデータを書き込み

 

④に関しては、現時点では送信バッファエンプティ割り込みを発生させるために、最初のデータはプログラムから手動で書き込んでいます。

 

割り込みのタイミングに関しては、

最初の一回は④で書き込んだデータの転送終了時、2回目はDTCの全転送終了時に発生しているようです。

 

自分の希望としては、最初の一回目の割り込みは発生しないようにして、2回目の割り込みだけを発生させるようにしたいのですが、

そのような方法はあるのでしょうか?

 

よろしくお願いいたします。

 

開発環境:CS+ for CC V7.00.00

使用デバイス: RX71M_RSK

Parents
  • NoMaYさん、わわいさん
    ありがとうございます。

    >NoMaYさん
    >「最初の一回は④で書き込んだデータの転送終了時」に発生する割り込みなのですが、具体的には、何の割り込みなのでしょうか?

    この割り込みの種類は、送信バッファエンプティ割り込みになります。
    また現在はRSPI送信処理だけを確認するために、RSPI機能の割り込みは送信バッファエンプティ割り込みのみを有効化している形にしてあります。

    >わわいさん
    >この③の時点で割り込みがかかってしまうのは当然じゃないでしょうか。
    >④を先にしたらどうなるでしょう

    現在は③の時点では送信バッファエンプティ割り込みが入らず、④で格納したデータの送信終了時に割り込みが入るようになっております。
    仰るように④と③を逆にして実行してみたのですが、その場合には割り込みが一度も発生しませんでした。

    まず送信バッファエンプティの割り込み要因として、「SPCR.SPTIEビットが“1”の状態で送信バッファエンプティ(SPTEFフラグが“1”)になったとき」という風にRX71Mのマニュアルには記載されていて、
    SPTEFフラグが1になる条件としては、
    「• SPCR.SPE ビットが“0” (RSPI 初期化) のとき
    • 送信バッファからシフトレジスタに送信データが転送されたとき」
    という記載があります。

    このことから、割り込みを有効化しただけでは割り込みは発生せず、送信バッファ(RSPI.SPDR.LONG)にデータを書き込み、それがシフトレジスタに転送されて初めて割り込みが発生しているのだと思われます。(送信バッファエンプティ割り込みの検出方法はエッジ検出なので、割り込み有効化中に送信バッファに書き込む必要がありそうです)

    割り込み発生のタイミングに関しては意図通りなのですが、最初の一度目の割り込みで割り込みハンドラが起動してしまうのを回避したいです。
    もしくは、割り込みハンドラが起動してしまうにしても、それが最初の一度目のものなのか、それともDTCの全転送終了時のものなのかを区別できれば、と考えております。

    長文失礼いたしました。
    よろしくお願いいたします。
Reply
  • NoMaYさん、わわいさん
    ありがとうございます。

    >NoMaYさん
    >「最初の一回は④で書き込んだデータの転送終了時」に発生する割り込みなのですが、具体的には、何の割り込みなのでしょうか?

    この割り込みの種類は、送信バッファエンプティ割り込みになります。
    また現在はRSPI送信処理だけを確認するために、RSPI機能の割り込みは送信バッファエンプティ割り込みのみを有効化している形にしてあります。

    >わわいさん
    >この③の時点で割り込みがかかってしまうのは当然じゃないでしょうか。
    >④を先にしたらどうなるでしょう

    現在は③の時点では送信バッファエンプティ割り込みが入らず、④で格納したデータの送信終了時に割り込みが入るようになっております。
    仰るように④と③を逆にして実行してみたのですが、その場合には割り込みが一度も発生しませんでした。

    まず送信バッファエンプティの割り込み要因として、「SPCR.SPTIEビットが“1”の状態で送信バッファエンプティ(SPTEFフラグが“1”)になったとき」という風にRX71Mのマニュアルには記載されていて、
    SPTEFフラグが1になる条件としては、
    「• SPCR.SPE ビットが“0” (RSPI 初期化) のとき
    • 送信バッファからシフトレジスタに送信データが転送されたとき」
    という記載があります。

    このことから、割り込みを有効化しただけでは割り込みは発生せず、送信バッファ(RSPI.SPDR.LONG)にデータを書き込み、それがシフトレジスタに転送されて初めて割り込みが発生しているのだと思われます。(送信バッファエンプティ割り込みの検出方法はエッジ検出なので、割り込み有効化中に送信バッファに書き込む必要がありそうです)

    割り込み発生のタイミングに関しては意図通りなのですが、最初の一度目の割り込みで割り込みハンドラが起動してしまうのを回避したいです。
    もしくは、割り込みハンドラが起動してしまうにしても、それが最初の一度目のものなのか、それともDTCの全転送終了時のものなのかを区別できれば、と考えております。

    長文失礼いたしました。
    よろしくお願いいたします。
Children
  • わわいです
    なるほど、エッジ検出なんですね
    RSPIのクロックをかなり早くしていると見受けられますが、もしかしるとDTCの最初のデータ転送が間に合ってないという話なのかもしれません
    そういうことで、2回の割り込みが発生するというのはしようがない、ということで、割り込みの中でDTCの動作状況をチェックし、DTCの動作中であればその割り込みの処理をスキップする、というのではどうでしょうか