低レベルAPIを使用したPSoC® 5LPでのI2Cマスターの実装 - KBA223957 - Community Translated (JA)
- RSS フィードを購読する
- 新着としてマーク
- 既読としてマーク
- ブックマーク
- 購読
- 印刷用ページ
- 不適切なコンテンツを報告
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と組み合わせて使用しないでください。