(パワーマネージメントユニット)
10.11 I 2 C の動作モードの詳細
10.11.6 いくつかの特殊なケース
I2Cハードウェアには、シリアル転送中に起こりうる以下のような特殊ケースに対処する 機能があります。
•
同時に2つのマスタからのRepeated START状態•
アービトレーションロスト後のデータ転送•
I2Cバスへの強制アクセス•
SCLまたはSDA上のLOWレベルによって妨害されるI2Cバス•
バスエラー10.11.6.1 同時に2つのマスタからのRepeated START状態
Repeated START 状態は、マスタトランスミッタモードやマスタレシーバモードで生成さ
れることがあります。別のマスタが同時にRepeated START状態を生成した場合に、特殊 な状況が起こります(Figure 30を参照)。このような状況が発生するまでは、どちらのマ スタも同じデータを送信していたので、いずれかのマスタによってアービトレーションが 失われることはありません。
Table 160. Miscellaneous States Status
Code (I2CSTAT)
Status of the I2C-bus and hardware
Application software response Next action taken by I2C hardware To/From I2DAT To I2CON
STA STO SI AA 0xF8 関連する状態情報が
ない。SI = 0。
No I2DAT action No I2CON action 待機するか、現在の転送を続行する。
0x00 不正なSTART状態また
は STOP 状態による、
MSTまたは選択したス レーブモード中のバ スエラー。状態 0x00 は、干渉によって I2C ブロックが未定義の 状態になったときに も発生することがあ ります。
No I2DAT action 0 1 0 X MSTまたはアドレス指定されたSLVモー
ドのときは、内部ハードウェアのみが影 響を受けます。すべてのケースで、バスは 解放され、I2Cブロックはアドレス指定さ れていないSLVモードに切り替わります。
STOはリセットされます。
FT D RAF FT DR
AFT DRA
FT D FT D
RA FT D
RA FT D
RA FT DR
A I2Cハードウェアは、自身がRepeated START状態を生成する前にI2Cバス上でRepeated
START状態を検出すると、バスを解放するため、割り込み要求は生成されません。もう1
つのマスタがSTOP状態を生成することによってバスを解放した場合、I2Cブロックは通
常のSTART状態(状態0x08)を送信し、全シリアルデータ転送の再試行を開始すること
ができます。
10.11.6.2 アービトレーションロスト後のデータ転送
アービトレーションは、マスタトランスミッタモードおよびマスタレシーバモードで失わ れることがあります(Figure 24 を参照)。アービトレーションの喪失は、I2STAT の状態 0x38、0x68、0x78、0xB0によって示されます(Figure 26およびFigure 27を参照)。
I2CONの STAフラグがこれらの状態をサービスするルーチンによって設定されている場
合、バスが再び解放されると、CPUによる介入なしでSTART状態(状態0x08)が送信さ れ、全シリアル転送の再試行を開始することができます。
10.11.6.3 I2Cバスへの強制アクセス
アプリケーションによっては、無制御のソースがバスのハングアップの原因になることが あります。そのような状況では、干渉、バスの一時的割り込み、または SDA-SCL 間の一 時的短絡によって障害が発生する可能性があります。
無制御のソースが不要なSTART状態を生成したり、STOP状態をマスクすると、I2Cはい つまでもビジーのままとなります。 STAフラグが設定され、バスアクセスが妥当な時間内 に取得されない場合、I2C バスへの強制アクセスが可能です。これは、STA フラグが設定 されている間にSTOフラグを設定することによって実現されます。 STOP状態は送信され ません。 I2CハードウェアはSTOP状態を受信したかのように動作し、START状態を送信す ることができます。 STO フラグはハードウェアによってクリアされます(Figure 31 を参 照)。
Fig 30. Simultaneous Repeated START conditions from two masters
SLA A
W SLA S
18H 08H
A DATA
28H 08H
OTHER MASTER CONTINUES
other Master sends repeated START earlier
S
retry
S P
FT D RAF FT DR
AFT DRA
FT D FT D
RA FT D
RA FT D
RA FT DR
A
10.11.6.4 SCLまたはSDA上のLOWレベルによって妨害されるI2Cバス
I2Cバスのハングアップは、バス上のデバイスのどれかによってSDAまたはSCLラインが LOWに保持された場合に起こります。バス上のデバイスによってSCLラインが妨害(LOW にプル)された場合、それ以降のシリアル転送は不可能になり、障害の解決は SCL バス ラインをLOWにプルしているデバイスによって行うしかありません。
一般にSDAラインは、クロックを失うかノイズパルスをクロックとして感知することに よって、現在のバスマスタとの同期を失ったバス上の別のデバイスによって妨害される可 能性があります。その場合は、SCLライン上でクロックパルスを追加送信することによっ て障害を解決できます(Figure 32 を参照)。 I2C インターフェースには、妨害されたバス を検出する専用のタイムアウトタイマはありませんが、システム内の別のタイマを使用し てこれを実装できます。検出されると、ソフトウェアは原因となっているデバイスがSDA を解放するまで、SCL上でクロックを強制することができます(9つまで要求することが 可能)。この時点でもまだスレーブが同期していないことがあるので、START を生成して すべてのI2Cペリフェラルを確実に同期させる必要があります。
Fig 31. Forced access to a busy I2C-bus
SDA line
SCL line STA flag
STO flag
time limit
start condition
(1) Unsuccessful attempt to send a START condition.
(2) SDA line is released.
(3) Successful attempt to send a START condition. State 08H is entered.
Fig 32. Recovering from a bus obstruction caused by a LOW level on SDA
SDA line
SCL line
(1)
(2) (1)
(3) STA flag
start condition
FT D RAF FT DR
AFT DRA
FT D FT D
RA FT D
RA FT D
RA FT DR
A 10.11.6.5 バスエラー
バスエラーは、START状態またはSTOP状態がフォーマットフレーム内の不正な位置で検 出されたときに起こります。不正な位置の例としては、アドレスバイト、データビット、
ACKビットのシリアル転送中が挙げられます。
I2Cハードウェアは、マスタまたはアドレス指定されたスレーブのいずれかとしてシリア ル転送に関わっているときに限り、バスエラーに対処します。バスエラーが検出される と、I2Cブロックはアドレス指定されていないスレーブモードにただちに切り替わり、SDA ラインとSCLラインを解放し、割り込みフラグを設定して、0x00のステータスレジスタ をロードします。このステータスコードを使用すれば、アボートされたシリアル転送を再 試行するか、Table 160に示すように単純にエラー状態から回復するかのいずれかを行う 状態サービスルーチンにベクタ化できます。