bus lockup. 실무에서 가장 골치 아픈 I²C 문제다.
어떻게 생기나
슬레이브가 바이트를 내보내는 중에 마스터가 리셋된다
↓
슬레이브는 아직 자기 차례라고 생각해 SDA 를 LOW 로 잡고 있다
↓
마스터가 다시 시작하려 해도 SDA 가 이미 LOW → START 조건을 만들 수 없다
MCU 를 리셋해도 안 풀린다. 슬레이브는 리셋되지 않았기 때문이다.
복구 절차
1. SCL 을 GPIO 로 바꾼다
2. 클럭 펄스를 9번 이상 수동으로 만든다 ← 슬레이브가 남은 비트를 다 내보내게 한다
3. SDA 가 HIGH 로 올라오는지 확인
4. STOP 조건을 만들어 버스를 정리한다
5. 다시 I²C 주변장치로 되돌린다
이 루틴을 부팅 시 항상 한 번 돌리는 것이 실무 관행이다. 개발 중 디버거로 멈췄다 재시작하는 일이 잦아 이 상황이 자주 만들어진다.
예방
슬레이브에 리셋 핀을 배선해 두면 확실하다. 회로 설계 단계에서 챙길 항목이다.