アドレス部の先頭1bitが送信されない(I2C)

CPU : R5F52315AxFP
ツール : CS+forCC Ver8.02

現象 : アドレス部の先頭1bitが送信されない

内容 :
・コード生成を使用してI2Cバスインタフェースを、マスタで生成

・R_RIIC0_Master_Send()を使用して、「0x58(アドレス)」「0x00(データ)」を送信
    
    #define    I2C_E2P_ADDRESS                0x58
    ge2p_Write_Buffer[0] = 0x00;
    R_RIIC0_Master_Send(I2C_E2P_ADDRESS, ge2p_Write_Buffer, 1u);
    
・オシロスコープで波形(scope_0.png)を見る。(上側がSCL、下側がSDA)
・本来は9bit(8bit+ack)のハズが、8bitしかSCLが出ていない。
・SDAを見ると、アドレス部の先頭1bitが送信されず、1bitシフトされた形になっている

質問内容:
先頭の1bitが出力されないまま処理が進んでいる、もしくは、出力が出来なかったと思われるので、
コード生成で作成された「r_cg_riic_user.c」の修正が必要なのでしょうか?
その場合は、どの部分の修正が必要なのかを教えて頂けませんでしょうか?

Parents
  • コード生成で作成された、「r_cg_riic_user.c」の「r_riic0_transmit_interrupt()」を見てみると、
    RIIC0.ICDRT = (uint8_t)(g_riic0_slave_address << 1U);
    と書かれており、意図的に1bitシフトされてました。

    これを、
    RIIC0.ICDRT = (uint8_t)(g_riic0_slave_address);
    に修正したら解決しましたが、何故1bitシフトするように書かれていたのか不明です。

    この修正でよろしかったのでしょうか?
    何か他に影響がないか不安です。
Reply
  • コード生成で作成された、「r_cg_riic_user.c」の「r_riic0_transmit_interrupt()」を見てみると、
    RIIC0.ICDRT = (uint8_t)(g_riic0_slave_address << 1U);
    と書かれており、意図的に1bitシフトされてました。

    これを、
    RIIC0.ICDRT = (uint8_t)(g_riic0_slave_address);
    に修正したら解決しましたが、何故1bitシフトするように書かれていたのか不明です。

    この修正でよろしかったのでしょうか?
    何か他に影響がないか不安です。
Children
  • miesuqe2さん
    ビット0はマスタ送信の場合は0で、残りの上位7ビットがアドレスになるためではないですか。

  • チョコです。
    世の中では,スレーブアドレスは7bitであらわすことが多いようです。
    ここも,g_riic0_slave_addressのデータが7bitで,その後ろにR/Wビットを付加して
    8bitにしてから送信するようにしているものと考えられます。
    ここらは,日ごろRL78を使っているので,少し混乱するところではありますが。

    >この修正でよろしかったのでしょうか?
    おそらく問題があると思います。
    基本的に,I2C_E2P_ADDRESSを0x58ではなく,0x2CにしておくのがRXでの正しい
    修正です。