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です。

    RXスマートコンフィグレータでコード生成させたコードを見たところ、以下のようになっていて、最初の1バイトの送信を特別扱いしていないようでした。今回の件は、だんだんと、ダミーの送信バッファエンプティ割り込みを使う前提に立った上での、そういう割り込みを発生させるようになっているという、DTC(およびDMAも)の仕様なのではないだろうか?という気がしてきました。[追記] 17:55 下の方に追記しました。

    src\smc_gen\Config_RSPI0\Config_RSPI0.c

    /******************************************************************************
    * Function Name: R_Config_RSPI0_Send_Receive
    * Description  : This function sends and receives RSPI0 data
    * Arguments    : tx_buf -
    *                    transfer buffer pointer (not used when data is handled by DMAC/DTC)
    *                tx_num -
    *                    buffer size
    *                rx_buf -
    *                    receive buffer pointer (not used when data is handled by DMAC/DTC)
    * Return Value : status -
    *                    MD_OK or MD_ARGERROR
    ******************************************************************************/

    MD_STATUS R_Config_RSPI0_Send_Receive(uint32_t * const tx_buf, uint16_t tx_num, uint32_t * const rx_buf)
    {
        /* Enable transmit interrupt */
        RSPI0.SPCR.BIT.SPTIE = 1U;

        /* Enable receive interrupt */
        RSPI0.SPCR.BIT.SPRIE = 1U;

        /* Enable error interrupt */
        RSPI0.SPCR.BIT.SPEIE = 1U;

        /* Enable RSPI function */
        RSPI0.SPCR.BIT.SPE = 1U;

        return MD_OK;
    }

    [追記] 17:55

    更にコードを見ていたら、以下のようにもなっていて、r_Config_RSPI0_transmit_interrupt()で素朴にr_Config_RSPI0_callback_transmitend()が呼ばれているので、これは送信バッファエンプティ割り込みは1回しか発生していないことを示唆しているようにも、思え始めました、、、(RX71Mは手元に無いので、自分でRX65Nで確かめてみた方が良さそうな気がしてきました、、、)

    src\smc_gen\Config_RSPI0\Config_RSPI0_user.c

    /******************************************************************************
    * Function Name: r_Config_RSPI0_transmit_interrupt
    * Description  : This function is SPTI0 interrupt service routine
    * Arguments    : None
    * Return Value : None
    ******************************************************************************/
    #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();
    }

    途中省略

    /******************************************************************************
    * Function Name: r_Config_RSPI0_callback_transmitend
    * Description  : This function is a callback function when RSPI0 finishes transmission
    * Arguments    : None
    * Return Value : None
    ******************************************************************************/

    static void r_Config_RSPI0_callback_transmitend(void)
    {
        /* Start user code for r_Config_RSPI0_callback_transmitend. Do not edit comment generated here */
        /* End user code. Do not edit comment generated here */
    }

     

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

    RXスマートコンフィグレータでコード生成させたコードを見たところ、以下のようになっていて、最初の1バイトの送信を特別扱いしていないようでした。今回の件は、だんだんと、ダミーの送信バッファエンプティ割り込みを使う前提に立った上での、そういう割り込みを発生させるようになっているという、DTC(およびDMAも)の仕様なのではないだろうか?という気がしてきました。[追記] 17:55 下の方に追記しました。

    src\smc_gen\Config_RSPI0\Config_RSPI0.c

    /******************************************************************************
    * Function Name: R_Config_RSPI0_Send_Receive
    * Description  : This function sends and receives RSPI0 data
    * Arguments    : tx_buf -
    *                    transfer buffer pointer (not used when data is handled by DMAC/DTC)
    *                tx_num -
    *                    buffer size
    *                rx_buf -
    *                    receive buffer pointer (not used when data is handled by DMAC/DTC)
    * Return Value : status -
    *                    MD_OK or MD_ARGERROR
    ******************************************************************************/

    MD_STATUS R_Config_RSPI0_Send_Receive(uint32_t * const tx_buf, uint16_t tx_num, uint32_t * const rx_buf)
    {
        /* Enable transmit interrupt */
        RSPI0.SPCR.BIT.SPTIE = 1U;

        /* Enable receive interrupt */
        RSPI0.SPCR.BIT.SPRIE = 1U;

        /* Enable error interrupt */
        RSPI0.SPCR.BIT.SPEIE = 1U;

        /* Enable RSPI function */
        RSPI0.SPCR.BIT.SPE = 1U;

        return MD_OK;
    }

    [追記] 17:55

    更にコードを見ていたら、以下のようにもなっていて、r_Config_RSPI0_transmit_interrupt()で素朴にr_Config_RSPI0_callback_transmitend()が呼ばれているので、これは送信バッファエンプティ割り込みは1回しか発生していないことを示唆しているようにも、思え始めました、、、(RX71Mは手元に無いので、自分でRX65Nで確かめてみた方が良さそうな気がしてきました、、、)

    src\smc_gen\Config_RSPI0\Config_RSPI0_user.c

    /******************************************************************************
    * Function Name: r_Config_RSPI0_transmit_interrupt
    * Description  : This function is SPTI0 interrupt service routine
    * Arguments    : None
    * Return Value : None
    ******************************************************************************/
    #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();
    }

    途中省略

    /******************************************************************************
    * Function Name: r_Config_RSPI0_callback_transmitend
    * Description  : This function is a callback function when RSPI0 finishes transmission
    * Arguments    : None
    * Return Value : None
    ******************************************************************************/

    static void r_Config_RSPI0_callback_transmitend(void)
    {
        /* Start user code for r_Config_RSPI0_callback_transmitend. Do not edit comment generated here */
        /* End user code. Do not edit comment generated here */
    }

     

Children
No Data