본문 바로가기

Hardware

I2C 통신 라인에 Pull-up저항을 붙이는 이유

결론부터 말하면 I2C 통신라인에 Pull-up저항을 붙이는 이유는 I2C 통신은 GPIO 출력모드 중 Open-drain 출력모드로 구성되어 있기 때문이다.

GPIO의 출력모드는 대표적으로 Push-pullOpen-drain이 있으며 자세한 내용은 아래와 같다.

 

1. Push-pull

1) 동작원리

위 그림처럼 Push-pull은 두 개의 트랜지스터로 이루어져있다. GPIOHIGH로 설정하면 G1(Gate1)에 전류가 흐르면서 3.3VOUTPUT으로 나오고, GPIOLOW로 설정하면 G2(Gate2)에 전류가 흐르면서 OUTPUTGND에 연결되어 0V가 나온다.

 

2) 특징

Push-pull 구성은 두 개의 트랜지스터로 구성되기 때문에 신호를 HIGH, LOW에서 모두 능동적으로 구동한다. 따라서 HIGH, LOW가 명확한 더 큰 구동강도를 갖는 구동신호들에 더 적합하다. 예를 들어 케이블을 통해 디지털 신호를 전송하는 경우 케이블의 저항으로 인해 신호가 감쇄될 수 있다. 이때 Push-pull 구성을 사용하면 더 강한 전압 레벨을 제공하기 때문에 신호가 안정적으로 수신된다.

 

3) 다수의 장치 연결 시 Push-pull 구성이 신호 충돌이 일어나는 이유

Master에 두 개의 장치가 Push-pull 구성으로 연결된다면 위 그림과 같다. 이제부터 두 장치들의 설정 값에 따른 경우를 살펴보자.

 

① Device1, 2 모두 HIGH로 설정한 경우

두 장치 모두 3.3V의 출력을 내보내기 때문에 신호 충돌이 일어나며 과전류가 흐른다.

 

② Device1은 LOW, Device2는 HIGH로 설정한 경우

Device2에서 Device1으로 과전류가 흘러서 Device1 장치가 망가질 수 있다.

 

결론적으로 Push-pull 구성은 여러 장치가 동시에 라인을 사용하는 경우 두 전압 레벨을 모두 능동적으로 구동하기 때문에 신호 충돌이 일어난다.

 

2. Open-drain

1) 동작원리

위 그림처럼 Open-drain은 한 개의 트랜지스터로 이루어져있다. GPIOHIGH로 설정하면 G(Gate)에 전류가 흐르면서 OUTPUTGND에 연결되어 0V가 나오고, GPIOLOW로 설정하면 G(Gate)에 전류가 흐르지 않아서 OUTPUTFloating 상태가 된다.

 

2) 특징

Open-drain 구성은 출력을 능동적으로 높게 구동할 수 없기 때문에 HIGH, LOW의 명확한 구분이 힘들다. 따라서 아래와 같이 외부에 Pull-up저항을 연결하여 사용한다.

Pull-up저항을 달면 GPIOHIGH로 설정하면 OUTPUT0V, LOW로 설정하면 5V가 나오게 되므로 HIGH, LOW의 구분이 가능해진다.

 

3) 다수의 장치 연결 시 Open-drain 구성이 신호 충돌이 일어나지 않는 이유

Master에 두 개의 장치가 Open-drain 구성으로 연결된다면 위 그림과 같다. 이제부터 두 장치들의 설정 값에 따른 경우를 살펴보자.

 

① Device1, 2 모두 HIGH로 설정한 경우

둘 다 GND에 연결되어 공통된 라인은 LOW 상태를 유지하지만 어떤 Device든 하나의 DeviceHIGH로 설정되면 공통된 라인은 항상 LOW가 된다.

 

② Device1은 HIGH, Device2는 LOW로 설정한 경우

둘 중 하나의 DeviceHIGH로 설정되었으므로 공통된 라인이 LOW이며 번 설명과 동일하다.

 

③ Device1, 2 모두 LOW로 설정한 경우

두 장치 모두 트랜지스터에 의해 연결이 끊어진 상태이므로 Pull-up저항 때문에 공통된 라인이 HIGH가 된다.

 

결론적으로 Open-drain 구성은 연결된 장치의 GPIOLOW로 설정하면 Pull-up저항 때문에 HIGH가 되며 트랜지스터에 의해 연결이 끊어진 상태가 된다. 이러한 특징으로 Open-drain 구성은 여러 개의 장치들이 연결되어도 신호 충돌이 일어나지 않는다.