RX231 シリアル0の受信割り込みが発生しません (北斗電子製評価ボード:R5F52318AxFP)

いつもお世話になっております。

RX231 北斗電子製評価ボードのセットアップを行っているのですが『シリアル0の受信割り込みが発生しません』

ご教授いただけますと幸いです。(プロジェクトを新規で作成し、スマートコンフィグレータで生成されたコードを使用しております(CS+/E2Lite使用))

 

(PCのシリアル通信ソフトからデータを送信しているのに)自動生成されたr_Config_SCI0_transmit_interrupt()に入りません。

※PCからデータ送信されている事は他の開発ボード(Arduino)とつなげてみて受信できる事を確認済。

 

#if FAST_INTERRUPT_VECTOR == VECT_SCI0_TXI0
#pragma interrupt r_Config_SCI0_transmit_interrupt(vect=VECT(SCI0,TXI0),fint)
#else
#pragma interrupt r_Config_SCI0_transmit_interrupt(vect=VECT(SCI0,TXI0))
#endif
static void r_Config_SCI0_transmit_interrupt(void)

 

 

●わかっている事

①自動生成されたR_Systeminit()が呼ばれ、R_Config_SCI0_Create()内でシリアル0の設定およびピン設定(27,28)はされている

/*--------------------------------------------------------*/

void R_Systeminit(void)
{
/* Enable writing to registers related to operating modes, LPC, CGC and software reset */
SYSTEM.PRCR.WORD = 0xA50FU;

/* Enable writing to MPC pin function control registers */
MPC.PWPR.BIT.B0WI = 0U;
MPC.PWPR.BIT.PFSWE = 1U;

/* Initialize clocks settings */
R_CGC_Create();

/* Set peripheral settings */
R_Config_SCI0_Create();

/* Register undefined interrupt */
R_BSP_InterruptWrite(BSP_INT_SRC_UNDEFINED_INTERRUPT,(bsp_int_cb_t)r_undefined_exception);

/* Disable writing to MPC pin function control registers */
MPC.PWPR.BIT.PFSWE = 0U;
MPC.PWPR.BIT.B0WI = 1U;

/* Enable protection */
SYSTEM.PRCR.WORD = 0xA500U;
}

/*--------------------------------------------------------*/

void R_Config_SCI0_Create(void)
{
/* Cancel SCI stop state */
MSTP(SCI0) = 0U;

/* Set interrupt priority */
IPR(SCI0,TXI0) = _0F_SCI_PRIORITY_LEVEL15;

/* Clear the control register */
SCI0.SCR.BYTE = 0x00U;

/* Set clock enable */
SCI0.SCR.BYTE = _00_SCI_INTERNAL_SCK_UNUSED;

/* Clear the SIMR1.IICM, SPMR.CKPH, and CKPOL bit, and set SPMR */
SCI0.SIMR1.BIT.IICM = 0U;
SCI0.SPMR.BYTE = _00_SCI_RTS | _00_SCI_CLOCK_NOT_INVERTED | _00_SCI_CLOCK_NOT_DELAYED;

/* Set control registers */
SCI0.SMR.BYTE = _01_SCI_CLOCK_PCLK_4 | _00_SCI_MULTI_PROCESSOR_DISABLE | _00_SCI_STOP_1 | _00_SCI_PARITY_DISABLE |
_00_SCI_DATA_LENGTH_8 | _00_SCI_ASYNCHRONOUS_OR_I2C_MODE;
SCI0.SCMR.BYTE = _00_SCI_SERIAL_MODE | _00_SCI_DATA_INVERT_NONE | _00_SCI_DATA_LSB_FIRST |
_10_SCI_DATA_LENGTH_8_OR_7 | _62_SCI_SCMR_DEFAULT;
SCI0.SEMR.BYTE = _00_SCI_BIT_MODULATION_DISABLE | _10_SCI_8_BASE_CLOCK | _00_SCI_NOISE_FILTER_DISABLE |
_00_SCI_BAUDRATE_SINGLE | _00_SCI_LOW_LEVEL_START_BIT;

/* Set bit rate */
SCI0.BRR = 0x0AU;

/* Set RXD0 pin */
MPC.P21PFS.BYTE = 0x0AU;
PORT2.PMR.BYTE |= 0x02U;

/* Set TXD0 pin */
MPC.P20PFS.BYTE = 0x0AU;
PORT2.PODR.BYTE |= 0x01U;
PORT2.PDR.BYTE |= 0x01U;

R_Config_SCI0_Create_UserInit();

}

 

