RX220 SCI12 PDG2バグ?

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
);

if( !res ){
return res;
}

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は見つけられませんでした。
改善をお願いしたく宜しくお願いします。

Parents
  • 解決しました。

    <原因>

    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;
    }
    #else
    switch(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はまだまだ現役!!なので直して欲しいところです、、

Reply
  • 解決しました。

    <原因>

    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;
    }
    #else
    switch(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はまだまだ現役!!なので直して欲しいところです、、

Children
No Data