お世話になっております。RX651のSCI通信で、接続先の機器でフレーミングエラーを発生させても、グループ化された割込み(Excep_ICU_GROUPBL0(void))に飛んで来ません。そもそも他のプログラムではフレーミングエラーが発生した場合グループ化された割込みに飛んできて、そこでエラー処理して継続動作が可能でした。
その実績があるコードを流用していますが割込みに飛んでこない原因が分かりません。どのたかご教授お願いします。
ちょっと試してみました。
// 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に変更したところ問題なくフレーミングエラー発生で割込みかかります。自分のコードに足りない部分をこれから検証します。逆に自分が作った他のプログラムで動いているのが不思議で、たまたま動いているだけで正しく動いていないのだと思います。
ありがとうございました。