科学・計算関連

I2Cプルアップ抵抗とは?必要な理由と抵抗値の考え方を解説(計算)

I2Cプルアップ抵抗の役割
当サイトでは記事内に広告を含みます
技術ブログ特化メルマガはこちら

I2Cは、マイコン、センサー、EEPROM、液晶モジュールなどを少ない配線で接続できる、代表的なシリアル通信方式です。

一方で、I2C回路を組んだのに通信が始まらない、波形がなまる、複数のモジュールをつなぐと動作が不安定になる、といった悩みも起こりやすいでしょう。

その中心となる部品が、SDAとSCLの信号線に接続するI2Cプルアップ抵抗です。

本記事では、プルアップ抵抗が必要な理由、抵抗値を決める計算方法、配線時の注意点までを、I2Cの基本動作とあわせて解説します。

I2Cプルアップ抵抗の役割

I2Cプルアップ抵抗の役割

それではまず、I2Cプルアップ抵抗の役割について解説していきます。

オープンドレイン出力による通信方式

I2CのSDAはデータ線、SCLはクロック線であり、基本的には2本の信号線を使って通信します。

これらの端子は、多くのICでオープンドレイン出力またはオープンコレクタ出力として構成されています。

オープンドレインとは、信号線をLowへ引き下げる機能はあるものの、IC自身がHigh電圧を積極的に出力しない方式です。

端子内部のトランジスタがオンになると、信号線はGND側へ接続されてLowになります。

トランジスタがオフになると端子は開放状態になり、外部からHighへ引き上げなければ電圧が定まりません。

そこで、電源電圧VDDとSDAまたはSCLの間にプルアップ抵抗を接続します。

抵抗を通じて信号線をHighへ戻し、各デバイスがLowだけを能動的に出力する構成がI2Cの基本です。

I2CのSDAとSCLは、通常のプッシュプル出力のようにHighとLowの両方をICが直接出力する端子ではありません。

プルアップ抵抗があることで、端子を開放したときに信号線がHighとして認識されます。

複数デバイス接続を可能にする仕組み

I2Cでは、複数のマイコンやセンサーが同じSDAとSCLを共有できます。

このバス構成が成立する理由は、各デバイスがHighを強く出力せず、必要なときだけLowへ落とすためです。

たとえば、あるデバイスがHighを出力し、別のデバイスがLowを出力した場合を考えてみましょう。

プッシュプル出力同士なら、電源とGNDが直接競合するような大電流が流れ、IC破損につながるおそれがあります。

しかしI2Cでは、High側は抵抗を通した弱い電流供給です。

どれか1つのデバイスがLowへ引き下げれば、バス全体はLowになります。

この動作はワイヤードANDと呼ばれ、アドレス応答やACK応答、クロックストレッチにも利用されています。

通信が成立するHighとLowの電圧状態

抵抗によってSDAとSCLが電源側へ接続されるため、どのデバイスもLowを出力していないとき、信号線はHighになります。

反対に、いずれかのデバイスが端子をLowへ引き下げると、信号線の電圧はLowになります。

つまりI2Cでは、Highは抵抗による受動的な状態、Lowはデバイスによる能動的な状態です。

この違いを理解すると、プルアップ抵抗なしでは信号が浮いてしまう理由も見えてきます。

浮いた信号線はノイズの影響を受けやすく、HighなのかLowなのかを受信側が正しく判定できません。

プルアップ抵抗は単なる補助部品ではなく、I2C信号の論理状態を成立させる必須要素と考えるとよいでしょう。

プルアップ抵抗が必要となる理由

続いては、プルアップ抵抗が必要となる理由を確認していきます。

信号線の浮遊防止

電子回路において、どこにも明確につながっていない入力端子や信号線は、フローティング状態になります。

フローティングした配線は周囲のノイズ、人体の静電気、近くの配線からの誘導などで電圧が変動します。

I2CのSDAとSCLにプルアップ抵抗がない場合、デバイスがLowを出力していない時間の電圧が不安定です。

その結果、クロックの立ち上がりが認識されない、スタートコンディションを誤検出する、データビットが化けるなどの現象が起こります。

特にブレッドボード、長いジャンパ線、ノイズ源となるモーター付近では、信号線の浮遊による影響が目立ちやすくなります。

安定したHighレベルを作るために、SDAとSCLのそれぞれへプルアップ抵抗を設ける必要があります。

立ち上がり時間と通信速度の関係

I2Cの信号線はLowからHighへ変化するとき、抵抗を通じて配線や入力端子の容量を充電します。

