AR# 63025

Zynq-7000 SoC、I2C のデザイン アドバイザリ - スレーブ レシーバー モードで I2C トランザクションが破損する

説明

PS I2C コントローラーがスレーブ レシーバー モードで、複数の I2C スレーブが同じバスに接続されている場合、転送されたデータ パターンに 0xF0 または 0xF1 が含まれ、その後に PS I2C コントローラーのスレーブ アドレスが続いていると、PS I2C コントローラーで異なる I2C スレーブに送信されたデータを受信して ACK を送信できます。

そのスレーブ アドレスの後に続くデータ バイトに対しては、PS I2C コントローラーが i2c.Status_reg0[RXDV] レジスタ フィールドを 1 に設定し、ACK を生成します。

実際のデータの転送先である I2C スレーブがデータに対して NACK を送信する場合、I2C マスターで I2C スレーブからの NACK ではなく不正な ACK が認識され、バスが破損します。

ソリューション

影響:                     
深刻な問題です。

回避策:
     
  1. マスター ソフトウェア アプリケーションで、ほかのスレーブをターゲットとするメッセージを複数のトランザクションに分割し、0xF0 または 0xF1 の後に Zynq スレーブ アドレスが続くパターンが同じトランザクションに含まれないようにします。

  2. マスター ソフトウェア アプリケーションで、ほかのスレーブにデータを送信する前に、Zynq スレーブをターゲットとする SYNC パターンを書き込みます。
    SYNC ワードが検出されると、Zynq I2C コントローラーのモードがマスター レシーバーに変更され、i2c.Status_reg0 [BA] ビットをポーリングすることによりバスのアクティブ ステートが継続的に監視されます。
    I2C マスターが Zynq スレーブに転送する必要がある場合は、バスが決まった時間だけアイドル状態になり、Zynq I2C コントローラー ソフトウェアはスレーブ レシーバー モードに変更する前に、タイムアウトまで待ってバスがアイドル状態であるかを確認します。
    I2C マスターは Zynq スレーブにデータを転送し続けます。

  3. I2C マスターとスレーブの両方が Zynq にインプリメントされており、同じバスに I2C マスターが 1 つのみ接続されている場合、マスター ソフトウェアはほかのスレーブにデータを転送する間、Zynq スレーブをリセット (slcr.I2C_RST_CTRL[I2Cx_CPU1X_RST]=1 を書き込み) に保持することにより Zynq スレーブを停止します。
    マスター コントローラーが Zynq スレーブにデータを転送する前に、ソフトウェア レベル ハンドシェーク メカニズムを使用して Zynq スレーブ コントローラーがリセットから復帰します。
     
  4. I2C マルチプレクサー チップを使用して、Zynq スレーブをバス上のほかのスレーブから分離します。
    Zynq でないスレーブを 1 つの I2C バスに接続でき、マルチプレクサーにより I2C マスターと Zynq スレーブ間または I2C マスターとバス上のほかのスレーブ間で一度に 1 つの接続のみをイネーブルにできます。
    I2C マスター ソフトウェアはまず、I2C マルチプレクサー チップに書き込むことによりデータの転送先スレーブを選択し、その後実際のデータを転送します。
     
  5. PS I2C コントローラーの代わりに PL のソフト IP を使用します。
 
影響するデバイス リビジョン:

(Xilinx Answer 47916) -「Zynq-7000 AP SoC シリコン リビジョン間の相違点」を参照してください。

影響するコンフィギュレーション:
PS I2C コントローラーを複数 スレーブ トポロジで使用するすべての Zynq デバイス。

解決策:
これはサードパーティのエラッタです。修正の予定はありません。  
 

アンサー レコード リファレンス

マスター アンサー レコード

Answer Number アンサータイトル 問題の発生したバージョン 修正バージョン
47916 Zynq-7000 SoC デバイス - シリコン リビジョン間の相違点 N/A N/A
AR# 63025
日付 05/28/2018
ステータス アクティブ
種類 デザイン アドバイザリ
デバイス