I2C/SPI/UART“本当に多い”落とし穴30

投稿者: | 2025年10月11日

目次


共通編(8)

1) GND共有忘れ

症状:距離がある機器間でたまに化ける/起動直後だけ失敗。
原因:基準電位が一致せず、入力閾値が実質シフト。リターンパスが長くノイズを誘導。
診断:オシロで双方GND間の差電位(Vdiff)を測定。数百 mV 以上なら要対策。長距離はツイストペアでSignal-GNDを近接。
対策

  • 単一点(スター)でGND接続。シールド・メッシュは片側接地を基本としループ回避。
  • 長距離/産業用途は差動(RS-485/422等)を検討。

設計チェック:GNDリターンは信号の真下/隣接。インピーダンスの連続性を確保。


2) レベル互換性の思い込み(5V↔3.3V)

症状:低温/高温やロットでときどき読めない。
原因:VIH/VILの閾値を満たさない。CMOS/TTL閾値の違いも落とし穴。
診断:データシートのVIH(min)/VIL(max)、入力保護ダイオード、許容電圧を確認。
対策

  • 一方向:分圧、抵抗+シュミット入力、レベルシフタ。
  • 双方向/I2C:FET式の双方向レベルシフタ。
  • 5Vトレラント有無を確認(“5V tolerant”はHighレベルは読めても上げてはダメなケースに注意)。

設計チェック:Worst条件(温度/電圧/ばらつき)でのVIH/VILマージン≥0.3Vを目標。


3) 電源立上り順序/リセット未配慮

症状:初回アクセスだけ固まる/再電源で直る。
原因:周辺ICのPORが完了前にアクセス、内部状態が未定。
診断:電源・RESET・CS/SCLの時系列をオシロで重ね撮り。
対策

  • 電源シーケンサ/監視ICを使用。Power-Good→RESET解除→初回トランザクションの順。
  • 最初のアクセスに起動待ちディレイを必ず入れる(例:10–100 ms)。

設計チェック:最小リセット幅、立上り時間、初回アクセス遅延を仕様化。


4) クロック/ボーレート誤差の見落とし

症状:高速化で突然不安定。
原因:水晶精度、内部RC、分周近似誤差の合算が許容を超過。
診断:誤差バジェット = 発振器誤差(ppm) + 温度ドリフト + 分周近似誤差
対策

  • 余裕を持ったクロック/ボーレートを選定。UARTは合成誤差±2%以内を目標。
  • 可能なら外部水晶/TCXO分数N/オーバーサンプリングを利用。

設計チェック:ボーレート表を自動生成し、誤差が最小の設定をFWで選択。


5) 配線長・容量・反射の軽視

症状:エッジが鈍る、オーバーシュート/リンギングで誤動作。
原因:配線容量C・インダクタンスL・不連続点(コネクタ/分岐)。
診断:立上り/立下り時間、オーバ/アンダーシュート、反射波の遅延を測定。
対策

  • トポロジは点対点短く近接。信号の隣にGND(ツイスト/差動)。
  • シリーズ抵抗(例:22–100Ω)でエッジ緩和。高速は終端も検討。

設計チェック:配線容量見積(基板/ケーブル/コネクタ)→許容tr内に収まるか。


6) ノイズ・ESDの戻り道を作らない

症状:モータやSMPS動作時に稀にビット化け。ESDでラッチアップ。
原因:共通インピーダンス結合、ESD電流のリターンパス不備。
診断:ノイズ源オン/オフで発生相関を確認。ESDガン/静電でも評価。
対策

  • グランドプレーン連続性、デカップリング(0.1µF+1µF)を近接配置。
  • 信号にシリーズ抵抗/フェライトビーズ、ラインにTVS。電力線と信号線を離す。

設計チェック:ESD/イミュニティ試験条件と同等の冗長度を設計に反映。


7) ピン多重機能(AF)設定ミス

症状:通信開始しても実際はGPIOのまま/内部プルが干渉。
原因:初期化順序やデフォルト状態の見落とし。
診断:初期化コードの順序とレジスタダンプ確認。
対策(順序のひな形)

  1. 周辺クロック有効化
  2. ピンを該当AFへ切替(内蔵プル状態を明示)
  3. 周辺の設定 → 有効化
  4. 初回ダミーアクセス/クリア

設計チェック:評価ボード/量産基板でプル抵抗の二重を禁止。


8) 外付け抵抗・ジャンパの二重

症状:波形が歪む/消費電流過大。
原因:評価ボードのプルアップ+ターゲット側プルアップの並列
診断:実装表と回路図を突合し、実効値を計算。
対策:DNP(未実装)方針、抵抗ネットワークの実効Rを管理。

設計チェック:I2Cプル/CSプル/リセットプルの総合RをBOMで一元管理。


I2C編(10)

9) プルアップ抵抗値が不適切

