Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

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

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

SivaK_96
Employee
Employee
50 questions asked 10 questions asked 5 questions asked

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);

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

                 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);

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

                  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 = I2C_MasterReadByte(I2C_ACK_DATA);

        }

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

                  read_data_buffer = I2C_MasterReadByte(I2C_NAK_DATA);

     }

     }

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

     I2C_MasterSendStop();

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

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

0 件の賞賛
160 件の閲覧回数
寄稿者