1

私は PSoC ボードを初めて使用し、デジタル コンパスから x、y、z 値を読み取ろうとしていますが、コンパス自体で送信を開始する際に問題が発生しています。

ここでいくつかの Arduino チュートリアルをオンラインで見つけましたが、PSoC にはライブラリがないため、コードを複製することはできません。

また、ここでHMC5883L データシートを読んでいて、コンパスにバイトを書き込んで値を取得することを想定していますが、何も受信できませんでした。受け取った値はすべてゼロです。これは、間違ったアドレスから値を読み取ったことが原因である可能性があります。

すぐにあなたの答えを願っています。

4

2 に答える 2

2

PSoC を使い始めたばかりのときは、かなり扱いにくいものです。通信したいデバイスと i2c モジュール自体の両方のドキュメントを注意深く読む必要があります。

リンクしたデバイスのデータシートには、18 ページに次のように記載されています。

すべてのバス トランザクションは、マスタ デバイスが開始シーケンスを発行し、その後にスレーブ アドレス バイトが続くことで始まります。アドレス バイトにはスレーブ アドレスが含まれます。上位 7 ビット (bits7-1)、および最下位ビット (LSb)。アドレス バイトの LSb は、操作が読み取り (LSb=1) か書き込み (LSb=0) かを指定します。9 番目のクロック パルスで、受信スレーブ デバイスは ACK (または NACK) を発行します。これらのバス イベントに続いて、マスターは書き込み操作のためにデータ バイトを送信するか、スレーブは読み取り操作でデータをクロック出力します。すべてのバス トランザクションは、マスタがストップ シーケンスを発行して終了します。

I2C_MasterWriteBuf 関数を使用すると、上記の HMC のデータシートの状態をすべてラップします。開始コマンド、その ack の処理、データ処理など。指定する必要があるのは、送信方法だけです。

PSoC の I2C モジュール データシートを参照すると、MasterWriteBuf 関数は、デバイス アドレス、送信するデータへのポインター、送信するバイト数、および「モード」を受け取ります。ドキュメントのさまざまな転送モードを示しています。

I2C_MODE_COMPLETE_XFER Start から Stop までの完全な転送を実行します。
I2C_MODE_REPEAT_START Start の代わりに Repeat Start を送信します。
I2C_MODE_NO_STOP 停止せずに転送を実行

私が間違っていなければ、MODE_COMPLETE_XFRE 転送は開始コマンドと停止コマンドを送信します。

必要に応じてこれを「ビットバン」することもできますが、I2C_MasterSendStart、WriteByte、SendStop などで直接呼び出すことができます。ただし、writebuf 関数を呼び出す方が簡単です。

次のようなコードを書く必要があります。

// fill in your data or pass in the buffer of data you want to write 
// if this is contained in a function call. I'm basing this off of HMC's docs
uint8 writeBuffer[3];
uint8 readBuffer[6];
writeBuffer[0] = 0x3C;
writeBuffer[1] = 0x00;
writeBuffer[2] = 0x70;
I2C_MasterWriteBuf(HMC_SLAVE_ADDRESS, &writeBuffer, 3, I2C_MODE_COMPLETE_XFER);
while((I2C_MasterStatus() & I2C_MSTAT_WR_CMPLT) == 0u)
{
    // wait for operation to finish
}

writeBuffer[1] = 0x01;
writeBuffer[2] = 0xA0;
I2C_MasterWriteBuf(HMC_SLAVE_ADDRESS, &writeBuffer, 3, I2C_MODE_COMPLETE_XFER);
// wait for operation to finish

writeBuffer[1] = 0x02;
writeBuffer[2] = 0x00;
I2C_MasterWriteBuf(HMC_SLAVE_ADDRESS, &writeBuffer, 3, I2C_MODE_COMPLETE_XFER);
// wait for operation to finish
CyDelay(6); // docs state 6ms delay before you can start looping around to read

for(;;)
{
    writeBuffer[0] = 0x3D;
    writeBuffer[1] = 0x06;
    I2C_MasterWriteBuf(HMC_SLAVE_ADDRESS, &writeBuffer, 2, I2C_MODE_COMPLETE_XFER);
    // wait for operation to finish

    // Docs don't state any different sort of bus transactions for reads. 
    // I'm assuming it'll be the same as a write
    I2C_MasterReadBuf(HMC_SLAVE_ADDRESS, readBuffer, 6, I2C_MODE_COMPLETE_XFER);  
    // wait for operation to finish, wait on I2C_MSTAT_RD_CMPLT instead of WR_COMPLT  

    // You should have something in readBuffer to work with

    CyDelay(67); // docs state to wait 67ms before reading again
}

私はちょうど頭の上からそれを書きました。それがうまくいくかどうかはわかりませんが、始めて試すには良い場所だと思います. I2C サンプル プロジェクトもあると思います。

WriteBuf 関数が魔法のコマンドのように見えるだけでなく、MasterWriteBuf 関数を右クリックして [Find Definition] をクリックすると (プロジェクトをビルドした後)、それが何をしているかが表示されます。 .

于 2016-09-13T21:40:51.923 に答える