AR# 61664

|

Zynq-7000 SoC、I2C - I2C マスターにより無効な読み出しトランザクションが生成される

説明

I2C コントローラーをマスター モードでコンフィギュレーションすると、無効な読み出しトランザクションが生成されます。

ソリューション

説明 : 

この問題は、I2C コントローラーがマスターとして動作しており、読み出しトランザクションを発行している場合に発生します (例: マスター レシーバー)。

HOLD ビットがセットされている場合 (i2c.Control_reg0[HOLD])、転送の最後にコントローラーから STOP コンディションが発行されなくなります。

その代わり、transfer_size (i2c.Transfer_size_reg0) が 0 のときに、ソフトウェアが次の操作を決定するまで SCL が Low に保持されます。

コントローラーのタイムアウトが期限切れになると (i2c.Time_out_reg0[TO] を参照)、コントローラーにより SCL が Low に保持されますが、スレーブ デバイスから 16 バイトの追加の読み出しデータが不正に転送されます。

transfer_size レジスタが破損し、0xFF になります。

FIFO にスペースがあれば、これらの追加バイトは FIFO に保存されます。

この問題は、タイムアウト割り込みがディスエーブルになっていても発生します。

 

影響 :  HOLD ビットが主に次の 2 つの状況で使用されます。

  • 繰り返し START を実行する場合
    I2C インターフェイスを解放せずに読み出しの後に 2 番目の転送を実行するために HOLD ビットが使用され、2 番目の転送が STOP コンディションを発行せずに開始します。
     
  • 大きな読み出し転送を実行する場合
    255B よりも大きい読み出しでは、transfer_size レジスタを再プログラムする必要があります。
    この方法として、transfer_size を 0 にデクリメントした後、大きな値に再プログラムします。

 

この問題は、ソフトウェアが I2C コントローラーをタイムリー (タイムアウト前) にサービスできない場合にのみ発生します。

この問題が発生した場合は、意図しないデータ転送が実行されます。

システムおよび転送の種類によって、これが無害である場合と深刻な問題である場合があります。

 

回避策:      

i2c.Time_out_reg0 を大きな値に設定すると、ソフトウェアが I2C イベントに応答するための時間が長くなり、この問題が発生する確率が低くなります。 

ただし、これによって問題が完全に回避されるわけではありません。

 

この問題を回避するには、HOLD ビットがセットされている場合にソフトウェアで transfer_size が 0 にデクリメントされないようにします。

これにより、「影響」セクションの (a) で説明されている繰り返し START 機能が使用されなくなります。

状況 (b) は、大きな読み出し転送を複数の転送に分割すると回避できます。

ただし、これにはトランザクションを元のサイズに再構築するための上位プロトコル サポートが必要な場合があります。

 

transfer_size が 0 になったときに HOLD ビットがセットされないようにする特別な措置が取られていれば、大きな読み出し転送をサポートすることは可能です。

上記の説明のとおり、transfer_size を再プログラムするには I2C インターフェイスを停止する必要があります。

回避策では、FIFO がフルになるとバスが停止することを利用します。

そのため、次の方法を使用します。
 
  1. ドライバーで、現在の転送で FIFO からどれだけのデータが読み出されたかが把握されるようにします。
  2. 残りのデータが 17B になったら、FIFO からの読み出しを停止します。
  3. transfer_size=1 になるまで待機します。17B のデータが残っているので、FIFO は 16B のデータでフルです。
  4. この時点で I2C インターフェイスが停止し (最後の 1 バイトのデータをまだ転送する必要あり)、ドライバーで transfer_size を再プログラムできます。
  5. ドライバーで通常どおり FIFO から データを読み出し、手順 (2) から続行します。

 

対象となるコンフィギュレーション : I2C をマスターとして使用するシステム

修正状況 : 修正の予定はありません。

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

AR# 61664
日付 05/28/2018
ステータス アクティブ
種類 デザイン アドバイザリ
デバイス
People Also Viewed