RX651のSCI通信でエラー発生時にグループ化された割込みに制御がうつらない

お世話になっております。
RX651のSCI通信で、接続先の機器でフレーミングエラーを発生させても、グループ化された割込み(Excep_ICU_GROUPBL0(void))に飛んで来ません。
そもそも他のプログラムではフレーミングエラーが発生した場合グループ化された割込みに飛んできて、そこでエラー処理して継続動作が可能でした。

その実績があるコードを流用していますが割込みに飛んでこない原因が分かりません。
どのたかご教授お願いします。

Parents
  • ちょっと試してみました。

    // SCI6 RXI6
    #pragma interrupt Intr_SCI6_RXI6(vect=86)
    void Intr_SCI6_RXI6(void);
    
    // SCI6 TXI6
    #pragma interrupt Intr_SCI6_TXI6(vect=87)
    void Intr_SCI6_TXI6(void);
    
    // GROUPBL0
    #pragma interrupt Intr_GROUPBL0(vect=110)
    void Intr_GROUPBL0(void);
    
    #ifdef __cplusplus
    //#include <ios>                        // Remove the comment when you use ios
    //_SINT ios_base::Init::init_cnt;       // Remove the comment when you use ios
    #endif
    
    void main(void);
    #ifdef __cplusplus
    extern "C" {
    void abort(void);
    }
    #endif
    
    void main(void)
    {
    	SYSTEM.PRCR.WORD = 0xA502;
    	MSTP(SCI6) = 0U;
    	
    	//割り込み優先度
    	IPR(SCI6, RXI6) = 4;
    	IPR(SCI6, TXI6) = 4;
    	IPR(ICU,GROUPBL0) = 4;
    	
    	SCI6.SCR.BYTE = 0x00;
    	
    	SCI6.BRR = 0xC2;			//9,600bps(PCLKB=60MHz)
    	SCI6.SMR.BYTE = 0x00;
    	SCI6.SCMR.BYTE = 0x00;
    	
    	MPC.PWPR.BIT.B0WI  = 0;
    	MPC.PWPR.BIT.PFSWE = 1;
    	
    	//RXD6->P01
    	MPC.P01PFS.BYTE = 0x0A;
    	PORT0.PMR.BIT.B1 = 1;
    	
    	//TXD6->P00
    	MPC.P00PFS.BYTE = 0x0A;
    	PORT0.PMR.BIT.B0 = 1;
    	
    	//グループBL1割り込み
    	ICU.GENBL0.BIT.EN12 = 1;	//TEI6
    	ICU.GENBL0.BIT.EN13 = 1;	//ERI6
    	
    	//割り込みフラグクリア
    	IR(SCI6, TXI6) = 0;
    	IR(SCI6, RXI6) = 0;
    	IR(ICU,GROUPBL0) = 0;
    	
    	//割り込み許可
    	IEN(SCI6, TXI6) = 1;
    	IEN(SCI6, RXI6) = 1;
    	IEN(ICU,GROUPBL0) = 1;
    	
    	//通信開始
    	SCI6.SCR.BYTE = 0xF0;		//ここではTEI割り込みは有効化しない
    	
    	while(1)
    	{
    		__nop();
    	}
    	
    }
    
    #ifdef __cplusplus
    void abort(void)
    {
    
    }
    #endif
    
    void Intr_SCI6_RXI6(void)
    {
    	unsigned char dummy;
    	
    	dummy = SCI6.RDR;
    }
    
    void Intr_SCI6_TXI6(void)
    {
    	__nop();
    }
    
    void Intr_GROUPBL0(void)
    {
    	//TEI6
    	if (ICU.GRPBL0.BIT.IS12 == 1)
    	{
    		__nop();
    	}
    	
    	//ERI6
    	if (ICU.GRPBL0.BIT.IS13 == 1)
    	{
    		SCI6.SSR.BYTE &= ~0x38;		//エラークリア
    	}
    }

    添付のソースで動かしたところ、思ったところに飛んできています。

    SCIを動かすのに(ほぼ)最低限のコードで構成していますので、何か抜けている設定がないか見てみてください。

  • tfさん、こんばんは

    サンプルコードありがとうございました。
    結論を言えば、このコードでエラーの割込み発生しました。
    自分のRX651は100ピンなのでSCI6のポート番号はサンプルと異なりますが、100ピンのP32とP33
    に変更したところ問題なくフレーミングエラー発生で割込みかかります。
    自分のコードに足りない部分をこれから検証します。
    逆に自分が作った他のプログラムで動いているのが不思議で、たまたま動いているだけで正しく動いていないのだと
    思います。

    ありがとうございました。

Reply
  • tfさん、こんばんは

    サンプルコードありがとうございました。
    結論を言えば、このコードでエラーの割込み発生しました。
    自分のRX651は100ピンなのでSCI6のポート番号はサンプルと異なりますが、100ピンのP32とP33
    に変更したところ問題なくフレーミングエラー発生で割込みかかります。
    自分のコードに足りない部分をこれから検証します。
    逆に自分が作った他のプログラムで動いているのが不思議で、たまたま動いているだけで正しく動いていないのだと
    思います。

    ありがとうございました。

Children
No Data