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
  • anonyさん、こんにちは。NoMaYです。

    こちらのRX65Nで新たに分かったことがあります。そして、(少なくとも)こちらでのカラクリは分かったような気がしてきました。

    今回、送信バッファエンプティ割り込み処理内で、DTCE bitと残り転送カウント数(RAM上の構造体のCRAフィールド)の内容を記録するようにしてみたところ、1回目の割り込みの時点でDTC転送が完了していたことに気付きました。(お昼のanonyさんの投稿を読んだ後、DTC終了を判定するならDTCE bitで判定した方が良いのではと思いプログラムを修正して確認してみた時に、このことに気付きました。)

    それで、私が今予想しているカラクリは、以下の通りです。(転送データ数は3個です。)

    (1) RXスマートコンフィグレータのコードにてダミーの送信バッファエンプティ割り込みを発生させた → DTC転送開始
    (2) DTCは1個目のデータを転送元のRAMからリードしてSPDRへ転送 → 次の送信バッファエンプティ割り込み発生
    (3) DTCは2個目のデータを転送元のRAMからリードしてSPDRへ転送 → 次の送信バッファエンプティ割り込み発生
    (4) DTCは3個目のデータを転送元のRAMからリードしてSPDRへ転送 → DTC転送終了 しかし 次の送信バッファエンプティ割り込みは発生する!
    (5) DTC転送終了割り込み発生 (DTCの仕様としてDTC転送終了割り込みは送信バッファエンプティ割り込みとして発生)
    (6) そして(4)による次の送信バッファエンプティ割り込み発生 ただし DTC転送は終了しているので単なるCPU割り込みとして受け付けられる

    結果を確認していたTeraTermの画面コピー


    プロジェクトのファイル一式 (RX65N TBボード、CS+プロジェクト(rcpeファイル同梱))
    issue_20190305.zip

    割り込み処理内でDTCE bitと残り転送カウント数(RAM上の構造体のCRAフィールド)の内容を変数に記録する箇所

    src\smc_gen\Config_RSPI0\Config_RSPI0_user.c

    #if FAST_INTERRUPT_VECTOR == VECT_RSPI0_SPTI0
    #pragma interrupt r_Config_RSPI0_transmit_interrupt(vect=VECT(RSPI0,SPTI0),fint)
    #else
    #pragma interrupt r_Config_RSPI0_transmit_interrupt(vect=VECT(RSPI0,SPTI0))
    #endif
    static void r_Config_RSPI0_transmit_interrupt(void)
    {
        ////////r_Config_RSPI0_callback_transmitend();
        RSPI0_dtce_chk[RSPI0_txint_count] = ICU.DTCER[39].BIT.DTCE;
        RSPI0_dtc_cra_chk[RSPI0_txint_count] = (dtc_transferdata_vector39.cra_crb >> 16);
        RSPI0_txint_count++;
    }

    転送開始前にDTCE bitと残り転送カウント数(RAM上の構造体のCRAフィールド)の内容を変数に記録する箇所

    src\tb_rx65n_main.c

    int main(void)
    {
    ...
        RSPI0_txint_count = 0;
        RSPI0_dtce_chk_0 = ICU.DTCER[39].BIT.DTCE;
        RSPI0_dtc_cra_chk_0 = (dtc_transferdata_vector39.cra_crb >> 16);

        R_Config_RSPI0_Send_Receive( RSPI0_send_buff, RSPI0_DATA_LEN, RSPI0_recv_buff );
    ...
    }

     

Reply
  • anonyさん、こんにちは。NoMaYです。

    こちらのRX65Nで新たに分かったことがあります。そして、(少なくとも)こちらでのカラクリは分かったような気がしてきました。

    今回、送信バッファエンプティ割り込み処理内で、DTCE bitと残り転送カウント数(RAM上の構造体のCRAフィールド)の内容を記録するようにしてみたところ、1回目の割り込みの時点でDTC転送が完了していたことに気付きました。(お昼のanonyさんの投稿を読んだ後、DTC終了を判定するならDTCE bitで判定した方が良いのではと思いプログラムを修正して確認してみた時に、このことに気付きました。)

    それで、私が今予想しているカラクリは、以下の通りです。(転送データ数は3個です。)

    (1) RXスマートコンフィグレータのコードにてダミーの送信バッファエンプティ割り込みを発生させた → DTC転送開始
    (2) DTCは1個目のデータを転送元のRAMからリードしてSPDRへ転送 → 次の送信バッファエンプティ割り込み発生
    (3) DTCは2個目のデータを転送元のRAMからリードしてSPDRへ転送 → 次の送信バッファエンプティ割り込み発生
    (4) DTCは3個目のデータを転送元のRAMからリードしてSPDRへ転送 → DTC転送終了 しかし 次の送信バッファエンプティ割り込みは発生する!
    (5) DTC転送終了割り込み発生 (DTCの仕様としてDTC転送終了割り込みは送信バッファエンプティ割り込みとして発生)
    (6) そして(4)による次の送信バッファエンプティ割り込み発生 ただし DTC転送は終了しているので単なるCPU割り込みとして受け付けられる

    結果を確認していたTeraTermの画面コピー


    プロジェクトのファイル一式 (RX65N TBボード、CS+プロジェクト(rcpeファイル同梱))
    issue_20190305.zip

    割り込み処理内でDTCE bitと残り転送カウント数(RAM上の構造体のCRAフィールド)の内容を変数に記録する箇所

    src\smc_gen\Config_RSPI0\Config_RSPI0_user.c

    #if FAST_INTERRUPT_VECTOR == VECT_RSPI0_SPTI0
    #pragma interrupt r_Config_RSPI0_transmit_interrupt(vect=VECT(RSPI0,SPTI0),fint)
    #else
    #pragma interrupt r_Config_RSPI0_transmit_interrupt(vect=VECT(RSPI0,SPTI0))
    #endif
    static void r_Config_RSPI0_transmit_interrupt(void)
    {
        ////////r_Config_RSPI0_callback_transmitend();
        RSPI0_dtce_chk[RSPI0_txint_count] = ICU.DTCER[39].BIT.DTCE;
        RSPI0_dtc_cra_chk[RSPI0_txint_count] = (dtc_transferdata_vector39.cra_crb >> 16);
        RSPI0_txint_count++;
    }

    転送開始前にDTCE bitと残り転送カウント数(RAM上の構造体のCRAフィールド)の内容を変数に記録する箇所

    src\tb_rx65n_main.c

    int main(void)
    {
    ...
        RSPI0_txint_count = 0;
        RSPI0_dtce_chk_0 = ICU.DTCER[39].BIT.DTCE;
        RSPI0_dtc_cra_chk_0 = (dtc_transferdata_vector39.cra_crb >> 16);

        R_Config_RSPI0_Send_Receive( RSPI0_send_buff, RSPI0_DATA_LEN, RSPI0_recv_buff );
    ...
    }

     

Children
No Data