(57)【特許請求の範囲】
【請求項１】
マルチマスターシリアルコンピュータバスと、
前記バスに接続された第1のマスターと、
前記バスに接続された第2のマスターと、
前記バスに接続されたスレーブデバイスと、
前記第1のマスターから第2のマスターおよびスレーブデバイスへ伸びる第1のI/Oラインと、
前記第2のマスターから第1のマスターおよびスレーブデバイスへ伸びる第2のI/Oラインとを備えていて、
前記バスの使用を調停するためのバスアービトレーションプロトコルが、いずれかのマスターがバスマスターになるたびに、前記マスターが単一の処理を実行することのみができるように、前記マスターを制限する時、前記マスターは、I/Oラインを用いて各々他方に信号を送ってバスマスターにならないようにするように各々適合されていることを特徴とする装置。
【請求項２】
前記第2のマスターがスレーブデバイスにアクセスすることを意図していることを示している場合には、第1のマスターはバスの使用を試みないし、前記第1のマスターがスレーブデバイスにアクセスすることを意図していることを示している場合には、第2のマスターはバスの使用を試みないことを特徴とする請求項１に記載の装置。
【請求項３】
各マスターは、他のマスターの介入なしでバスマスターになる連続する複数の時間、そのそれぞれのI/Oライン上の信号をアサートしてバスマスターになるように適合されていることを特徴とする請求項１に記載の装置。
【請求項４】
前記マスターはマイクロコントローラであり、前記スレーブデバイスはメモリデバイスであることを特徴とする請求項１に記載の装置。
【請求項５】
前記第1のマスターは、第2のマスターに信号を送ってバスマスターにならないようにするように適合されていて、前記第1のマスターは、スレーブデバイスとの中断されないリードモディファイライト処理を実行するように更に適合されていることを特徴とする請求項１に記載の装置。
【請求項６】
前記マルチマスターシリアルコンピュータバスは、インターインテグレーテッドサーキット（I２C）バスであることを特徴とする請求項１に記載の装置。
【請求項７】
前記スレーブデバイスに接続されたI/Oラインは、スレーブデバイスに、どのマスターがスレーブデバイスにアクセスしているかを示すように適合されていることを特徴とする請求項１に記載の装置。
【請求項８】
マルチマスターシリアルコンピュータバスと、
前記バスに接続された複数のマスターと、
前記バスに接続された複数のスレーブデバイスと、
複数のI/Oラインとを備えていて、複数のI/Oラインのそれぞれは、複数のマスターの各々から、複数のマスターの他の全ておよびスレーブデバイスの各々へ伸び、
前記バスの使用を調停するためのバスアービトレーションプロトコルが、いずれかのマスターがバスマスターになるたびに、前記マスターが単一の処理を実行することのみができるように、前記マスターを制限する時、前記マスターは、I/Oラインを用いて他方に信号を送ってバスマスターにならないようにするように各々適合されていることを特徴とするシステム。
【請求項９】
他のいずれかのマスターがスレーブデバイスにアクセスすることを意図していることを
示している場合には、マスターはバスの使用を試みないことを特徴とする請求項８に記載のシステム。
【請求項１０】
各マスターは、他のマスターの介入なしでバスマスターになる連続する複数の時間、そのそれぞれのI/Oライン上の信号をアサートしてバスマスターになるように適合されていることを特徴とする請求項８に記載のシステム。
【請求項１１】
前記マスターはマイクロコントローラを含み、前記スレーブデバイスは少なくとも1つのメモリデバイスを含むことを特徴とする請求項８に記載のシステム。
【請求項１２】
各マスターは、他の全てのマスターに信号を送ってバスマスターにならないようにするように適合されていて、少なくとも1つのマスターは、スレーブデバイスとの中断されないリードモディファイライト処理を実行するように更に適合されていることを特徴とする請求項８に記載のシステム。
【請求項１３】
前記マルチマスターシリアルコンピュータバスは、インターインテグレーテッドサーキット（I２C）バスであることを特徴とする請求項８に記載のシステム。
【請求項１４】
前記スレーブデバイスに接続されたI/Oラインは、スレーブデバイスに、どのマスターがスレーブデバイスにアクセスしているかを示すように適合されており、I/Oラインの数はマスターの数と同じである、ことを特徴とする請求項８に記載のシステム。
【請求項１５】
第1のマスター、第2のマスターおよびスレーブデバイスを接続するマルチマスターシリアルコンピュータバスを提供するステップと、
前記第1のマスターから第2のマスターおよびスレーブデバイスへ伸びている第1のI/Oラインを提供するステップと、
前記第2のマスターから第1のマスターおよびスレーブデバイスへ伸びている第2のI/Oラインを提供するステップと、
いずれかのマスターがバスマスターになる時に、前記バスの使用を調停するためのバスアービトレーションプロトコルが、前記マスターが前記スレーブデバイスとの単一の処理を実行することのみができるように、前記マスターの各々を制限する時、第1のマスターが、第2のマスターの介入なしでスレーブデバイスとの連続する、中断されない処理のシーケンスを実行することを意図している時に、第1のI/Oラインを用いて第2のマスターに信号を送ってバスマスターにならないようにするステップと、第2のマスターが、第1のマスターの介入なしでスレーブデバイスとの連続する、中断されない処理のシーケンスを実行することを意図している時に、第2のI/Oラインを用いて第1のマスターに信号を送ってバスマスターにならないようにするステップとを有していることを特徴とする方法。
【請求項１６】
前記第2のマスターがスレーブデバイスにアクセスすることを意図していることを示している場合には、第1のマスターはバスの使用を試みないし、前記第1のマスターがスレーブデバイスにアクセスすることを意図していることを示している場合には、第2のマスターはバスの使用を試みないことを特徴とする請求項１５に記載の方法。
【請求項１７】
前記スレーブデバイスにアクセスすることを意図していることを示すために、各マスターのそれぞれのI/Oライン上の信号をアサートするステップを更に有していることを特徴とする請求項１５に記載の方法。
【請求項１８】
前記第1のマスターから第2のマスターに信号を送ってバスマスターにならないようにするステップと、
前記第1のマスターによって、スレーブデバイスとの中断されないリードモディファイ
ライト処理を実行するステップとを更に有していることを特徴とする請求項１５に記載の方法。
【請求項１９】
前記マルチマスターシリアルコンピュータバスを提供するステップは、インターインテグレーテッドサーキット（I２C）バスを提供するステップを含むことを特徴とする請求項１５に記載の方法。
【請求項２０】
前記第1のマスターと前記第2のマスターとのうちのどのマスターがスレーブデバイスにアクセスしているかを、前記スレーブデバイスに接続されているI/Oラインを介して、スレーブデバイスに対して示すステップを更に有していることを特徴とする請求項１５に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本出願は、2014年2月7日に出願されて"METHODS AND APPARATUS FOR A MULTIPLE MASTER BUS PROTOCOL"と題された同時係属米国仮特許出願第61/937,446号に対する優先権を主張し、これによって全ての目的のためにその全部が参照によりここで本願明細書に組み込まれる。
【０００２】
本発明はバスプロトコルに関し、より詳細にはマルチマスターバスプロトコルのための装置、システム、および方法に関する。
【背景技術】
【０００３】
インターインテグレーテッドサーキット規格（I2C、I2C、i2c、I-squared-C、I-two-C、またはIICと呼ばれる）は、フィリップス半導体部門、今日のNXPセミコンダクターズによって発明されたマルチマスターシリアルシングルエンドコンピュータバスを規定していて、通常、低速の周辺機器をマザーボード、組み込みシステム、携帯電話、または他のデジタル電子機器に接続するために用いられる。ここに含まれるI2Cの概略説明は、I2Cシステムについての基本的な情報を提供し、追加の詳細情報は、NXPセミコンダクターズによって発表されたhttp://www.nxp.com/documents/user_manual/UM10204.pdfで利用可能な「I2Cバス仕様およびユーザーマニュアル」（5訂版、2012年10月9日）の中で見つけることができ、これによって全ての目的のためにその全部が参照によりここで本願明細書に組み込まれる。
【発明の概要】
【発明が解決しようとする課題】
【０００４】
後で詳しく述べるように、I2Cは、バスマスターがI2Cバス上でアサートすることができる制御の量を制限するので、I2Cバスを用いてどの処理が確実に実行され得るかを制限する。I2Cは、それをいくつかの応用に対して不適当にし得る他の制限も有する。従って、I2Cプロトコルの範囲内で改良されたマルチマスターサポートを提供するためのシステム、装置、および方法が必要である。
【課題を解決するための手段】
【０００５】
いくつかの態様において、本発明の実施形態は、マルチマスターコンピュータバスを調停するための装置を提供する。この装置は、マルチマスターシリアルコンピュータバスと、バスに接続された第1のマスターと、バスに接続された第2のマスターと、バスに接続されたスレーブデバイスと、第1のマスターから第2のマスターおよびスレーブデバイスへ行っている第1のI/Oラインと、第2のマスターから第1のマスターおよびスレーブデバイスへ行っている第2のI/Oラインとを含む。バスの使用を調停するためのバスアービトレーションプロトコルは、いずれかのマスターがバスマスターになる度に、マスターを単一の処理に制限し、マスターは、I/Oラインを用いて各々他方に信号を送ってバスマスターにならないようにするように各々適合されている。
【０００６】
他の態様において、本発明の実施形態は、マルチマスターコンピュータバスを調停するためのシステムを提供する。このシステムは、マルチマスターシリアルコンピュータバスと、バスに接続された複数のマスターと、バスに接続された複数のスレーブデバイスと、複数のI/Oラインとを含み、I/Oラインは、複数のマスターの各々から伸びて、複数のマスターの他の全ておよびスレーブデバイスの各々へ行っている。バスの使用を調停するためのバスアービトレーションプロトコルは、いずれかのマスターがバスマスターになる度に、マスターを単一の処理に制限し、マスターは、I/Oラインを用いて他方に信号を送ってバスマスターにならないようにするように各々適合されている。
【０００７】
更に他の態様において、本発明の実施形態は、マルチマスターコンピュータバスを調停するための方法を提供する。この方法は、第1のマスター、第2のマスターおよびスレーブデバイスを接続するマルチマスターシリアルコンピュータバスを提供するステップと、第1のマスターから第2のマスターおよびスレーブデバイスへ伸びている第1のI/Oラインを提供するステップと、第2のマスターから第1のマスターおよびスレーブデバイスへ伸びている第2のI/Oラインを提供するステップと、いずれかのマスターがバスマスターになる時に、マスターの各々をスレーブデバイスとの単一の処理に制限するステップと、第1のマスターが、第2のマスターの介入なしでスレーブデバイスとの連続する、中断されない処理のシーケンスを実行することを意図している時に、第1のI/Oラインを用いて第2のマスターに信号を送ってバスマスターにならないようにするステップと、第2のマスターが、第1のマスターの介入なしでスレーブデバイスとの連続する、中断されない処理のシーケンスを実行することを意図している時に、第2のI/Oラインを用いて第1のマスターに信号を送ってバスマスターにならないようにするステップとを含む。
【０００８】
多数の他の態様が、これらおよび他の本発明の実施形態に従って提供される。本発明の実施形態の他の特徴および態様は、以下の詳細な説明、添付の請求項、および添付図面から、より十分に明らかになるであろう。
【図面の簡単な説明】
【０００９】
【図１】従来技術によって実現される例示的なI2Cシステムのブロック図を示す。
【図２】図1の例示的なI2Cシステムの動作を表すフローチャートを示す。
【図３】本発明のいくつかの実施形態による改良されたI2Cシステムの一例のブロック図を示す。
【図４】図3の例示的な改良されたI2Cシステムの動作を表すフローチャートを示す。
【図５】図3の例示的な改良されたI2Cシステムの動作を表すフローチャートを示す。
【図６】図3の例示的な改良されたI2Cシステムの動作を表すフローチャートを示す。
【発明を実施するための形態】
【００１０】
本発明の実施形態は、スレーブデバイスとの他のマスターによるいかなる介入処理もなしで、I2Cバス上でのスレーブデバイスとの複数の、中断されない処理を実行することを可能にする、改良されたI2Cマルチマスターバス排他(exclusion)方法および装置を提供する。標準I2C仕様は、スレーブデバイスとの単一の処理の前に複数のマスターのうちの1つがI2Cバスの制御を得るためのアービトレーション方法を提供するが、例えば、リードモディファイライト(read-modify-write)処理のような中断されない複数の処理のシーケンスを完了するために、マスターが排他的(exclusive)制御を維持することを可能にするいかなる手段も提供しない。本発明は、マスター（例えば、マイクロコントローラ）が、他のマスターによるスレーブに対するアクセスの競合なしで、複数の連続する処理のためにスレーブデバイス（例えば、メモリ）に対する排他的アクセスを保持することを可能にする。ここで用いた用語「単一の処理」は、スタート(START)マーカーとストップ(STOP)マーカーの間の単一の読み出し命令、単一の書き込み命令、または単一の複合フォーマット命令（これは、2つの読み出し、2つの書き込み、または1つの読み出し及び1つの書き込みに限られる）を意味することに注意されたい。
【００１１】
従来のI2Cは、抵抗によってプルアップされる、2本の双方向オープンドレインライン、シリアルデータライン（SDA）およびシリアルクロック（SCL）のみを使用する。他の電圧を有するシステムも可能であるが、使用される典型的な電圧は+5Vまたは+3.3Vである。
【００１２】
I2C基準設計は、7ビットまたは10ビット（使用するデバイスによる）のアドレス空間を有する。一般的なI2Cバス速度は、100kbit/s標準モードおよび10kbit/s低速モードであるが、任意の低クロック周波数も許容される。I2Cの最近の改訂は、より多くのノードのホストを務めることができ、かつより速い速度で動作することができる（例えば、400kbit/sファストモード、1Mbit/sファストモードプラス又はFm+、および3.4Mbit/s高速モード）。これらの速度は、PCより組み込みシステムに、より広く用いられる。利用可能な他の特徴、例えば16ビットアドレス指定もある。
【００１３】
ビットレートは、クロックストレッチング(clock stretching)または他のハードウェアオーバーヘッドなしで、マスターとスレーブの間の処理に対して提示されることに注意されたい。プロトコルオーバーヘッドは、バイト当たりのACK/NACKビットに加えて、スレーブデバイス内のスレーブアドレスおよびおそらくはレジスタアドレスを含む。このように、ユーザーデータの実際の転送レートは、ピークビットレートのみが意味するものより低い。例えば、スレーブとの各インタラクション(interaction)が、非効率的に、1バイトのデータのみが転送されることを許可する場合には、データレートはピークビットレートの半分より小さい。
【００１４】
ノードの最大数はアドレス空間によって制限され、更に400pFの全体のバスキャパシタンスによって制限される。それは実質的な通信距離を2、3メートルに制限する。
【００１５】
基準設計は、7ビットアドレス指定のクロック（SCL）およびデータ（SDA）ラインを有するバスである。バスは、ノードに対して2つの役割を有する：マスターおよびスレーブ。マスターノードは、クロックを生成して、スレーブとの通信を開始するノードである。スレーブノードは、マスターによってアドレス指定された時に、クロックを受信して応答するノードである。
【００１６】
バスはマルチマスターバスであり、これは任意の数のマスターノードが存在し得ることを意味する。加えて、マスターとスレーブの役割は、メッセージ間で（例えば、ストップが送信された後で）変わり得る。ほとんどのデバイスは単一の役割およびその2つのモードを用いるだけであるが、与えられたバスデバイスに対して4つの潜在的動作モードがある。モードは、マスター送信、マスター受信、スレーブ送信、およびスレーブ受信を含む。マスター送信モードにおいては、マスターノードはスレーブにデータを送信している。マスター受信モードにおいては、マスターノードはスレーブからデータを受信している。スレーブ送信モードにおいては、スレーブノードはマスターにデータを送信していて、スレーブ受信モードにおいては、スレーブノードはマスターからデータを受信している。
【００１７】
マスターは、最初は、スタートビットを送信することによってマスター送信モードの状態にあり、スタートビットの後には、通信することを望むスレーブの7ビットアドレスが続く。最後に、スレーブへの書き込み（0）を望むのか、またはスレーブからの読み出し（1）を望むのかを表す単一のビットが続く。
【００１８】
スレーブがバス上に存在する場合には、それはそのアドレスに対するACKビット（アクノリッジのためのアクティブロー）で応答する。そしてマスターは、（それが送信した読み出し／書き込みビットに従って）送信または受信モードにとどまり、スレーブは、その補完的なモード（それぞれ受信または送信）にとどまる。
【００１９】
アドレスおよびデータバイトは、最初に最上位ビットが送信される。スタートビットは、SCLがハイの時のSDAのハイからローへの移行によって示される。ストップビットは、SCLがハイの時のSDAのローからハイへの移行によって示される。SDAの他の全ての移行は、SCLがローの時に行われる。
【００２０】
マスターがスレーブに書き込みをしたい場合には、それはACKビットを送信するスレーブに1バイトを繰り返し送信する。（この状況では、マスターはマスター送信モードにあり、スレーブはスレーブ受信モードにある。）
【００２１】
マスターがスレーブから読み出しをしたい場合には、それはスレーブから1バイトを繰り返し受信し、マスターは最後のもの以外の全てのバイトの後にACKビットを送信する。（この状況では、マスターはマスター受信モードにあり、スレーブはスレーブ送信モードにある。）
【００２２】
そしてマスターは、ストップビットによって送信を終了するか、または、それがもう1つの転送（「複合メッセージ」）のためにバスの制御を保持することを望むのであれば、それはもう1つのスタートビットを送信することができる。
【００２３】
I2Cはメッセージの基本型を規定し、その各々はスタートマーカーによって開始し、ストップマーカーによって終了する。これらのメッセージ型は、マスターがデータをスレーブに書き込む単一のメッセージ、マスターがスレーブからデータを読み出す単一のメッセージ、およびマスターが多くても2つの読み出し及び/又は書き込みを1つ以上のスレーブに発行する複合メッセージを含む。
【００２４】
複合メッセージにおいて、各読み出し又は書き込みは、スタートマーカーおよびスレーブアドレスによって開始する。複合メッセージ内の最初のスタートマーカーの後、これらは反復スタートビットとも呼ばれる。反復スタートビットは、ストップビットの後にはなく、これは、スレーブが、次の転送が同じメッセージの一部であることを知る方法である。従来、複合メッセージは、スタートとストップのマーカー間の、2つの読み出し、2つの書き込み、または1つの読み出し及び1つの書き込み（いずれの順序でもよい）に限られる。このように、複合フォーマットを用いる単一の処理の間に、最高で2つの命令が、スタートとストップのマーカー間に送信され得る。
【００２５】
その製品ドキュメンテーションによって定義されるように、いかなる所与のスレーブも特定のメッセージに応答するだけである。I2Cシステムは、任意の(arbitrary)メッセージ構造をサポートする。ほんの少しの例外はあるが、I2C仕様は、メッセージのセマンティックス、例えばメッセージ内のデータバイトの意味を規定していない。さもなければ、メッセージのセマンティックスは、製品固有のものである。これらの例外は、I2Cの通常呼び出しアドレス（0x00）にアドレス指定されるメッセージを含む。
【００２６】
実際には、大部分のスレーブは、要求/応答制御モデルを採用していて、書き込み命令に続く1つ以上のバイトは、命令またはアドレスとして扱われる。これらのバイトは、次の書き込まれるバイトが扱われる方法および／またはスレーブが次の読み出しに応答する方法を決定する。大部分のI2C動作は、単一のバイト命令を含む。
【００２７】
物理層において、SCLおよびSDAラインはオープンドレイン設計であるので、プルアップ抵抗が必要である。ラインをフロートにすることは論理１である一方で、ラインをグラウンドへ引き下げることは論理０と考えられる。これがチャネルアクセス方法として用いられる。高速システム（及びいくつかの他のもの）は、さらに、少なくともSCLに電流源プルアップを追加する。これは、より高いバスキャパシタンスに適応して、より速い立ち上がり時間を可能にする。
【００２８】
これの重要な結果は、複数のノードが同時にラインを駆動していることができるということである。任意のノードがラインをローに駆動している場合、それはローであろう。論理１を送信（すなわち、ラインをフロートハイに）しようとしているノードは、これを見ることができ、これにより、もう1つのノードが同時にアクティブであることを知る。
【００２９】
SCL上で用いられる時、これはクロックストレッチングと呼ばれ、スレーブにフロー制御メカニズムを与える。SDA上で用いられる時、これはアービトレーションと呼ばれ、一度に1つの送信器のみが存在することを保証する。
【００３０】
アイドル(idle)の時、両方のラインはハイである。処理を開始するために、SCLがハイのままである間にSDAがローに引き下げられる。SDAを解放して再びフロートハイにすることはストップマーカーであり、バス処理の終了の信号を送ることである。合法ではあるが、これはスタートの直後では通常は無意味であるので、次のステップはSCLをローに引き下げることである。
【００３１】
スタートおよびストップ信号を除いて、SDAラインはクロックがローの間に変化するのみである。データビットを送信することは、データラインを所望のレベルで安定した状態に保つと共に、クロックラインにハイのパルスを送ること(pulsing)から成る。
【００３２】
SCLがローの間、送信器（最初はマスター）はSDAを所望の値にセットし、（値を伝搬させるための小さな遅延の後に）SCLをフロートハイにする。そしてマスターは、SCLが実際にハイになるのを待つ。これは、SCL信号の有限の立ち上り時間（プルアップ抵抗およびバスの寄生キャパシタンスのRC時定数）によって遅延され、スレーブのクロックストレッチングによって更に遅延され得る。
【００３３】
一旦SCLがハイになると、マスターは最小限の時間（例えば、標準速度のI2Cに対しては4μs）待ち、受信器がこのビットを見ることを確実にして、それを再びローに引き下げる。これで1ビットの送信を完了する。
【００３４】
一方向への毎8データビットの後に、「アクノリッジ(acknowledge)」ビットが他方向に送信される。送信器と受信器は、1ビットの間に役割を切り替え、かつての受信器は、単一の０のビット（ACK）を返送する。そうではなく送信器が１のビット（NACK）を見る場合には、それはスレーブがデータを受け入れることができないことを知る。その理由は、例えば、このようなスレーブが存在しない、命令が理解されなかった、または、マスターがスレーブに送信している時に、受信器がこれ以上のデータを受け入れることができない、などである。スレーブがマスターに送信していて、NACKが返されてスレーブによって受信される場合には、これは、マスターが現在のデータバイトの後にストップへの移転を望んでいることを示している。
【００３５】
アクノリッジビットの後に、マスターは、3つのことのうちの1つをすることができる：（1）他のデータのバイトを転送する準備をする：送信器はSDAをセットし、マスターはSCLにハイのパルスを送る；（2）「ストップ」を送信する：SDAをローにセットし、SCLをハイに変化させ、そしてSDAをハイに変化させ、これはI2Cバスを解放する；または（3）「反復スタート」を送信する：SDAをハイにセットし、SCLをハイに変化させ、そしてSDAを再びローに引き下げる。これは、バスを解放することなく、新しいI2Cバス処理を開始する。
【００３６】
I2Cプロトコルのより重要な特徴の1つは、クロックストレッチングである。アドレス指定されたスレーブデバイスは、1バイトを受信（または送信）した後に、クロックライン（SCL）をローに保持することができ、それは、まだ、更なるデータを処理する準備ができていないことを示している。スレーブと通信しているマスターは、現在のビットの送信を終えることができず、クロックラインが実際にハイになるまで待たなければならない。スレーブがクロックストレッチングをしている場合には、クロックラインは依然としてローである（接続がオープンドレインであるので）。第2の、より遅いマスターが同時にクロックを駆動しようとする場合も同様である。（複数のマスターが存在する場合には、それらのうちの一つ以外は通常アービトレーションを失う。）
【００３７】
マスターは、クロックラインがハイになっているのを認めるまで、かつクロックを再びローに引き下げる前の追加の最小限の時間（例えば、標準の100kbit/sのI2Cに対しては4μs）、待たなければならない。
【００３８】
マスターが所望の間SCLラインをローに保持することもできるが、用語「クロックストレッチング」は、通常、スレーブがそれをする時にだけ使われる。理論的には任意のクロックパルスを伸ばすことができるが、通常はアクノリッジ(acknowledgment)ビットの前か後の間隔が用いられる。例えば、スレーブがマイクロコントローラである場合には、そのI2Cインターフェースは、ソフトウェアが肯定的なアクノリッジを送信するか又はNACKを送信するかを決めるまで、各バイトの後のクロックを伸ばすことができる。
【００３９】
クロックストレッチングは、I2Cにおいて、スレーブがSCLを駆動する唯一の時間である。多くのスレーブは、クロックストレッチをする必要はなく、従って、それを駆動する回路はなく、SCLをもっぱら入力として処理する。いくつかのマスター、例えばカスタムASICの内部で見つかるものは、クロックストレッチングをサポートしないかもしれない。これらのデバイスは、しばしば「二線式インターフェース」と呼ばれ、I2Cではない。
【００４０】
全てのマスターは、スタートおよびストップビットのためにバスを監視していて、通常、他のマスターが単一の処理の間バスをビジーに保っている間はメッセージを開始しない。しかし、2つのマスターが、ほぼ同じ時間に送信を開始するかもしれない。この場合、アービトレーションが起こる。1つのマスターが複数のスレーブのアドレス指定を行う時には、スレーブ送信モードも調停され得るが、これは、いっそう一般的ではない。再試行を発行する前にランダム引き下がり遅延(random back-off delays)を用いるプロトコル（例えばイーサネット(登録商標)）とは対照的に、I2Cは、決定論的なアービトレーション方針を有している。各送信器は、データライン（SDA）のレベルをチェックして、それをそれが予想するレベルと比較する。それらが合わない場合、その送信器は、アービトレーションを失って、このプロトコルインタラクションから抜ける。
【００４１】
1つの送信器がSDAを1にセットし（信号を駆動しない）、第2の送信器がそれを0にセットする（グラウンドに引き下げる）場合、その結果は、ラインがローである。そして第1の送信器は、ラインのレベルが予想されるものとは異なることに気づき、他のノードが送信していると結論する。このような違いに気づいた第1のノードは、アービトレーションを失い、SDAの駆動を停止する。それがマスターである場合には、SCLの駆動も停止して、ストップを待つ。それから、それは、その全メッセージを再発行しようとするかもしれない。それまでは、他のノードは、予想されるものとSDA上の実際のレベルとの違いに気づかず、従って送信を続ける。それは、問題なく、そうすることができる。なぜなら、ここまでは信号は正確に予想される通りであったからである。他のいかなる送信器も、そのメッセージを妨害しなかった。
【００４２】
2つのマスターが2つの異なるスレーブにメッセージを送信している場合には、より低いスレーブアドレスを送信しているものが、常にアドレス段階のアービトレーションに「勝つ」。2つのマスターが同じスレーブアドレスにメッセージを送信することはでき、そしてアドレスは時々複数のスレーブを指すので、アービトレーションはデータ段階まで続かなければならない。
【００４３】
アービトレーションは、非常にまれにしか発生しないが、適切なマルチマスターサポートのために必要である。クロックストレッチングと同様に、全てのデバイスがアービトレーションをサポートしているというわけではない。それをするものは、通常、それ自身を「マルチマスター」通信をサポートするものと呼ぶ。
【００４４】
2つのマスターが並行して同一のメッセージを同時に送信するという極めてまれな場合においては、両方が、通信が成功したと考えるが、スレーブは1つのメッセージしか見ない。複数のマスターによってアクセスされ得るスレーブは、この理由のために冪等(idempotent)である命令を有していなければならない。I2Cは、それをいくつかの応用に対して不適当にし得る他の制限も有している。
【００４５】
図1は、標準I2Cバス102を含む従来技術の標準マルチマスターI2Cシステム100のブロック図を示している。標準I2Cバス102は、複数のマスター104、106（この例では2つのみが示されている）と1つ以上のスレーブデバイス108（この例では1つのみが示されている）との間の通信を可能にする。スレーブデバイス108は、固定された数のアドレスピン（例えば、この例では3つが示されている）を含む。
【００４６】
図2は、図1の標準マルチマスターI2Cシステム100で使用する標準I2Cバスアービトレーション処理200を示すフローチャートである。いずれのマスター104、106もスレーブデバイス108にアクセスしたい時には、マスター（例えば、マスターA 104またはマスターB 106）は、スタート命令（202）を発行して、該マスターが現在のバスマスター（204）であるかどうかを判定する。もしそうであれば、該マスターは、スレーブデバイス108のアドレスを用いて所望のスレーブデバイス108を選択する（206）。そうでない場合には、処理200は終了する（214）。マスターがスレーブデバイス108を選択する場合には、次に、スレーブが正しく選択されたことを判定するためにチェックが実行され(208)、エラーがない場合には、選択されたスレーブとの単一の処理（例えば、読み出し、書き込み、または複合）が実行される（210）。しかし、スレーブ選択エラーが発生した場合には、処理は実行されない。どちらの場合にも、ストップ命令が発行され（212）、処理200は終了する（214）。
【００４７】
並行してこの標準I2Cバスアービトレーション処理200を実行するマスター104、106の各々で、マスター104、106のうちの1つが、選択されたスレーブデバイスとの単一の処理の前に、I2Cバスの制御を得る。しかし、従来技術のこのアービトレーション処理200の重要な制限は、一度マスターがバスマスターになると、該マスターが、選択されたスレーブデバイス108との単一の処理を実行することのみができるということである。そうすると、該マスターが単一の処理を完了した時に、他のマスターがバスマスターになって、例えば、スレーブデバイスに書き込みを行うことができるかもしれない。問題は、スレーブデバイス108が例えばメモリデバイスであって、中断されないリードモディファイライト処理のシーケンスが、例えばデータの整合性を保証するために必要である場合に、標準I2Cバスアービトレーション処理200が、第2のマスターがI2Cバス102の制御を得て、最初のマスターがリードモディファイライト処理のシーケンスの全ての部分を完了する前に、最初のマスターを遮って、メモリを変更することがないことを保証することができないことである。このように、システム100は、中断が不可能な複数の処理シーケンスを提供しないので、標準I2Cバスアービトレーション処理200は、データの不整合の問題という結果になり得る。
【００４８】
よりよくこの問題を示すために、以下の2つの例のスレーブアクセスシーケンスを考える。第1の例のシーケンスにおいては、マスターA 104が、最初にスレーブから0x01に等しいデータを読み出し、それからマスターA 104が、0x02に等しいデータをスレーブに書き込み、最後にマスターB 106が、スレーブから0x02に等しいデータを読み出す。この第1のシーケンスは、所望の結果になる。両方のマスター104、106は、スレーブが、整合性のあるデータを提供することを発見する。
【００４９】
しかし、第2の例のシーケンスにおいては、マスターA 104が、最初にスレーブから0x01に等しいデータを読み出し、それからマスターB 106が、スレーブから0x01に等しいデータを読み出し、最後にマスターA 104が、0x02に等しいデータをスレーブに書き込む。第2の例のシーケンスは、問題がある結果になる。2つのマスター104、106は、スレーブが、2つの異なる値、従って整合性のないデータを有することを経験する。
【００５０】
本発明の実施形態は、他の全てのI2Cマスターが、いかなる介入するI2C処理も実行することを防止すると共に、I2Cバスマスターが、複数の、連続するI2C処理を実行することを可能にする能力をシステム100に加えることによって、標準I2Cバスアービトレーション処理200を改良することによって、この潜在的データ不整合の問題に対処する。各マスターに対する1本の追加の汎用入出力（I/O）ピンおよびいくつかのソフトウェアロジックを加えることによって、本発明は、マスターが、他の介入するマスターによって中断されることなく、複数の処理（例えば、リードモディファイライト処理シーケンス）を実行する能力を提供する。
【００５１】
図3は、改良されたマルチマスターI2Cシステム300の例示的な実施形態を示していて、これは、スレーブに対するアクセスの相互排他性(exclusion)の機能を提供する。従来技術の標準システム100と同様に、本発明の実施形態の改良されたマルチマスターI2Cシステム300は、複数のマスター304、306（説明を簡単にするため、この例では2つのみが示されている）と、1つ以上のスレーブデバイス308（説明を簡単にするため、この例では1つのみが示されている）との間の通信を可能にするI2Cバス302を含む。更なるマスターおよびスレーブがシステム300に含まれ得るが、図3に示した単純な例は、より明確に本発明の特徴を示すために用いられることは理解されよう。標準I2Cシステム100の要素に加えて、本発明の実施形態の改良されたマルチマスターI2Cシステム300は、さらに、他のマスターの各々に各々接続されたシステム300内の各マスター304、306から来るI/OラインADDR1およびADDR2と、スレーブデバイス308の動的アドレスピン（例えば、アドレス1、アドレス2）とを含む。この構成は、各マスター304、306に、アクセスの前にスレーブデバイス308を独自にアドレス指定する能力を提供する。更なるマスターを有するシステムにおいては、更なるマスター毎の更なるI/Oラインが加えられる。
【００５２】
各マスター304、306がスレーブデバイス308にアクセスするために独自のアドレスを有するこの能力は、以下の規則のセットを課すことによって実現され得る。マスター304、306のいずれもスレーブデバイス308にアクセスしていない時、I/OラインADDR1、ADDR2は、通常、アイドル状態のハードウェアを介して論理1に保たれる。ADDR1は、マスターA 304上で実行するソフトウェア命令によって論理0に駆動され得るのみである。（I2Cバス302上の）アドレス1は、マスターA 304上で実行するソフトウェア命令によって用いられ得るのみである。ADDR2は、マスターB 306上で実行するソフトウェア命令によって論理0に駆動され得るのみである。（I2Cバス302上の）アドレス2は、マスターB 306上で実行するソフトウェア命令によって用いられ得るのみである。以下の表は、この規則のセットをまとめている。
【００５３】
【表１】
0006629215.tif 000002
【００５４】
マスター304、306が両方ともそれらのI/OラインADDR1、ADDR2を論理0のローに駆動しているまれなケースにおいては、スレーブアドレスはアドレス0であり、アドレス0に応答するのみであるので、どちらのマスター304、306もスレーブデバイス308にアクセスすることはできないことに注意されたい。なぜなら、それらは、I2Cバス302上で、合っていないアドレス（アドレス1またはアドレス2）を使用しているからである。この機能は、従来のI2Cマルチマスターサポートなしのマスターが本発明の実施形態によって用いられることも可能にする。アイドル状態の間はI/Oラインを論理1のハイに保って、マスターがスレーブにアクセスしていることを示すためにI/Oラインを論理0のローへ引き下げる代わりに、システム300は、論理0が、I/Oラインのアイドル状態値であり、論理1が、マスターがスレーブにアクセスしていることを示すために用いられるように実施され得ることにも注意されたい。
【００５５】
以下の疑似コードの例は、各マスター304、306がスレーブデバイス308にアクセスするために従うプロトコルを示している。マスターA 304がスレーブデバイス308にアクセスしたい時、マスターA 304は以下のようにふるまう：
ADDR2 = 1である場合、以下へ：  /*マスターBはスレーブと通信していない)*/
１．  ADDR1 = 0に駆動する  /*マスターAは排他的アクセスを望んでいる*/
２．  スタート状態を発行する
３．  マスターAがI2Cバスマスターになる場合、以下へ：
●I2C上でアドレス1を用いてスレーブを選択する
●I2C上でスレーブにアクセスする
●ストップ状態を発行する
●さらなる処理のためにステップ２へ行く)
４．  ADDR1 = 1に駆動する  /*マスターAが終了*/
【００５６】
マスターB 306がスレーブデバイス308にアクセスしたい時、マスターB 306は以下のようにふるまう：
ADDR1 = 1である場合、以下へ：  /*マスターAはスレーブと通信していない)*/
１．  ADDR2 = 0に駆動する  /*マスターBが排他的アクセスを望んでいる*/
２．  スタート状態を発行する
３．  マスターBがI2Cバスマスターになる場合、以下へ：
●I2C上でアドレス2を用いてスレーブを選択する
●I2C上でスレーブにアクセスする
●ストップ状態を発行する
●さらなる処理のためにステップ２へ行く)
４．  ADDR2 = 1に駆動する  /*マスターBが終了*/
【００５７】
上記の疑似コードセグメントの中で実施される本発明のこれらの例示的な方法が、図4〜6のフローチャートの中で更に示される。再試行の回数および遅延の長さは、システム300の特定のハードウェア実施態様の詳細に基づいて決定されることに注意されたい。いくつかの実施形態において、遅延は、不必要な余分の再試行/タイムアウトおよび潜在的競争状態を避けるために調和的(harmonic)間隔ではない長さに設定され得る。
【００５８】
図4は、マスターA 304が本発明の実施形態の改良されたI2Cシステム300のスレーブデバイス308にアクセスするために使用する例示的な方法400を示すフローチャートである。マスターA 304は、まず、ADDR2が論理1であるかどうかをチェックすることによって、他のマスター、マスターB 306がスレーブデバイス308に現在アクセスしているかどうかを判定する(402)。システムが他のマスターを含む場合、マスターA 304は他のマスターのI/Oラインもチェックする。ADDR2が論理1である場合、すなわちマスターB 306がスレーブデバイス308にアクセスしていないことを意味する場合、マスターA 304はADDR1を論理0に引き下げる(404)。これは、マスターAがスレーブデバイス308にアクセスしていることをマスターB 306に知らせる。マスターAは、それから、図6および以下に示すような標準I2Cプロトコルの改良されたバージョンを用いて、アドレス1を介してスレーブデバイス308にアクセスする(406)。マスターA 304は、それからエラーをチェックして(408)、なされるべき更なるスレーブアクセスがあるかどうかをチェックする(410)。スレーブデバイス308とのこれ以上の処理がない場合には、マスターA 304はADDR1を論理1に戻して(412)、この方法は終了する(414)。
【００５９】
スレーブデバイス308へのアクセス後にエラーがある場合、マスターA 304は、スレーブデバイス308へのアクセスをやめ、ADDR1を論理1に戻して(412)、この方法は終了する(414)。最初のアクセス(406)およびエラーチェック(408)の後に、実行されるべき更なるスレーブアクセスがある場合には、マスターA 304は、標準I2Cプロトコルを用いて、アドレス1を介してスレーブデバイス308に再度アクセスし(406)、フローはそこから続く。
【００６０】
マスターA 304がADDR2をチェックした(402)時に（ADDR2が論理0であることによって示されるように）マスターB 306がスレーブデバイス308にアクセスしている場合には、マスターA 304は、遅延期間の間、引き下がり(back off)(416)、それから最大再試行制限を超えたかどうかをチェックする(418)。最大再試行制限を超えていない場合、マスターA 304は再度ADDR2をチェックして(402)、フローはそこから続く。最大再試行制限を超えた場合、この方法は終了する(414)。
【００６１】
同様に、図5は、マスターB 306が本発明の実施形態の改良されたI2Cシステム300のスレーブデバイス308にアクセスするために使用する例示的な方法500を示すフローチャートである。マスターB 306は、まず、I/OラインADDR1が論理1であるかどうかをチェックする(502)ことによって、他のマスター、マスターA 304がスレーブデバイス308に現在アクセスしているかどうかを判定する。システムが他のマスターを含む場合、マスターB 306は他のマスターのI/Oラインもチェックする。I/OラインADDR1が論理1である場合、すなわちマスターA 304がスレーブデバイス308にアクセスしていないことを意味する場合、マスターB 306はADDR2を論理0に引き下げる(504)。これは、マスターB 306がスレーブデバイス308にアクセスしていることをマスターA 304に知らせる。マスターB 306は、それから、図6および以下に示すような標準I2Cプロトコルの改良されたバージョンを用いて、アドレス2を介してスレーブデバイス308にアクセスする(506)。マスターB 306は、それからエラーをチェックして(508)、なされるべき更なるスレーブアクセスがあるかどうかをチェックする(510)。スレーブデバイス308とのこれ以上の処理がない場合には、マスターB 306はADDR2を論理1に戻して(512)、この方法は終了する(514)。
【００６２】
スレーブデバイス308へのアクセス後にエラーがある場合、マスターB 306は、スレーブデバイス308にアクセスするのをやめ、ADDR2を論理1に戻して(512)、この方法は終了する(514)。最初のアクセス(506)およびエラーチェック(508)の後に、実行されるべき更なるスレーブアクセスがある場合には、マスターB 306は、標準I2Cプロトコルを用いて、アドレス2を介してスレーブデバイス308に再度アクセスし(506)、フローはそこから続く。
【００６３】
マスターB 306がADDR1をチェックした(502)時に（ADDR1が論理0であることによって示されるように）マスターA 304がスレーブデバイス308にアクセスしている場合には、マスターB 306は、遅延期間の間、引き下がり(back off)(516)、それから最大再試行制限を超えたかどうかをチェックする(518)。最大再試行制限を超えていない場合、マスターB 306は再度ADDR1をチェックして(502)、フローはそこから続く。最大再試行制限を超えた場合、この方法は終了する(514)。
【００６４】
図6は、図4および5それぞれの上述した方法400および500の(406)および(506)で呼び出される改良された標準I2Cバスアービトレーションプロトコルを示すフローチャートである。図6の方法600は、図2の従来技術の方法200と似ているが、引き下がり(back off)遅延ならびに再試行カウンタおよび制限を有していることに注意されたい。いずれのマスター304、306もスレーブデバイス308にアクセスする準備ができている時、マスター（例えば、マスターA 304またはマスターB 306）はスタート命令を発行して(602)、マスターが現在のバスマスターであるかどうかを判定する(604)。そうである場合は、バスマスターは、スレーブデバイス308に対する呼び出し方法400、500の中で示されたアドレスを用いて、所望のスレーブデバイス308を選択する(606)。マスターが現在のバスマスターになってスレーブデバイス308を選択する場合、次に、スレーブデバイス308が正しく選択されたことを判定するためにチェックが実行され(608)、エラーがない場合は、選択されたスレーブとの単一の処理（例えば、読み出し、書き込み、または複合）が実行される(610)。しかし、スレーブ選択エラーが発生した場合は、処理は実行されない。どちらの場合も、ストップ命令が発行され(612)、処理600は終了する(614)。
【００６５】
マスターが(604)で現在のバスマスターにならない場合、マスターは、遅延期間の間、引き下がり(back off)(616)、それから最大バスマスター再試行制限を超えたかどうかをチェックする(618)。最大バスマスター再試行制限を超えていない場合、マスターは新たなスタート命令を発行し(602)、マスターがバスマスターになったかどうかを見るために再度チェックを行い(604)、フローはそこから続く。最大バスマスター再試行制限を超えた場合、この方法は終了する(614)。
【００６６】
前述の説明は、本発明の例示的な実施形態を開示しているだけである。本発明の範囲内に入る上記で開示された装置、システムおよび方法の変形は、当業者に直ちに明らかである。従って、本発明が例示的な実施形態と関連して開示されたが、請求項によって定義されるような、他の実施形態も本発明の範囲内に入り得ることは理解されるべきである。
【符号の説明】
【００６７】
300  改良されたマルチマスターI2Cシステム
302  I2Cバス
304  マスターA
306  マスターB
308  スレーブデバイス
ADDR1、ADDR2  I/Oライン
【図１】
0006629215.tif 000003
【図２】
0006629215.tif 000004
【図３】
0006629215.tif 000005
【図４】
0006629215.tif 000006
【図５】
0006629215.tif 000007
【図６】
0006629215.tif 000008