I2C マスター(VHDL)

Logic Home

コードのダウンロード

バージョン2.2:i2c_master.vhd (14.1 KB)
トランザクション終了時のSDAの小さなグリッチを修正(バージョン2.1で導入)

バージョン2.1:i2c_master_v2_1.vhd(14.0 KB)
ゲーテッドクロックをクロックイネーブルに変更
スタート時とストップ時のSCLのタイミングを調整

バージョン2.0:i2c_master_v2_0.vhd (13.5 KB)
同一トランザクション内で異なるスレーブとのインターフェースが可能な機能を追加
エラー時にack_errorが「1」ではなく「Z」になるack_errorのバグを修正
ack_error信号がクリアされるタイミングを修正

バージョン1.0:i2c_master_v1_0.vhd (12.9 KB)
最初の公開リリース

主な内容

  • Inter-Integrated Circuit(I2CまたはIIC)マスターコンポーネントのVHDLソースコード
  • シングルマスターバス用NXP UM10204のI2Cバス仕様に適合
  • ユーザー定義可能なシステムクロック
  • ユーザー定義可能なI2Cシリアルクロック周波数
  • スタート、ストップ、リピートスタート、およびアクノレッジの各条件を生成
  • 7ビットスレーブアドレスを使用
  • スレーブによるクロックストレッチングとの互換性
  • マルチマスターバスには推奨しない(アービトレーションや同期がない)
  • スレーブアクノレッジエラーをユーザーロジックに通知

はじめに

本稿では、CPLDやFPGAで使用するためにVHDLで記述されるシングルマスターバス用のI2Cマスターコンポーネントの詳細を述べます。コンポーネントは、パラレルインターフェースを介してユーザーロジックからの読み取りとユーザーロジックへの書き込みを行います。これはQuartus IIバージョン11.1を使用して設計されました。リソース要件は、実装によって異なります。図1は、システムに統合されたI2Cマスターの典型的な例を示しています。このI2Cマスターを組み込んでSPI-I2C Bridgeを作成するデザインは、こちらから入手できます。

i2c_master_block_diagram

図1.実装例

背景

I2Cバスは、Philips(現在のNXP)が発明し規格化した2線式半二重データリンクです。I2Cバスの2つのライン、SDAとSCLは双方向でオープンドレインであり、抵抗でプルアップされています。SCLはシリアルクロックラインで、SDAはシリアルデータラインです。バス上のデバイスは、ラインをグランドに引き込むと論理0を送信し、ラインを解放(フローティングのままに)すると論理1を送信します。

詳しくは、下記の「追加情報」の項に添付されているI2Cの仕様書をご覧ください。プロトコルの詳細、電気的仕様、プルアップ抵抗のサイズの決め方などを説明しています。

動作理論

I2Cマスターは、図2に示すステートマシンを使用して、I2Cバスプロトコルを実装します。起動すると、コンポーネントは直ちにready状態になります。ena信号がコマンドをラッチするまで、この状態で待機します。start状態はI2Cバス上にスタート条件を生成し、command状態はアドレスとrwコマンドをバスに伝達します。それから、slv_ack1状態は、スレーブの確認応答をキャプチャして検証します。その後、rwコマンドによって、コンポーネントはスレーブへのデータ書き込み(wr状態)またはスレーブからのデータ受信(rd状態)を行います。完了すると、マスターは書き込みの場合はスレーブの応答(slv_ack2状態)をキャプチャして検証し、読み取りの場合は自身の応答(mstr_ack状態)を発行します。ena信号が他のコマンドをラッチした場合、前のコマンドと同じであればマスターは直ちに次の書き込み(wr状態)または読み取り(rd状態)を続行します。もし、前のコマンドと異なる場合(例えば、書き込みに続く読み取り、読み取りに続く書き込み、または新しいスレーブアドレス)、マスターはI2C仕様に従って、繰り返しスタート(start状態)を発行します。いったんマスターが読み取りまたは書き込みを完了したあとena信号が新しいコマンドをラッチしないと、マスターはストップ条件(stop状態)を生成し、ready状態に戻ります。

