RX220でPDG2を使用時、SCI12を設定して「ソースの生成」をすると、以下の通りとなります。
R_PG_SCI_C12.c(抜粋:赤字がおかしい)
bool R_PG_SCI_Set_C12(void){ bool res;
res = R_SCI_Set( 12,//この行が空 );
if( !res ){ return res; }
return R_SCI_Create( 12, PDL_SCI_ASYNC | PDL_SCI_TX_CONNECTED | PDL_SCI_RX_CONNECTED | PDL_SCI_RX_FILTER_DISABLE | PDL_SCI_HW_FLOW_NONE | PDL_SCI_LSB_FIRST | PDL_SCI_CLK_INT_IO | PDL_SCI_8_BIT_LENGTH | PDL_SCI_PARITY_NONE | PDL_SCI_START_DETECT_LOW_LEVEL | PDL_SCI_STOP_1, BIT_31 | PDL_SCI_PCLK_DIV_1 | PDL_SCI_CYCLE_BIT_8 | 16 | (117647 & 0x00FFFF00ul), 15 );
}
R_PG_SCI_C6.c(抜粋:問題なし)
bool R_PG_SCI_Set_C6(void){ bool res;
res = R_SCI_Set( 6, PDL_SCI_PIN_SCI6_RXD6_PB0 | PDL_SCI_PIN_SCI6_TXD6_PB1 );
return R_SCI_Create( 6, PDL_SCI_ASYNC | PDL_SCI_TX_CONNECTED | PDL_SCI_RX_CONNECTED | PDL_SCI_RX_FILTER_DISABLE | PDL_SCI_LSB_FIRST | PDL_SCI_CLK_INT_IO | PDL_SCI_8_BIT_LENGTH | PDL_SCI_PARITY_NONE | PDL_SCI_START_DETECT_LOW_LEVEL | PDL_SCI_STOP_1, BIT_31 | PDL_SCI_PCLK_DIV_1 | PDL_SCI_CYCLE_BIT_8 | 16 | (117647 & 0x00FFFF00ul), 15 );
R_PG_SCI_C12.cの生成コードがあきらかにおかしく、ポート指定の記述がされません。当然、このままビルドするとエラーになるので、手動でポート指定を追記しエラー回避しています。
あきらかなバグ?と思いますが、patchは見つけられませんでした。改善をお願いしたく宜しくお願いします。
解決しました。
<原因>
R_PG_SCI_Set_C12()関数を実行しても、ICU.IPR238が設定されません。
(SCI1,5,6に相当するICU.IPR218,222,226は相当する関数の実行で設定される)
ICU.IPR238を手動で設定することで、SCI12が動作しました。
<バグ推定箇所>
48pinでは存在しないはずのSCI9に相当するICU.IPR234が代わりに設定されていました。
ソースを追っていくと、IPRレジスタのアドレスを決めているr_pdl_sci_library_data_RX220xx.h, utilities_SCI.cあたりがおかしいように思います。
r_pdl_sci_library_data_RX220xx.h
uint8_t rpdl_SCI_GetIndexFromChannel(const uint8_t);#define SCI_CHANNEL_INDEX(a) rpdl_SCI_GetIndexFromChannel(a)
#define IPR_ADDRESS(a) ( a<9?(volatile uint8_t *)&ICU.IPR[IPR_SCI1_] +\((4 * SCI_CHANNEL_INDEX(a)) / sizeof(uint8_t)) : \(volatile uint8_t *)&ICU.IPR[IPR_SCI1_] +\((4 * (SCI_CHANNEL_INDEX(a)+1)) / sizeof(uint8_t)))
utilities_SCI.c
uint8_t rpdl_SCI_GetIndexFromChannel(const uint8_t channel){#if defined (DEVICE_PACKAGE_48_PIN)switch(channel){case 1:return 0;case 5:return 1;case 6:return 2;case 12:return 3;default:/*Invalid*/return 0xFF;}#elseswitch(channel){case 1:return 0;case 5:return 1;case 6:return 2;case 9:return 3;case 12:return 4;default:/*Invalid*/return 0xFF;}#endif}
⇒48pinだと、SCI9を飛ばしてのアドレスを計算しているが、パッケージが変わってもIPRアドレスは変わらないはずなのでは!?
※私の方では、RX220はまだまだ現役!!なので直して欲しいところです、、