CS+ マイコンRX130でシリアル通信の受信を行っていますが、受信割込みが発生しないため、行き詰ってしまったので誰かアドバイスお願いします。
設定
マイコンクロック32MHz、ボーレート19200bps、パリティなし、ストップビット1bit データ長8bitで
下記のように、設定をコード自動生成で作成しました。
void R_SCI1_Create(void){ /* Cancel SCI1 module stop state */ MSTP(SCI1) = 0U;
/* Set interrupt priority */ IPR(SCI1, ERI1) = _0F_SCI_PRIORITY_LEVEL15;
/* Clear the control register */ SCI1.SCR.BYTE = 0x00U;
/* Set clock enable */ SCI1.SCR.BYTE = _00_SCI_INTERNAL_SCK_UNUSED;
/* Clear the SIMR1.IICM, SPMR.CKPH, and CKPOL bit, and set SPMR */ SCI1.SIMR1.BIT.IICM = 0U; SCI1.SPMR.BYTE = _00_SCI_RTS | _00_SCI_CLOCK_NOT_INVERTED | _00_SCI_CLOCK_NOT_DELAYED;
/* Set control registers */ SCI1.SMR.BYTE = _01_SCI_CLOCK_PCLK_4 | _00_SCI_STOP_1 | _00_SCI_PARITY_DISABLE | _00_SCI_DATA_LENGTH_8 | _00_SCI_MULTI_PROCESSOR_DISABLE | _00_SCI_ASYNCHRONOUS_MODE; SCI1.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; SCI1.SEMR.BYTE = _00_SCI_LOW_LEVEL_START_BIT | _00_SCI_NOISE_FILTER_DISABLE | _00_SCI_16_BASE_CLOCK | _00_SCI_BAUDRATE_SINGLE | _00_SCI_BIT_MODULATION_DISABLE;
/* Set bitrate */ SCI1.BRR = 0x0CU;
/* Set RXD1 pin */ MPC.P30PFS.BYTE = 0x0AU; PORT3.PMR.BYTE |= 0x01U;
/* Set TXD1 pin */ MPC.P26PFS.BYTE = 0x0AU; PORT2.PODR.BYTE |= 0x40U; PORT2.PDR.BYTE |= 0x40U; PORT2.PMR.BYTE |= 0x40U;
}
下記受信割込み処理内にブレークポイントを設置して、割込みが入ることを確認使用としたが、受信割込みも、受信エラー割込みには
RXD1端子に波形入力があることを確認したが、下記割込み処理内に入らない。何か足らない設定等がありますでしょうか。
教えてください。
#if FAST_INTERRUPT_VECTOR == VECT_SCI1_RXI1#pragma interrupt r_sci1_receive_interrupt(vect=VECT(SCI1,RXI1),fint)#else#pragma interrupt r_sci1_receive_interrupt(vect=VECT(SCI1,RXI1))#endifstatic void r_sci1_receive_interrupt(void){ if (g_sci1_rx_length > g_sci1_rx_count) { *gp_sci1_rx_address = SCI1.RDR; gp_sci1_rx_address++; g_sci1_rx_count++; }}
#if FAST_INTERRUPT_VECTOR == VECT_SCI1_ERI1#pragma interrupt r_sci1_receiveerror_interrupt(vect=VECT(SCI1,ERI1),fint)#else#pragma interrupt r_sci1_receiveerror_interrupt(vect=VECT(SCI1,ERI1))#endifstatic void r_sci1_receiveerror_interrupt(void){ uint8_t err_type;
/* Clear overrun, framing and parity error flags */ err_type = SCI1.SSR.BYTE; err_type &= 0xC7U; err_type |= 0xC0U; SCI1.SSR.BYTE = err_type;}
MPC の PFS レジスタを設定するには、書き込みプロテクトレジスタ (PWPR)を設定する必要があると思いますが、
そのコードが無いようです、他で、適切な値を設定していますか?
又、受信動作の許可や、受信割り込みの許可などは、他でやっているのでしょうか?
返信ありがとうございます。
PWPRの設定は最初に以下のように設定しております。
MPC.PWPR.BIT.B0WI = 0U; MPC.PWPR.BIT.PFSWE = 1U;
/* Initialize non-existent pins */ PORT0.PDR.BYTE = 0x07U; PORT1.PDR.BYTE = 0x03U; PORT2.PDR.BYTE = 0x3CU; PORT3.PDR.BYTE = 0x08U; PORT5.PDR.BYTE = 0xCFU; PORTA.PDR.BYTE = 0x80U; PORTC.PDR.BYTE = 0x03U; PORTD.PDR.BYTE = 0xF8U; PORTE.PDR.BYTE = 0xC0U; PORTH.PDR.BYTE = 0xF0U; PORTJ.PDR.BYTE = 0x3DU;
/* Set peripheral settings */ R_CGC_Create(); R_IWDT_Create(); R_PORT_Create(); R_SCI1_Create();
/* Disable writing to MPC pin function control registers */ MPC.PWPR.BIT.PFSWE = 0U; MPC.PWPR.BIT.B0WI = 1U;
受信動作の許可や、受信割り込みの許可は、他では実施していません。
bosssaさん
ちょっと見ただけですが、
エラー割込みのプライオリティ設定はあるような気がするんですけど
>IPR(SCI1, ERI1) = _0F_SCI_PRIORITY_LEVEL15;
割込み要求許可や割込み自体の許可はどこでやっているんでしょう?
RX130ではないんですが同じようなRX111で
ICU.IPR[218].BIT.IPR = 5; //SCI0割込みプライオリティ 0:禁止 ~ 15:最高P255ICU.IPR[219].BIT.IPR = 5; //SCI0割込みプライオリティ 0:禁止 ~ 15:最高P255ICU.IPR[220].BIT.IPR = 5; //SCI0割込みプライオリティ 0:禁止 ~ 15:最高P255ICU.IER[0x1B].BIT.IEN3 = 1; //RX割り込み要求許可 IER_1B_IEN3 P255ICU.IER[0x1B].BIT.IEN4 = 1; //TX割り込み要求許可 IER_1B_IEN4 P255
SCI1.SCR.BIT.RIE = 1; //受信割込み 1:許可SCI1.SCR.BIT.TIE = 1; //送信割込み 1:許可SCI1.SCR.BIT.RE = 1; //受信動作 1:許可SCI1.SCR.BIT.TE = 1; //送信動作 1:許可
こんな感じのやつです。
ありがとうございます
割込み要求処理がされてませんでした。