i2c_master_state_diagram

図2.I2C マスターの状態遷移図

ステートマシンのタイミングは、後述の「シリアルクロック速度の設定」の項で説明するGENERICパラメータinput_clkbus_clkから導出されます。カウンタは、scl自身と同様に、ステートマシンを動かすデータクロックを生成します。

ポートの説明

表1にI2Cマスターのポートを説明します。

表1.ポートの説明

port_descriptions

シリアルクロックのスピード設定

このコンポーネントは、ENTITYで宣言された2つのGENERICパラメータ、input_clkbus_clkからシリアルクロックsclを導出します。input_clkパラメータは、入力システムクロックのclk周波数(Hz)に設定する必要があります。サンプルコードのデフォルト設定は50MHz(コンポーネントのシミュレーションとテストが行われた周波数)です。bus_clkパラメータは、目的とするシリアルクロックsclの周波数に設定する必要があります。サンプルコードのデフォルト設定は400kHzで、I2C仕様の高速モードのビットレートに対応しています。

トランザクション

busy出力ポートの論理レベルがローになると、そのコンポーネントがコマンドを受け付ける準備ができていることを示します。トランザクションを開始するには、ユーザーロジックは、希望するスレーブアドレス、rwコマンド、書き込みデータを、それぞれaddrrwdata_wrポートに配置し、ena信号をアサートします。コマンドは以下のシステムクロックclkでクロックインされません。むしろ、コンポーネントはすでに内部でI2Cタイミングを生成しており、そのタイミングに基づいてコマンドをクロックインします。したがって、ユーザーロジックは、これらの入力がI2Cマスターにラッチされるタイミングを特定するために、busy信号がアサートされるのを待つ必要があります。

それから、I2Cマスターはコマンドを実行します。完了するとbusy信号をディアサートして、読み込んだデータがdata_rdポートで利用できることを示し、エラーがあればack_errorポートにフラグが立てられます。

トランザクション中は、複数の読み取りと書き込み(およびその組み合わせ)を実行することができます。現在のコマンドの終了時にena信号がアサートされると、I2Cマスターはaddrrwdata_wrの新しい値をラッチし、直ちに新しいコマンドを実行します。ビジー信号は、data_rdに読み出しデータが使用可能であることを示すために1sclサイクルだけディアサートし、新しいコマンドがラッチされ実行されていることを示すために再アサートします。

トランザクションの例

図3に、一般的なトランザクションのタイミング図を示します。ユーザーロジックは、アドレス「1010101」、書き込みを示すrwコマンド「0」、書き込みデータ「10011001」を提示します。ena信号をアサートして、これらの値をラッチします。busy信号がアサートされると、ユーザーロジックは新しいコマンドを発行します。アドレスは「1010101」のままですが、次のコマンドは読み取りです(rw= 「1」)。enaはアサートされたままです。I2Cマスターは最初のコマンドを終了すると、busy信号をディアサートしてその完了を示します。enaがアサートされているので、I2Cマスターは新しいコマンドをラッチし、busy信号を再アサートします。busy信号が再アサートされると、ユーザーロジックは2番目のコマンドが実行されていることを認識し、ena信号をディアサートしてこのコマンドに続くトランザクションを終了させます。I2Cマスターは読み取りコマンドの実行を終了し、読み取ったデータ(「11001100」)をdata_rd ポートに出力し、busy信号を再度ディアサートします。

i2c_transaction_write_read_v2_1

図3.典型的なトランザクションのタイミング図

新しいコマンドでトランザクションを続行するには、ena信号と新しい入力が現在のコマンドの最後のデータビットまでに存在している必要があります。従って、busy信号が現在のコマンドをラッチしたことを示したら、すぐに新しいコマンドを発行することをお勧めします。ena信号は、トランザクションの最後のコマンドがラッチされるまで、単にアサートされたままにしておくことができます。

I2Cマスターを制御するユーザーロジックの例