このため、Highへの変化は急峻ではなく、緩やかな曲線になります。

抵抗値が大きいほど充電電流が小さくなり、立ち上がり時間は長くなります。

抵抗値が小さいほど立ち上がりは速くなりますが、Low出力時にICが吸い込む電流は増加します。

I2Cの抵抗値は、通信速度と消費電流のバランスで決めることが重要です。

Standard-modeでは100kHz、Fast-modeでは400kHzが代表的な通信速度です。

高速になるほど、各ビットの時間内に信号が十分なHigh電圧へ到達しなければなりません。

通信モード 代表的な通信速度 立ち上がり時間の目安 抵抗値の傾向
Standard-mode 100kHz 1,000ns以下 比較的大きめでも対応しやすい
Fast-mode 400kHz 300ns以下 小さめの抵抗値が必要になりやすい
Fast-mode Plus 1MHz 120ns以下 配線容量と許容電流の確認が重要

Lowレベル電流とIC保護

プルアップ抵抗を極端に小さくすると、信号線をLowにしたデバイスへ大きな電流が流れます。

たとえば3.3V電源で1kΩの抵抗を使用した場合、Low時には理想値で約3.3mAが流れます。

SDAとSCLの両方がLowなら、1つのデバイスが両方の電流を受け持つ場面もあります。

各ICには、端子がLowレベルを維持したまま吸い込める電流の上限があります。

データシートのVOL条件、IOL、I2C端子仕様を確認せずに抵抗を小さくしすぎると、規格外の動作や発熱につながる可能性があります。

抵抗値を小さくすることだけが高速化ではありません。

配線を短くする、不要なモジュールを外す、信号容量を減らすといった対策も有効でしょう。

Lowレベル時の電流は、おおよそ次の式で見積もれます。

I=VDD÷R

3.3V、4.7kΩの場合は、3.3÷4,700で約0.70mAです。

抵抗値の計算と選定基準

続いては、抵抗値の計算と選定基準を確認していきます。

最小抵抗値の考え方

最小抵抗値は、Lowレベル時にデバイスが流せる電流と、許容されるLow電圧から考えます。

I2CバスがLowのとき、プルアップ抵抗にはVDDからVOLまでの電圧がかかります。

デバイスが吸い込める最大電流をIOL、Low電圧の上限をVOLとすると、概算の最小抵抗値は次のようになります。

Rmin=(VDD-VOL)÷IOL

VDDはプルアップ先の電源電圧、VOLはLowレベル出力電圧、IOLは端子が吸い込める電流です。

たとえばVDDが3.3V、VOLが0.4V、IOLが3mAなら、Rminは約967Ωです。

実際には部品ばらつきやマイコンの仕様も考慮し、計算値ぎりぎりではなく余裕を持たせます。

この条件なら、1.0kΩよりも1.5kΩや2.2kΩを候補として検討する方法があります。

ただし、同一バスに複数のプルアップ抵抗が搭載される場合は、合成抵抗を必ず確認してください。

最大抵抗値の考え方

最大抵抗値は、信号の立ち上がり時間を基準にして決めます。

I2C配線には、IC入力容量、ケーブル容量、基板配線容量、コネクタ容量などが加わります。

これらを合計したバス容量をCbとすると、抵抗値が大きいほどRC時定数が増え、波形の立ち上がりが遅くなります。

一般的な見積もりでは、立ち上がり時間trと抵抗値R、バス容量Cbの関係を利用します。

Rmax=tr÷(0.8473×Cb)

trは許容立ち上がり時間、Cbはバス容量です。

Cbを100pF、trを300nsとした場合、Rmaxは約3.5kΩになります。

この例では、最小抵抗値より大きく、かつ最大抵抗値より小さい範囲から部品を選びます。

具体的には2.2kΩや3.3kΩが候補になりますが、最終的には実測波形とデバイス仕様で判断することが大切です。

抵抗値は単独の数値だけで決めず、電源電圧、バス容量、通信速度、IOLをまとめて確認してください。

よく使われる抵抗値の目安

工作や一般的な評価回路では、4.7kΩがI2Cプルアップ抵抗の定番値としてよく使われます。

3.3V系または5V系の短い配線で、100kHz程度の通信を行うなら、4.7kΩで問題なく動作するケースは多いでしょう。

400kHzで通信する場合や、複数のデバイスを接続する場合は、2.2kΩから3.3kΩ付近が必要になることもあります。

一方、低速通信で消費電流を抑えたい場合や、バス容量が小さい場合には、10kΩを使えることもあります。

