임베디드 용어 사전
시리얼 통신

버스 잠김

I²C에서 슬레이브가 SDA를 계속 붙잡고 놓지 않아 통신이 멈춘 상태. 리셋으로도 안 풀리는 경우가 많다.

bus lockup. 실무에서 가장 골치 아픈 I²C 문제다.

어떻게 생기나

슬레이브가 바이트를 내보내는 중에 마스터가 리셋된다
      ↓
슬레이브는 아직 자기 차례라고 생각해 SDA 를 LOW 로 잡고 있다
      ↓
마스터가 다시 시작하려 해도 SDA 가 이미 LOW → START 조건을 만들 수 없다

MCU 를 리셋해도 안 풀린다. 슬레이브는 리셋되지 않았기 때문이다.

복구 절차

1. SCL 을 GPIO 로 바꾼다
2. 클럭 펄스를 9번 이상 수동으로 만든다   ← 슬레이브가 남은 비트를 다 내보내게 한다
3. SDA 가 HIGH 로 올라오는지 확인
4. STOP 조건을 만들어 버스를 정리한다
5. 다시 I²C 주변장치로 되돌린다

이 루틴을 부팅 시 항상 한 번 돌리는 것이 실무 관행이다. 개발 중 디버거로 멈췄다 재시작하는 일이 잦아 이 상황이 자주 만들어진다.

예방

슬레이브에 리셋 핀을 배선해 두면 확실하다. 회로 설계 단계에서 챙길 항목이다.

함께 보면 좋은 용어

노트에서 맥락과 함께 보기 — I²C — 선 두 개로 여럿을 다룬다