以下のユーザーロジックコードの切り抜きは、複数の読み取りと書き込みを伴うトランザクションを管理するための簡単な手法を示しています。この実装例では、適切なタイミングでI2Cマスターにコマンドを発行するために、busy信号の遷移をカウントしています。状態「get_data」は、スレーブデバイスの複数のレジスタからデータを取得する場合など、1回のトランザクションでI2Cバスを介して書き込み、読み取り、2回目の書き込み、2回目の読み取りを送信するために必要なすべてを実行します。

example_code

example_code.txt(2.3 KB)

エラーの確認応答

送信された各バイトの後に、I2Cバスの受信側は確認応答または否定応答の信号を発行する必要があります。I2Cマスターがスレーブから誤った応答を受信した場合、I2Cマスターはack_errorポートにエラーフラグを立ててユーザーロジックに通知します。I2Cマスターは情報の再送信を自動的に試行しないため、ユーザーロジックは、コマンドを再発行するか、追加アクションを実行するかどうかを決定する必要があります。次のトランザクションが開始されると、ack_errorポートはクリアされます。

クロックストレッチング

I2C仕様書の3.1.9項では、スレーブがsclをローに保持することでトランザクションを実質的に一時停止するオプション機能を定義しています。スレーブによっては、例えば、受信したデータを保存してから続行するために時間が必要な場合などに、このような動作をするように設計されています。このI2Cマスターコンポーネントは、この機能を実装したスレーブと互換性があります。I2Cマスターを制御するユーザーロジックによる操作は必要ありません。

リセット

I2Cマスターコンポーネントが動作するには、reset_n入力ポートのロジックがハイである必要があります。このポートの論理レベルをローにすると、コンポーネントが非同期にリセットされます。リセット中、コンポーネントはbusy ポートをハイに保持し、I2Cマスターが使用できないことを示します。sclsdaポートはハイインピーダンスになり(ると想定され)、data_rdack_error 出力ポートはクリアされます。リセットから解放されると、I2Cマスターが再び通信できる状態になったときに、busy ポートがディアサートされます。

結論

このI2Cマスターは、I2Cスレーブと簡単なパラレルインタフェースで通信できるプログラマブルロジックコンポーネントです。シングルマスターバスに関してはNXPのI2C仕様に準拠し、オプションでクロックストレッチング機能も搭載しています。

追加情報

UM10204, I2C-bus specification and user manual, NXP Semiconductors N.V.(1.3 MB)

関連するトピック

SPI to I2C Bridge (VHDL) - このデザインでは、上記のI2C Masterを使用して、SPI - I2C Bridgeを実装しています。

Temperature Sensor TCN75A Pmod Controller (VHDL) - このデザインでは、上記のI2C Masterを使用して、Microchip製TCN75A温度センサの設定とデータ収集を行います。

Temperature Sensor ADT7420 Pmod Controller (VHDL) - このデザインでは、上記のI2C Masterを使用して、Analog Devices製ADT7420温度センサの設定とデータ収集を行います。

Color Sensor Pmod Controller (VHDL) - このデザインでは、上記のI2C Masterを使用して、AMS製TCS3472 カラー光/ デジタルコンバータの設定とデータ収集を行います。

Compass Pmod Controller (VHDL) - のデザインでは、上記のI2C Masterを使用して、Memsic製 MMC34160PJの磁力計の設定とデータ収集を行います。

ADC AD7991 Pmod Controller (VHDL) - このデザインでは、上記のI2C Masterを使用して、 Analog Devices製AD7991(4チャンネル、12ビットADコンバータ)のデータ収集を行います。

Humidity and Temperature Sensor Pmod Controller (VHDL) - このデザインでは、上記のI2C Masterを使用して、Texas Instruments製HDC1080湿度計の設定とデータ取得を行います。

Real-Time Clock MCP79410 Pmod Controller (VHDL) - このデザインでは、上記のI2C Masterを使用して、Microchip製MCP79410リアルタイムクロック/カレンダーを制御しています。

コンタクト先

コメント、返信、質問などは eewiki@digikey.comに送ってください。




オリジナル・ソース(English)