使用条件 抵抗値の目安 確認したい項目
短い配線と100kHz通信 4.7kΩから10kΩ モジュール内蔵抵抗の有無
400kHz通信 2.2kΩから4.7kΩ 立ち上がり時間とバス容量
長い配線または多数接続 1kΩから3.3kΩ付近 Lowレベル電流と実測波形
低消費電力を優先 4.7kΩから10kΩ以上 通信速度の余裕

4.7kΩは便利な出発点ですが、すべてのI2C回路に最適な値ではありません。

特に400kHz以上、長配線、多数のデバイスという条件では、計算とオシロスコープ測定が重要です。

電源電圧とレベル変換の注意点

続いては、電源電圧とレベル変換の注意点を確認していきます。

プルアップ先電圧の重要性

プルアップ抵抗は、SDAとSCLをどの電圧へ引き上げるかを決める部品でもあります。

3.3V動作のマイコンに接続するI2Cバスで、誤って5Vへプルアップすると、端子の絶対最大定格を超えるおそれがあります。

モジュール側が5V電源対応であっても、SDAとSCLのロジックレベルまで5V対応とは限りません。

使用するすべてのデバイスについて、I2C端子の入力High許容電圧を確認しましょう。

I2Cのプルアップ先は、最も低い耐圧のデバイスに合わせるという考え方が基本です。

3.3V対応のデバイスだけで構成するなら、通常はSDAとSCLを3.3Vへプルアップします。

3.3V系と5V系の混在

3.3Vマイコンと5Vセンサーを同じI2Cバスへ接続したい場面もあります。

この場合、両方のデバイスが3.3VのHighレベルを正しく認識できるなら、バス全体を3.3Vへプルアップできる場合があります。

ただし5Vデバイスのデータシートで、入力High電圧VIHの条件を確認する必要があります。

5V側が3.3VをHighとして認識できない場合、または電源が異なる側へ電圧を流したくない場合は、双方向レベルシフタを使用します。

MOSFETを使ったI2C用レベル変換回路は、オープンドレイン方式と相性がよい構成です。

片側を3.3V、もう片側を5Vへそれぞれプルアップし、Low信号だけを双方向に伝達します。

電源オフ時の逆流対策

I2Cでは、一部のデバイスだけ電源が切れた状態で、別のデバイスからSDAやSCLがHighになることがあります。

この状態では、未給電のICの保護ダイオードを通じて電流が流れ、意図しない半導通や誤動作が起こる可能性があります。

バッテリー機器や電源ドメインが複数ある製品では、電源オフ時のI2Cバス状態も重要です。

電源オフアイソレーション機能付きのレベルシフタ、バスバッファ、I2Cスイッチを使う方法があります。

また、各デバイスのデータシートにある電源シーケンス、注入電流、I/O電圧条件を確認すると安心です。

通信時だけでなく、電源投入前後の状態まで想定することが、堅牢な回路設計につながります。

配線とモジュール接続の実践ポイント

続いては、配線とモジュール接続の実践ポイントを確認していきます。

内蔵プルアップ抵抗の重複

I2Cセンサーモジュールや開発ボードには、すでにSDAとSCLのプルアップ抵抗が実装されていることが少なくありません。

複数のモジュールを並列接続すると、それぞれの抵抗も並列になります。

たとえば4.7kΩのプルアップ抵抗が2枚のモジュールに搭載されていれば、合成抵抗は約2.35kΩです。

4枚なら約1.18kΩとなり、Low時の電流が想定より大きくなります。

モジュールを追加するたびに、プルアップ抵抗も追加されている可能性を意識しましょう。

多くのモジュールでは、ジャンパ、はんだブリッジ、抵抗取り外しによってプルアップを無効化できます。

バス全体では必要な抵抗を1組だけ残す、あるいは合成値を狙った範囲に収める設計が理想です。

プルアップ抵抗は各デバイスに必ず1組ずつ必要なわけではありません。

同じI2Cバス全体に対して、SDA用とSCL用を適切な合成抵抗値で用意すれば機能します。

配線長とバス容量の影響

I2Cは基板内や短距離のモジュール接続に向いた通信方式です。

配線が長くなるほど寄生容量やノイズの影響が増え、立ち上がり時間の悪化につながります。

ジャンパ線を長く引き回すと、4.7kΩで動いていた回路が不安定になることもあります。

その場合は抵抗値を下げる前に、配線の長さ、GNDの接続、電源デカップリングを見直してください。

