FAQ 3000055 : RL78コード生成で簡易I2Cを使ったときに、ストップコンディションの生成に失敗

Q : 質問

RL78コード生成で簡易I2Cを使ったときに、ストップコンディションの生成に失敗します


A : 回答

簡易I2Cのストップ・コンディション発生のフロー・チャートにCKOmnビットに1を書き込む際に注意があります。
※ I2CバスのSCLロウ幅規格を満足するタイミングとしてください。
RL78/G13 ユーザーズマニュアル ハードウェア編 Rev3.30の場合 「12.8.4 ストップ・コンディション発生」参照




高速オンチップ・オシレータクロックに32MHzを使用したときにストップコンディションの発生に失敗するときがあります。
その際は、下記を参考に生成されたコードに適宜ウェイト処理を追加してください。

例:シリアル・アレイ・ユニット0のチャネル0を簡易I2Cに設定した場合


ファイル [r_cg_serial.c] の 関数 void R_IIC00_StopCondition(void) にウェイト処理を追記します
  修正前
  void R_IIC00_StopCondition(void)
  {
      volatile uint8_t w_count;
      
      ST0 |= _0001_SAU_CH0_STOP_TRG_ON;           /* disable IIC00 */
      SOE0 &= ~_0001_SAU_CH0_OUTPUT_ENABLE;       /* disable IIC00 output */
      SO0 &= ~_0001_SAU_CH0_DATA_OUTPUT_1;        /* clear IIC00 SDA */
      SO0 |= _0100_SAU_CH0_CLOCK_OUTPUT_1; /* set IIC00 SCL */
      
      /* Change the waiting time according to the system */
      for (w_count = 0U; w_count <= IIC00_WAITTIME; w_count++)
      {
          NOP();
      }
       
      SO0 |= _0001_SAU_CH0_DATA_OUTPUT_1;         /* set IIC00 SDA */
  }

  修正後 (→ 部分を追記)
  void R_IIC00_StopCondition(void)
  {
      volatile uint8_t w_count;
        
      ST0 |= _0001_SAU_CH0_STOP_TRG_ON;           /* disable IIC00 */
      SOE0 &= ~_0001_SAU_CH0_OUTPUT_ENABLE;       /* disable IIC00 output */
      SO0 &= ~_0001_SAU_CH0_DATA_OUTPUT_1;        /* clear IIC00 SDA */
 →  for (w_count = 0U; w_count < 10; w_count++)
 →  {
 →      NOP();
 →  }
      SO0 |= _0100_SAU_CH0_CLOCK_OUTPUT_1; /* set IIC00 SCL */
       
      /* Change the waiting time according to the system */
      for (w_count = 0U; w_count <= IIC00_WAITTIME; w_count++)
      {
          NOP();
      }
      
      SO0 |= _0001_SAU_CH0_DATA_OUTPUT_1;         /* set IIC00 SDA */
  }

なお、コード生成を実行後は追記した部分が消去されるため、コード生成を実行するたびにウェイト処理の追記が必要です。

適用製品

e² studio
CS+ (旧 CubeSuite+)
コード生成支援ツール
Applilet3
AP4
他にご質問がございましたら、リクエストを送信してください