RL78/G10のIICA0のコード生成のバグ

チョコです。

RL78/G10のIICA0のコード生成でバグを見つけたので,報告しておきます。

確認したのはRL78/G10 V1.04.04.01 [11 Nov 2016]です。

(旧版のRL78/G10 V1.04.02.01 [15 May 2015]では正常でした。)

 

IICA0の初期設定(R_IICA0_Create関数)の兼用ポートの設定が間違いです。

void R_IICA0_Create(void)
{
    IICA0EN = 1U; /* supply IICA0 clock */
    IICE0 = 0U; /* disable IICA0 operation */
    IICAMK0 = 1U; /* disable INTIICA0 interrupt */
    IICAIF0 = 0U; /* clear INTIICA0 interrupt flag */
    /* Set INTIICA0 low priority */
    IICAPR10 = 1U;
    IICAPR00 = 1U;
    /* Set SCLA0, SDAA0 pin */
    POM0 |= 0xC0U;
    PMC0 &= 0x3FU;
    P0 |= 0xC0U;
    PM0 |= 0xC0U;
    SMC0 = 0U;
    IICWL0 = _5E_IICA0_IICWL_VALUE;
    IICWH0 = _6A_IICA0_IICWH_VALUE;
    SVA0 = _10_IICA0_MASTERADDRESS;
    STCEN0 = 1U;
    IICRSV0 = 1U;
    SPIE0 = 0U;
    WTIM0 = 1U;
    ACKE0 = 1U;
    IICAMK0 = 0U;
    IICE0 = 1U;
    LREL0 = 1U;
    /* Set SCLA0, SDAA0 pin */
    PM0 &= 0x3FU;
}

P0の設定は 「P0 &=0x3F;」とするのが正しのですが,この順番ではI2Cバスにヒゲがでるので,PM0の設定と合わせて以下のようにすべきです。

    PM0 |= 0xC0U;

    P0 &=0x3F;

 

なお,マニュアルの表4-5 端子機能使用時のレジスタ,出力ラッチの設定例(2/4)にも間違いがあります。

IICA0を使用するときのPm設定は1ではなく0が正しい設定です。

  • チョコさん、報告ありがとうございます。コード生成サポート担当の鈴木です。
    発生の原因を含め、調査の上対応します。遅くとも2017/10のリリース時には修正します。お手数ですが、それまでは上記の修正をお願いします。
  • チョコです。
    情報を追加しておきます。
    RL78/G10でIICA0を使う場合でコード生成を普通に使う場合には,main()関数の頭ででもP0 &= 0x3FU;を実行するのが一番簡単な対策です(実際に通信を開始する前にやれば十分です)。
  • RL78/G1Cも IicaRL78G1C.dll を見ると、IICA0をP0へポートマッピングした場合にPxx=1しているようです。

    [!if SCLA0_SDAA0_P6]
    /* Set SCLA0, SDAA0 pin */
    P6 &= 0xFCU;
    PM6 |= 0x03U;
    [!endif]
    [!if SCLA0_SDAA0_P0]
    /* Set SCLA0, SDAA0 pin */
    POM0 |= 0x03U;
    [!if pinno 32]
    PMC0 &= 0xFCU;
    [!endif]
    P0 |= 0x03U;
    PM0 |= 0x03U;
    [!endif]
  • チョコです。
    同じマクロの入出力を切り替えているので,リダイレクトしても兼用ポートの設定は変わらないので,
    RL78/G1CのP0へのリダイレクトでの設定は明らかにおかしいですね。
    これも,マニュアルが間違えていますね。
  • チョコです。
    新しくリリースされたCS+CC V6.00.00でRL78/G10のIICA0を確認してみたところ,この問題は修正されていました。
    (まだ,リスタート対応はできていないようですが。)