GNDが細い、または遠回りしていると、Lowレベルの基準電位が揺れやすくなります。

通信線の近くにモーター線やスイッチング電源の配線がある場合、ノイズの回り込みにも注意が必要でしょう。

長距離通信が必要なら、I2Cバスエクステンダ、差動伝送IC、CANやRS-485などの方式を検討する選択肢もあります。

オシロスコープによる波形確認

抵抗値の最終判断には、オシロスコープでSDAとSCLの波形を観測する方法が確実です。

Highへ上がる部分が緩やかすぎる場合、次のクロックまでに十分な電圧へ到達していない可能性があります。

反対に立ち上がりが速くても、抵抗を小さくしすぎてLow電圧が上がっている場合は注意が必要です。

観測時は、通信中にSDAとSCLの両方を確認します。

SCLだけ正常でも、SDA側の容量や接触不良によってACKが読めないことがあります。

プローブのGNDリードが長いと測定波形にノイズが乗るため、短いGNDスプリングを使えるとより正確です。

波形確認では、立ち上がり時間、High電圧、Low電圧、ノイズ、リンギングを総合的に見ます。

通信不良時の確認項目

続いては、通信不良時の確認項目を確認していきます。

SDAとSCLの電圧確認

通信が始まらないときは、まず電源投入状態でSDAとSCLの電圧をテスターで測定します。

どちらも通信待機時にプルアップ先の電圧付近になっていれば、少なくともHigh状態は作られています。

常に0V付近なら、どこかのデバイスがバスをLowへ保持している、配線がGNDへ短絡している、端子設定が誤っている可能性があります。

常に中途半端な電圧なら、プルアップ抵抗がない、抵抗値が大きすぎる、電源電圧が不安定、異なる電圧系が競合していることを疑います。

マイコンのGPIO設定も重要です。

I2C専用機能を有効にしているか、内蔵プルアップだけに頼っていないか、ピン割り当てが正しいかを確認してください。

アドレスとACK応答の確認

プルアップ抵抗が正しくても、I2Cアドレスが違えば通信は成立しません。

データシートには7ビットアドレスが記載されることが多く、ライブラリによってはRead Writeビットを含めない形式で指定します。

アドレススキャン機能を使うと、バス上でACKを返すデバイスを探せます。

ただし、スキャンで見つからない原因はアドレス違いだけではありません。

プルアップ先電圧、SDAとSCLの配線入れ替わり、GND未接続、電源電圧不足、通信速度設定も確認対象です。

複数の同一センサーを接続する場合は、アドレス選択端子やI2Cマルチプレクサが必要になることもあります。

抵抗値変更時の切り分け

抵抗値を変更して動作が変わる場合は、バス容量や電流条件が境界付近にある可能性があります。

最初に4.7kΩで動作確認し、通信速度を下げても改善しないかを試します。

速度を下げて安定するなら、立ち上がり時間不足が疑われます。

その後、3.3kΩ、2.2kΩのように段階的に値を下げ、波形とLowレベル電圧を確認します。

逆に低い抵抗値でしか動かない場合は、配線が長すぎないか、内蔵プルアップが想定どおりか、バス容量が大きくないかを見直すべきでしょう。

部品を増やす前に原因を切り分けることで、再現性のある回路に近づけます。

通信不良の解決では、抵抗値だけを疑わず、配線、電源、アドレス、波形を順番に確認することが近道です。

I2Cプルアップ抵抗のまとめ

I2Cプルアップ抵抗とは、SDAとSCLをHighレベルへ戻し、オープンドレイン方式の通信を成立させるための重要な抵抗です。

各デバイスは信号線をLowへ引き下げることで通信し、抵抗が信号線をHighへ引き上げることで、複数デバイスによる共有バスが実現します。

抵抗値は大きすぎると立ち上がりが遅くなり、小さすぎるとLow時の電流が増えます。

そのため、VDD、VOL、IOL、バス容量、通信速度から最小値と最大値を見積もることが大切です。

一般的な回路では4.7kΩが出発点になりますが、400kHz通信、長い配線、多数のモジュールでは2.2kΩから3.3kΩ付近を検討する場面もあります。

モジュールの内蔵プルアップ抵抗が並列になっていないか、3.3Vと5Vの電圧レベルが混在していないかも確認しましょう。

最終的にはオシロスコープで波形を見て、十分な立ち上がり時間と適切なLowレベルを確認することが確実です。

I2Cプルアップ抵抗は、抵抗値の暗記ではなく、回路全体の条件から選ぶことで、安定した通信につながります。