2 Replies Latest reply on Oct 23, 2019 9:36 PM by HirotakaT_91

    FX3とセンサとのI2C通信について

    TeMa_2997106

      FX3をマスタとして、スレーブとなるセンサに対してI2C通信をしようとしています。

       

      コマンド列としては、下記のようなものです。

      FX3で、このようなコマンドのやり取りを実施する方法をご教示ください。

       

      例1)

      Start(1bit) - SlaveID(0xDA) - Protocol Ver. (0xF2) - API Code (0x20) - Write data(0x02, 0x00, 0x00) - Read Data (0x01) - Checksum (0x15)

      Start(1bit) - SlaveID Read(8bit) - Ack/NAck(8bit) - Read Data(8bit) - Return Value (8bit) - Checksum(8bit) - Stop(1bit)

      (ACKからChecksumまではSlaveが応答)

       

      例2)

      Start(1bit) - SlaveID(0xDA) - Protocol Ver. (0xF2) - API Code (0x20) - Write data(0x03, 0x02, 0x9F, 0x03) - Read Data (0x00) - Checksum (0xB9)

      Start(1bit) - SlaveID Read(8bit) - Ack/NAck(8bit) - Read Data(8bit) - Checksum(8bit) - Stop(1bit)

      (ACKからChecksumまではSlaveが応答)

       

      CX3 I2C Communication with OV5640 Directly

      に資料が付加されており拝見しましたが、スレーブIDを含めたリードとライトが8byte以下になる

      必要があるような記載になっており、やりたい事は実現できないのでは?と思っている次第です。

       

      以上、よろしくお願いします。

        • 1. Re: FX3とセンサとのI2C通信について
          HirotakaT_91

          FX3でI2C通信を行う際の通信は、スタートビット送信後、主に、プリアンブルと、データ送信/受信で構成されます。

           

          プリアンブルは、アドレスの指定に使われ、スレーブアドレス(スレーブID)の指定と、スレーブ内部アドレス空間のアドレス指定ができます。Read通信のために、スタートコンディションを再送することも可能です。

          このプリアンブルのために0xE000041C (I2C_PREAMBLE_DATA)から8バイト分データレジスタが確保されており、FWでプリアンブルバッファにデータを格納した際、ここに格納されます。8バイトよりも多いプリアンブルは指定できません。

           

          プリアンブルの後に、I2C Writeであれば、実際に送信したいデータが続きます。I2C Readであれば、スレーブがデータを返します。

           

           

          いただいている情報だけですと、実現可否についてはまだわかりません。

          どこからどこまでがWriteで、どこからがReadなのかを明確にしていただけますと助かります。

          (Protocol Ver, API code, ChecksumはI2C slaveに書き込まれる値ですか?Writeの後のRead Dataというのはどのような処理をしますか?FX3がI2C Readを実行しますか?「ACKからCheckSumまではSlaveが応答」とのことですが、これはその手前までのフォーマットに従ってI2Cスレーブに対してWrite/(Read)を行った後、Readするとその形式で送られてくるということでしょうか?など。)

           

          よろしくお願い致します。

          Hirotaka Takayama

          • 2. Re: FX3とセンサとのI2C通信について
            HirotakaT_91

            例1)

            Start(1bit) - SlaveID(0xDA) - Protocol Ver. (0xF2) - API Code (0x20) - Write data(0x02, 0x00, 0x00) - Read Data (0x01) - Checksum (0x15) までがI2C Write命令で、

            Start(1bit) - SlaveID Read(8bit) - Ack/NAck(8bit) - Read Data(8bit) - Return Value (8bit) - Checksum(8bit) - Stop(1bit) までがI2C Read命令であるならば実装が可能です

             

            例2)

            Start(1bit) - SlaveID(0xDA) - Protocol Ver. (0xF2) - API Code (0x20) - Write data(0x03, 0x02, 0x9F, 0x03) - Read Data (0x00) - Checksum (0xB9) までがI2C Write命令で、

            Start(1bit) - SlaveID Read(8bit) - Ack/NAck(8bit) - Read Data(8bit) - Checksum(8bit) - Stop(1bit) までがI2C Read命令であるならば実装が可能です。

             

            FX3 API GuideにてI2C命令の書き方については記載があります。プリアンブルについてはFX3 API GUide p69, p70をご参照ください。

             

            例1の場合、以下のような記述で通信が実現できます。

             

            Code snippet for 例1

            data[0] = Protocol Version

            data[1] = API code

            data[2] = Write Data

            data[3] = Write Data1

            data[4] = Write Data2

            data[5] = Read Data Size

            data[6] = Check-sum

            preamble.length    = 1;

            preamble.buffer[0] = SlaveID;

            preamble.ctrlMask  = 0x0000;

            CyU3PI2cTransmitBytes(&preamble, data, 7 , 0);

             

            preamble.length    = 2;

            preamble.buffer[0] = SlaveID;

            preamble.buffer[1] = SlaveID | 0x01;

            preamble.ctrlMask  = 0x0001;

            CyU3PI2cReceiveBytes(&preamble, data, 4, 0);

             

             

            よろしくお願い致します。

            Hirotaka Takayama