アドレス部の先頭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
  • miesuge2さん、こんにちは。NoMaYです。

    チョコさんも書かれていますが、アドレスの定義としては、7bitで表す流儀と8bitで表す流儀が混在してしまっています。電子工作で有名なのは、Arduinoは7bit流儀、Mbedは8bit流儀、です。ですので、今回の場合、アドレスが0xA0ということであれば(0xA0>>1)を指定することになると思います。今回の状況から察するに、BR24G04-3のマニュアルでアドレスが0xA0となっていたということであれば、BR24G04-3のマニュアルは8bit流儀だった、ということだろうと思うのです。

    I2Cのスレーブアドレス - 滴了庵日録
    lipoyang.hatenablog.com/entry/20150713/p2

    I2Cのスレーブアドレスは7bit表記の場合と8bit表記の場合があって紛らわしい。
    7bit派: Arduino, PSoC, Linux, .NET MF
    8bit派: mbed, CS+

    (なお、上の8bit派のCS+はRL78コード生成のことだと思います。CS+でもRXコード生成は7bit派ということになりますね。)

    Arduino 日本語リファレンス - musashinodenpa
    www.musashinodenpa.com/arduino/ref/index.php?f=1&pos=341

    I2Cアドレスには7ビットと8ビットのバージョンがあります。7ビットでデバイスを特定し、8番目のビットで書き込みか読み出しかを指定します。Wireライブラリは常に7ビットのアドレスを使用します。8ビットのアドレスを使うサンプルコードやデータシートがあったら、最下位のビットを(1ビットの右シフトで)落とし、0から127の範囲へ変更することになるでしょう。

Reply
  • miesuge2さん、こんにちは。NoMaYです。

    チョコさんも書かれていますが、アドレスの定義としては、7bitで表す流儀と8bitで表す流儀が混在してしまっています。電子工作で有名なのは、Arduinoは7bit流儀、Mbedは8bit流儀、です。ですので、今回の場合、アドレスが0xA0ということであれば(0xA0>>1)を指定することになると思います。今回の状況から察するに、BR24G04-3のマニュアルでアドレスが0xA0となっていたということであれば、BR24G04-3のマニュアルは8bit流儀だった、ということだろうと思うのです。

    I2Cのスレーブアドレス - 滴了庵日録
    lipoyang.hatenablog.com/entry/20150713/p2

    I2Cのスレーブアドレスは7bit表記の場合と8bit表記の場合があって紛らわしい。
    7bit派: Arduino, PSoC, Linux, .NET MF
    8bit派: mbed, CS+

    (なお、上の8bit派のCS+はRL78コード生成のことだと思います。CS+でもRXコード生成は7bit派ということになりますね。)

    Arduino 日本語リファレンス - musashinodenpa
    www.musashinodenpa.com/arduino/ref/index.php?f=1&pos=341

    I2Cアドレスには7ビットと8ビットのバージョンがあります。7ビットでデバイスを特定し、8番目のビットで書き込みか読み出しかを指定します。Wireライブラリは常に7ビットのアドレスを使用します。8ビットのアドレスを使うサンプルコードやデータシートがあったら、最下位のビットを(1ビットの右シフトで)落とし、0から127の範囲へ変更することになるでしょう。

Children
  • miesuqe2さんチョコさんがご指摘のように
    RIIC0.ICDRT = (uint8_t)(g_riic0_slave_address << 1U);
    のソースコードは変更せずにアドレスを
    0xA0(1010 0000 )ではなく0x50(0101 0000)で指定されては。