I2C의 **중재(Arbitration)**는 여러 개의 마스터가 동시에 대화를 시작하려고 할 때, **”교통정리”**를 하는 아주 똑똑한 규칙입니다.
앞서 배운 **오픈 드레인(Open-Drain)**과 **와이어드 AND(Wired-AND)**의 특징을 생각하면 아주 쉽게 이해할 수 있습니다. 핵심은 **”0(Low)을 보낸 사람이 1(High)을 보낸 사람을 이긴다”**는 것입니다.
1. 중재의 핵심 원리: “말하면서 듣기”
I2C 마스터들은 데이터를 보낼 때 그냥 던지기만 하는 게 아니라, **내가 보낸 데이터가 선(SDA)에 똑같이 나타나고 있는지 실시간으로 확인(모니터링)**합니다.
- Logic 1을 보낼 때: 마스터는 스위치를 엽니다. (풀업 저항에 의해 선이 High가 되길 기대함)
- Logic 0을 보낼 때: 마스터는 스위치를 닫아 선을 바닥(GND)으로 강제로 끌어내립니다.
2. 중재 과정 (Step-by-Step)
상황: 마스터 A와 마스터 B가 정확히 동시에 통신을 시작했다고 가정해봅시다.
- 비트 단위 비교: 두 마스터는 각자의 데이터를 한 비트씩 보냅니다.
- 공통 구간: 처음 몇 비트가 둘 다 ‘0’이거나 둘 다 ‘1’이라면, 두 마스터는 서로 다른 누군가가 같이 말하고 있다는 사실을 전혀 모른 채 계속 전송합니다.
- 충돌 발생 (결정적 순간):
- 마스터 A: 이번 비트에서 **’1′(High)**을 보내려고 스위치를 열었습니다.
- 마스터 B: 이번 비트에서 **’0′(Low)**을 보내려고 선을 꽉 붙잡아 내렸습니다.
- 결과: SDA 선은 마스터 B 때문에 **’0′(Low)**이 됩니다. (Wired-AND 특성)
- 패배자 발견: ‘1’을 보냈던 마스터 A는 선을 확인해보니 ‘0’이 되어 있는 것을 발견합니다. “어? 난 1을 보냈는데 선은 0이네? 나보다 우선순위가 높은 누군가가 있구나!”라고 판단합니다.
- 즉시 항복: 마스터 A는 그 즉시 전송을 중단하고 손을 뗍니다. 이를 **’중재 패배’**라고 합니다.
- 승자 계속: 마스터 B는 자기가 보낸 ‘0’이 선에도 그대로 ‘0’으로 나타나므로, 방해받지 않았다고 생각하고 계속 데이터를 보냅니다. 이를 **’중재 승리’**라고 합니다.
3. 왜 I2C 중재가 훌륭한가요?
- 데이터가 깨지지 않음: 승리한 마스터(마스터 B)는 상대방이 중간에 포기했다는 사실조차 모를 정도로 신호에 아무런 간섭을 받지 않고 통신을 이어갑니다.
- 하드웨어 자동 처리: 개발자가 코드로 “누가 먼저 보낼지” 정해줄 필요가 없습니다. 칩 내부의 로직이 알아서 처리합니다.
- 자연스러운 우선순위: 주소 값이 낮은 장치(앞부분에 ‘0’이 더 많은 장치)가 자연스럽게 우선순위를 갖게 됩니다.
요약하자면
I2C 중재는 **”누가 더 먼저 선을 Low(0)로 당기느냐”**를 겨루는 게임입니다.
‘1’을 보내며 버스 상태를 관찰하던 마스터가, ‘0’을 보내며 선을 장악한 마스터에게 조용히 자리를 양보하는 질서 정연한 방식입니다.
이해가 좀 더 되셨나요? 중재가 끝난 뒤 패배한 마스터가 어떻게 행동하는지 등 추가로 궁금한 점이 있으시면 말씀해 주세요!