②main()で呼んだR_Config_SCI0_Start()にもちゃんときており、ポーリングもちゃんとされている。

void R_Config_SCI0_Start(void)
{
/* Clear interrupt flag */
IR(SCI0,TXI0) = 0U;
IR(SCI0,RXI0) = 0U;

/* Enable SCI interrupt */
IEN(SCI0,TXI0) = 1U;
IEN(SCI0,TEI0) = 1U;
IEN(SCI0,RXI0) = 1U;
IEN(SCI0,ERI0) = 1U;
}

 

 

  • bunbunさん
    『シリアル0の受信割り込みが発生しません』
    SCI0.SCR.BYTEにRIEは設定されていますか?
    このビットを1 にセットすると、RXI およびERI 割り込み要求を許可します。
  • 早急なご教授有難うございます。

    お恥ずかしながらまさにその部分が抜けており追記したら割り込みが発生しました。

    最近の便利な機能に胡坐をかいてしまい、
    スマートコンフィグレータで生成されたものがどこまで自動反映され、どこを自分で記述しないといけないのかが、あまり理解できておりませんでした。


    いつも有難うございます。


    (自身で投稿したもののクローズ処理をどうやるのかわかりませんが)
    本件、クローズさせて頂きます。
  • bunbunさん、こんにちは。NoMaYです。

    そのクローズは、ちょっと待った、です。以下の関数を呼んでいないのではありませんか?つまり、

    > スマートコンフィグレータで生成されたものがどこまで自動反映され、どこを自分で記述しないといけないのかが、あまり理解できておりませんでした。

    というより、むしろ、API関数の使い方を勘違いした、というようなことではありませんか?

    src/smc_gen/Config_SCI0/Config_SCI0.c

    /***************************************************************************************
    * Function Name: R_Config_SCI0_Serial_Receive
    * Description  : This function receive SCI0data
    * Arguments    : rx_buf -
    *                    receive buffer pointer (Not used when receive data handled by DTC)
    *                rx_num -
    *                    buffer size (Not used when receive data handled by DTC)
    * Return Value : status -
    *                    MD_OK or MD_ARGERROR
    ***************************************************************************************/

    MD_STATUS R_Config_SCI0_Serial_Receive(uint8_t * const rx_buf, uint16_t rx_num)
    {
        MD_STATUS status = MD_OK;

        if (1U > rx_num)
        {
            status = MD_ARGERROR;
        }
        else
        {
            g_sci0_rx_count = 0U;
            g_sci0_rx_length = rx_num;
            gp_sci0_rx_address = rx_buf;
            SCI0.SCR.BIT.RIE = 1U;
            SCI0.SCR.BIT.RE = 1U;
        }

        return (status);
    }

     

  • いつもお世話になっております。
    ありがたい突込みありがとうございます。

    ご指摘の通り、単純に受信割込み(シリアル設定が正しいか?)の確認だけしたかった為、その関数は呼んでおりませんでした。

    (コード生成で吐き出された受信ロジックは、目的のシステム要件にはあわない為
     r_Config_SCI0_transmit_interrupt()やR_Config_SCI0_Serial_Receive()は使用しない予定でして。。。)
  • bunbunさん、こんにちは。NoMaYです。

    今回は、それを敢えて(というか、やむを得ず、というべきな事情で)呼ばないようにしていた場合の案件、ということですね。私の、ちょっと待った、は、ここまでです。どうも、おじゃましました。

    >(コード生成で吐き出された受信ロジックは、目的のシステム要件にはあわない為
    > r_Config_SCI0_transmit_interrupt()やR_Config_SCI0_Serial_Receive()は使用しない予定でして。。。)

  • NoMaYさん、こんにちわ。

    いつもご教授ありがとうございます。
    また宜しくお願い致します。