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です。
    様々な情報をご提供くださりありがとうございます。

    皆様から頂いた情報をもとにいろいろと変更をかけていたのですが、結局未だに解決に至っておりません。
    現在は以下のような処理にしています

    ①RSPI機能を有効化(SPEビットを1)
    RSPI0.SPCR.BIT.SPE = 1;

    ②送信バッファエンプティ割り込みの無効化
    SYSTEM.PRCR.WORD = 0xA50BU;
    IEN(RSPI0,SPTI0) = 0U;
    RSPI0.SPCR.BIT.SPTIE = 0U;

    ③DTC起動要因の設定
    dtc_cfg.transfer_mode = DTC_TRANSFER_MODE_NORMAL;
    dtc_cfg.data_size = DTC_DATA_SIZE_LWORD; //32bit data
    dtc_cfg.src_addr_mode = DTC_SRC_ADDR_INCR;
    dtc_cfg.chain_transfer_enable = DTC_CHAIN_TRANSFER_DISABLE;
    dtc_cfg.response_interrupt = DTC_INTERRUPT_PER_SINGLE_TRANSFER;
    //dtc_cfg.response_interrupt = DTC_INTERRUPT_AFTER_ALL_COMPLETE;

    dtc_cfg.dest_addr_mode = DTC_DES_ADDR_FIXED;
    dtc_cfg.source_addr = (uint32_t)dtc_src;
    dtc_cfg.dest_addr = (uint32_t)&RSPI0.SPDR.LONG;
    dtc_cfg.transfer_count = 3;
    dtc_cfg.block_size = 1;
      dtc_err = R_DTC_Create(DTCE_RSPI0_SPTI0, &dtc_data, &dtc_cfg, 0);
    dtc_err = R_DTC_Control(DTC_CMD_DTC_START, NULL, NULL);
    dtc_cmd_arg.act_src = DTCE_RSPI0_SPTI0;
    dtc_err = R_DTC_Control(DTC_CMD_ACT_SRC_ENABLE, NULL, &dtc_cmd_arg);

    ④RSPI機能を無効化(SPEビットを0)
    RSPI0.SPCR.BIT.SPE = 0;

    ⑤送信バッファエンプティ割り込みの有効化、SPIの通信設定
    IEN(RSPI0,SPTI0) = 1U; //ここで1にしとかないとDTC起動しない
    RSPI0.SPCR.BIT.SPTIE = 1U;
    RSPI0.SPCMD0.BIT.SPB = 3; //32bit data
    RSPI0.SPCMD0.BIT.SSLKP = 1; //Keep SSL assert when finish

    ⑥IRフラグをクリア
    IR(RSPI0, SPTI0) = 0;
    IR(RSPI0, SPTI0) = 0;

    ⑦RSPI機能を有効化
    RSPI0.SPCR.BIT.SPE = 1;

    この処理を実行した結果、CPU割り込みが2回発生し、通信はなぜか発生しないようになってしまいました。
    しかし、通常実行ではなくエミュレーターでステップ実行をしたときには、⑦でSPEビットを1にした瞬間に、1回の32ビット通信が発生していることが確認できました。

    また、DTCからCPUに割り込みを発生させるタイミングも、全転送終了時でなく一回の転送終了毎に変更しました。(なぜかこちらにしないと通信が発生しなくなってしまいました。)

    正直色々いじっているうちにどこか元々の設定がおかしくなってしまった感がありますので、もう一度新規プロジェクトを作って試してみたいと思います。

    また何か進展しましたら報告いたします。
Reply
  • 皆様
    anonyです。
    様々な情報をご提供くださりありがとうございます。

    皆様から頂いた情報をもとにいろいろと変更をかけていたのですが、結局未だに解決に至っておりません。
    現在は以下のような処理にしています

    ①RSPI機能を有効化(SPEビットを1)
    RSPI0.SPCR.BIT.SPE = 1;

    ②送信バッファエンプティ割り込みの無効化
    SYSTEM.PRCR.WORD = 0xA50BU;
    IEN(RSPI0,SPTI0) = 0U;
    RSPI0.SPCR.BIT.SPTIE = 0U;

    ③DTC起動要因の設定
    dtc_cfg.transfer_mode = DTC_TRANSFER_MODE_NORMAL;
    dtc_cfg.data_size = DTC_DATA_SIZE_LWORD; //32bit data
    dtc_cfg.src_addr_mode = DTC_SRC_ADDR_INCR;
    dtc_cfg.chain_transfer_enable = DTC_CHAIN_TRANSFER_DISABLE;
    dtc_cfg.response_interrupt = DTC_INTERRUPT_PER_SINGLE_TRANSFER;
    //dtc_cfg.response_interrupt = DTC_INTERRUPT_AFTER_ALL_COMPLETE;

    dtc_cfg.dest_addr_mode = DTC_DES_ADDR_FIXED;
    dtc_cfg.source_addr = (uint32_t)dtc_src;
    dtc_cfg.dest_addr = (uint32_t)&RSPI0.SPDR.LONG;
    dtc_cfg.transfer_count = 3;
    dtc_cfg.block_size = 1;
      dtc_err = R_DTC_Create(DTCE_RSPI0_SPTI0, &dtc_data, &dtc_cfg, 0);
    dtc_err = R_DTC_Control(DTC_CMD_DTC_START, NULL, NULL);
    dtc_cmd_arg.act_src = DTCE_RSPI0_SPTI0;
    dtc_err = R_DTC_Control(DTC_CMD_ACT_SRC_ENABLE, NULL, &dtc_cmd_arg);

    ④RSPI機能を無効化(SPEビットを0)
    RSPI0.SPCR.BIT.SPE = 0;

    ⑤送信バッファエンプティ割り込みの有効化、SPIの通信設定
    IEN(RSPI0,SPTI0) = 1U; //ここで1にしとかないとDTC起動しない
    RSPI0.SPCR.BIT.SPTIE = 1U;
    RSPI0.SPCMD0.BIT.SPB = 3; //32bit data
    RSPI0.SPCMD0.BIT.SSLKP = 1; //Keep SSL assert when finish

    ⑥IRフラグをクリア
    IR(RSPI0, SPTI0) = 0;
    IR(RSPI0, SPTI0) = 0;

    ⑦RSPI機能を有効化
    RSPI0.SPCR.BIT.SPE = 1;

    この処理を実行した結果、CPU割り込みが2回発生し、通信はなぜか発生しないようになってしまいました。
    しかし、通常実行ではなくエミュレーターでステップ実行をしたときには、⑦でSPEビットを1にした瞬間に、1回の32ビット通信が発生していることが確認できました。

    また、DTCからCPUに割り込みを発生させるタイミングも、全転送終了時でなく一回の転送終了毎に変更しました。(なぜかこちらにしないと通信が発生しなくなってしまいました。)

    正直色々いじっているうちにどこか元々の設定がおかしくなってしまった感がありますので、もう一度新規プロジェクトを作って試してみたいと思います。

    また何か進展しましたら報告いたします。
Children
No Data