PSoC 4 I2Cマスターは常にBUS_BUSYを報告します - KBA231435 - Community Translated (JA)

Version 1

    Community Translated by NoTa_4591161 Expert     Version: **

     

    Translation - English: PSoC 4 I2C Master Always Reports BUS_BUSY - KBA231435

     

    I2Cマスター構成のSCBブロックは、I2C開始条件でビジーフラグを設定し、I2C停止条件でそれをクリアします。

    SDAラインを論理LOW0.1VDD)にする可能性のあるI2Cバスのノイズは、誤ったスタート条件でトリガーしてしまいます。次に、ハードウェアはバスが永久にビジーであり、この状態から回復しないと想定します。このエラーは、マスターから完全なバイトが受信される前に、アクティブな転送中にスレーブがSCLラインをLOWにプルした場合にも発生する可能性があります。

    この無期限のSCB_I2C_MSTR_BUS_BUSYステータスから回復するには、ステータスがいくつかのサイクルの間継続的にビジーであるときに、SCB_STOP()およびSCB_Start()関数を呼び出してI2Cブロックをリセットする必要があります。

     

    次のコードスニペットは、マスターがスレーブに書き込みを試み、通常はI2CM_I2C_MSTR_NO_ERROR返すこの機能を示しています。ただし、NO_OF_ATTEMPTS 回連続してエラーが発生すると、I2Cブロックがリセットされます。

     

        /* I2C書き込みを開始し、ステータスをチェックします */

        if (I2CM_I2C_MSTR_NO_ERROR == I2CM_I2CMasterWriteBuf(I2C_SLAVE_ADDR,

    buffer, PACKET_SIZE ,

                                        I2CM_I2C_MODE_COMPLETE_XFER ))

        {

    busy_cnt = 0;

            /* I2C書き込み成功 */

        }

        /* I2Cデータの送信中にエラーが発生しました*/

        else

        {

            /* ビジーカウンターフラグを更新します */

    busy_cnt ++;

         

            /* I2C書き込みで継続的なエラーが発生したかどうかを確認します*/

            if (busy_cnt> NO_OF_ATTEMPTS )

            {

    busy_cnt = 0;

             

                /* SCBブロックをリセットします */

    I2CM_Stop();

    I2CM_Start();

            }

        }

     

    関連ドキュメント:

     

    SCBコンポーネントデータシート:https : //www.cypress.com/documentation/component-datasheets/psoc-4-serial-communication-block-scb

    I2Cバス仕様:https : //www.nxp.com/docs/en/user-guide/UM10204.pdf