症状:立上りが遅い/誤読、逆に電流過大で発熱。
原因:Rが大きすぎるとRCでtr超過、Rが小さすぎるとLow電流過大。
設計式

  • 立上りからの目安:
    R ≈ tr / (0.8473 · Cbus)(30–70%のRC近似)
    例:Cbus=200 pF、tr目標=300 ns ⇒ R≈1.77 kΩ
  • Lowレベルからの下限:
    R ≥ (VPU − VOL(max)) / IOL(max)
  • I2C推奨立上り時間の例:Standard=1000ns, Fast=300ns, Fast-mode Plus=120ns

診断:ロジアナでtr測定、CbusはLCRまたは推定(配線/コネクタ/IC入力容量の合算)。
対策:Rを再設計、必要ならセグメント分割バッファで容量削減。


10) プルアップ電圧不一致

症状:3.3Vデバイスを5Vプルアップへ接続して不具合/破損。
原因:入力保護ダイオードが導通し、ラッチアップ/逆流。
診断:スレーブVCC-OFFでSDA/SCLに高電圧が出ていないか計測。
対策:バス電圧を最も低い耐圧側に合わせる/双方向レベルシフタを入れる。

設計チェック:電源OFF時のバックパワー禁止(シリーズ抵抗/シフタで遮断)。


11) 7bit/8bitアドレス混同

症状:アドレス正しいはずがNACK。
原因0x50(7bit)0xA0(8bit, R/W含む)と混同。
診断:実送信バイトをロジアナで確認。
対策

  • ドライバAPIが7bitを取るか8bitを取るかを明記。
  • ログに「送信アドレス(7bit/8bit表記両方)」を出力。

例(7bit→送信値)addr7=0x50 ⇒ Write: 0xA0, Read: 0xA1


12) アドレス競合

症状:同型デバイス複数でNACK/データ化け。
原因:ADDRピン設定が同一。
診断:基板オプション/抵抗の実装状態を確認。
対策

  • アドレス割当表をBOMと一緒に管理。
  • 変更不能ならI2Cスイッチ/MUXで物理的に切り替え。

設計チェック:量産バリアントごとにアドレス衝突ゼロを保証。


13) クロックストレッチ未対応

症状:一部スレーブでハング/タイムアウト。
原因:スレーブがSCLをLow保持して処理時間を稼ぐ仕様。
診断:ロジアナでSCLが不自然にLow延長していないか確認。
対策

  • マスタ側でストレッチ許可&タイムアウトを実装。
  • 遅いスレーブはアクセス間隔に余裕を持たせる。

14) リピーテッドスタート要求の見落とし

症状:レジスタ読出しで値が化ける。
原因:データシートがRepeated STARTを前提としているのにSTOPを入れてしまう。
診断:トランザクション図を仕様と突合。
対策

  • START → Addr(W) → Reg → ReSTART → Addr(R) → Data... → STOP」を忠実に。
  • APIで“連結”送受信関数を用意。

15) NACK処理を無視

症状:見失い後に復帰せず固まる。
原因:無限リトライ/例外未処理。
診断:NACK発生回数とアドレスをログ。
対策

  • 最大リトライ回数バックオフ
  • 失敗時にバスリカバリデバイス再初期化、障害フラグを立て上位に通知。

16) オープンドレインで強制ドライブ

症状:バス衝突/過電流。
原因:プッシュプルでHighを駆動。
診断:GPIO設定を確認、外付けプルと競合していないか。
対策:SDA/SCLはオープンドレイン、Highは外部プルアップに任せる。


17) バスリカバリ未実装

症状:SDAがLow固着で全デバイスが通信不能。
原因:途中でデバイスがSDAを掴んだまま停止。
対策:SCLを手動で9パルス出し、STOPを生成して開放。

擬似コード:

void i2c_bus_recover(void){
  configure_SCL_SDA_as_GPIO_OD();
  for(int i=0;i<9;i++){ SCL=1; delay_us(5); SCL=0; delay_us(5); }
  // STOP
  SDA=0; delay_us(5); SCL=1; delay_us(5); SDA=1; delay_us(5);
  restore_I2C_peripheral();
}

18) マルチマスタ仲裁を無視

症状:まれにデータ破壊。
原因:同バス上の複数マスタが同時開始。
診断:仲裁ロスフラグ/ロジアナで確認。
対策

  • 仲裁ロス時は再試行
  • 可能なら単一マスタ構成へ簡素化。

SPI編(7)

19) CPOL/CPHA取り違え

症状:全ビットが1/2周期ずれる。
原因:サンプル/シフトの位相が一致していない。
モード表

モード CPOL CPHA アイドルSCLK サンプルエッジ
0 0 0 Low 立上り
1 0 1 Low 立下り
2 1 0 High 立下り
3 1 1 High 立上り

診断:既知パターン(0xA5等)を送ってロジアナで位相確認。
対策:データシートのタイミング図と一致させる。


20) チップセレクト(CS)の扱いが雑

