低レベルAPIを使用したPSoC® 5LPでのI2Cマスターの実装 - KBA223957 - Community Translated (JA)

Version 1

    Community Translated by  NoTa_4591161        Version: **

     

    質問:

    どのように低レベルAPIを使用してPSoC® 5LPでI2Cマスターを実装すればよいのでしょうか?

     

    回答:
    I 2 Cスレーブメモリデバイスとの通信の使用例では、次のコードスニペットを使用します。

     

    1. 書き込みトランザクション

    例えば:

    メモリデバイスのスレーブアドレス: 0x08

    メモリのアドレス: 0x00

    送信されるバイト数: 5

    送信されるデータ: 1、2、3、4、5

    #define SLAVE_ADDRESS (0x08u)

     

    #define SUB_ADDRESS_LOCATION (0x00u)

    #define SUB_ADDRESS_LENGTH (0x01u)

     

    #define WRITE_DATA_LENGTH (5u)

    #define WRITE_DATA_BUFFER_LENGTH (WRITE_DATA_LENGTH + SUB_ADDRESS_LENGTH)

     

    uint8 i = 0;

          uint8 status = 0;

     

    /* 書き込みバッファにサブアドレスの場所と送信するデータをロードします */

                uint8 write_data_buffer[WRITE_DATA_BUFFER_LENGTH] = { SUB_ADDRESS_LOCATION , 1 , 2 , 3 , 4 , 5 };

     

    /* 開始条件とスレーブアドレスを送信し、その後に書き込みビットを送信します */

               status = I2C_MasterSendStart(SLAVE_ADDRESS, I2C_WRITE_XFER_MODE);

     

                /* マスターステータスにエラーがないかどうかを確認します */

                if(status == I2C_MSTR_NO_ERROR)

          {

     

                      for(i=0; i<WRITE_DATA_BUFFER_LENGTH; i++)

            {

     

    /* 最初に書き込みバッファにロードされたスレーブに書き込まれるデータを送信します */

                    status = I2C_MasterWriteByte(write_data_buffer[i]);

     

                       /* マスターステータスにエラーがないかどうかを確認します */         

                     if(status != I2C_MSTR_NO_ERROR)

           {

                          break;

           }

        }

     

    /* トランザクションの完了後に停止条件を送信します */

    I2C_MasterSendStop();;

     

    2. 読み込みトランザクション

    例えば:

    メモリデバイスのスレーブアドレス: 0x08

    メモリのアドレス: 0x00

    読み取るバイト数: 5

     

    #define SLAVE_ADDRESS (0x08u)

     

    #define SUB_ADDRESS_LOCATION (0x00u)

    #define SUB_ADDRESS_LENGTH (0x01u)

     

    #define READ_DATA_LENGTH (5u)

     

    uint8 i = 0;

          uint8 status = 0;

     

    /* 書き込みバッファにサブアドレスの場所をロードします */

                uint8 write_data_buffer[SUB_ADDRESS_LENGTH] = { SUB_ADDRESS_LOCATION };

     

    /* 読み取りバッファを初期化します */

                uint8 read_data_buffer[READ_DATA_LENGTH];

     

    / * 開始条件とスレーブアドレスを送信し、その後に書き込みビットを送信します */

           status = I2C_MasterSendStart(SLAVE_ADDRESS, I2C_WRITE_XFER_MODE);   

     

                /* マスターステータスにエラーがないかどうかを確認します */

                if(status == I2C_MSTR_NO_ERROR)

         {

     

                   for(i=0; i< SUB_ADDRESS_LENGTH; i++)

                   {

        

                       /* サブアドレスを送信します */

                       status = I2C_MasterWriteByte(write_data_buffer[i]);

     

                      /* マスターステータスにエラーがないかどうかを確認します */

                      if(status != I2C_MSTR_NO_ERROR)

            {

                           break;

            }

         }

     

           /* 開始条件とスレーブアドレスを送信し、その後に読み取りビットを送信 */

         

            status = I2C_MasterSendRestart(SLAVE_ADDRESS, I2C_READ_XFER_MODE);

            

               /* マスターステータスにエラーがないかどうかを確認します */

     

         if(status == I2C_MSTR_NO_ERROR)

         {

                    for(i=0; i<(READ_DATA_LENGTH-1); i++)

            {

      

                            /* スレーブから読み取ったデータを読み取りバッファにロードし、その後にACKを続けます */

                            read_data_buffer[i] = I2C_MasterReadByte(I2C_ACK_DATA);

            }

     

                     /* スレーブから最後に読み取られたデータを読み取りバッファにロードし、その後にNACKを続けます */

                      read_data_buffer[i] = I2C_MasterReadByte(I2C_NAK_DATA);

         }

         }

     

         /* トランザクションの完了後に停止条件を送信します */

         I2C_MasterSendStop();

     

     

    APIの詳細については、I 2 Cコンポーネントデータシートを参照してください。

     

    注: WriteBuf()ReadBuf()などの高レベルAPI は、低レベルAPIと組み合わせて使用しないでください。