症状:時々コマンド/レジスタ化け。
原因:CSのセットアップ/ホールド不足、CSが転送途中で浮く。
診断:CS前後のtCSS/tCSHを実測。
対策

  • CSアサート→待ち→転送→待ち→ディアサート
  • 高速時はハード制御CSDMAを使用。

21) ビット順(MSB/LSB)不一致

症状:値が常に2の乗数ズレ。
原因:送受のビットエンディアン不一致。
診断:パターン送受で比較。
対策:周辺設定を一致、無理ならソフトでビットスワップ。


22) ワード/フレーム長の齟齬

症状:16bit想定デバイスに8bit×2で送ってしまいCSが途中で上がる。
原因:MCUがバイト境界でCSを解放。
対策

  • SPIのフレーム長を合わせる。
  • DMA連続転送でCS保持、あるいは手動CS

23) 3線/4線・デイジーチェーン混同

症状:受信値が隣のデバイスのデータ。
原因:MISO/MOSI共有やデイジーチェーンのビット長理解不足。
対策

  • トポロジを図に固定化。
  • 各デバイスのシフト長と順序を表で管理。

24) SCLKスキューとリンギング

症状:特定長でのみ誤動作。
原因:配線スキュー/反射。
対策

  • 点対点、枝を作らない。SCLKとGNDをペア配線。
  • ドライバ直後にシリーズ抵抗(例:22–47Ω)。
  • 必要に応じ終端クロックバッファ

25) 連続転送でのCSギャップ

症状:複数レジスタ連続アクセスで途中が無効化。
原因:DMA/FIFOの切れ目でCSが一瞬High。
対策

  • コントローラの**“CSキープ”**機能を使う。
  • 1回の大きなバーストにまとめる。

UART編(5)

26) ボーレート誤差の積み上げ

症状:高ボーレートでごく稀に文字化け。
原因:双方の誤差が合算してスタート/サンプリング点が外れる。
診断

  • 誤差[%] = 分周近似誤差 + 発振器誤差 + 温度/電圧ドリフト。
  • 目安:合成誤差±2%以内(保守的には±1.5%)。 対策
  • 分数N・オーバーサンプリング(×8/×16)、外部水晶/TCXO。
  • 問題が続く場合はボーレートを落とすフロー制御導入。

27) フレーミング条件の不一致

症状:受信可能だが定期的にフレーミングエラー。
原因8N17E1などの不一致。
診断:相手機器の設定/ログを確認、自装置は受信レジスタのエラーフラグを監視。
対策:設定を揃える。未知相手にはautobaud(文字’0x55’等)を活用。


28) フロー制御を無視

症状:連続転送で受信FIFO溢れ。
原因:受信側の処理遅延。
対策

  • RTS/CTS(ハード)またはXON/XOFF(ソフト)を有効化。
  • 送信側は空きに応じてスロットリング。リングバッファを十分に。

29) ブレーク/ノイズで受信崩壊

症状:サージ後に文字化けが続く。
原因:長Low(BREAK)やノイズでステートマシンが乱れる。
対策

  • エラーカウンタで閾値超え時に受信フラッシュ&再同期。
  • アイドル検出でフレーミング復帰。ラインにTVS/フィルタ

30) レベル規格(RS-232/TTL)取り違え

症状:直結で損傷/通信不能。
原因:RS-232は±電圧、TTLは0–VCC。
対策

  • RS-232には必ずラインドライバ/レシーバ(例:±電圧生成IC)。
  • コネクタ形状に惑わされず規格と電圧を確認。

デバッグ手順(おまけ)

  1. まず波形:ロジアナのI2C/SPI/UARTデコーダを常時ON。
  2. 再現条件の記録:時刻・温度・電源・負荷・エラーカウンタ。
  3. 分離統治:1デバイスずつ有効化し、通信確認→次へ。
  4. 物理→論理:配線/電源/ESD→タイミング→プロトコル→アプリの順で切り分け。

最終チェックリスト

  • [ ] GND共有・電圧レベル・レベルシフタの有無
  • [ ] 電源/RESETシーケンス・初回ディレイ
  • [ ] AF/プル設定・外付け抵抗の競合なし
  • [ ] I2C:プルアップR計算、アドレス表、ReSTART/Stretch対応、バスリカバリ
  • [ ] SPI:CPOL/CPHA/ビット順、CSタイミング、フレーム長、スキュー対策
  • [ ] UART:ボーレート誤差見積、8N1等の一致、フロー制御、RS-232/TTL確認
  • [ ] ログ&ロジアナで“見える化”済み

付録:計算メモ

  • RC立上りの30–70%換算:tr(30–70%) ≈ 0.8473·R·C
  • I2Cプルアップ設計:R ≈ tr/(0.8473·Cbus)R ≥ (VPU − VOL(max))/IOL(max) の両立
  • UART合成誤差の目安:|誤差TX| + |誤差RX| + |近似| ≤ 2%(保守)

本資料は一般的な設計指針です。最終判断は対象デバイスのデータシート/規格書に従ってください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です