오픈드레인과 푸시풀 차이 정리: GPIO 출력 방식 이해하기

카드뉴스

GPIO 출력 모드는 HIGH와 LOW만의 문제가 아닙니다

MCU GPIO를 배울 때는 핀을 HIGH로 올리고 LOW로 내리는 것부터 시작합니다. 하지만 실제 출력 모드는 단순한 논리값 설정이 아니라 핀 내부 회로가 신호를 어떻게 밀고 당기는지를 정하는 설정입니다. Push-Pull과 Open-Drain의 차이를 모르면 LED는 켜지는데 통신 라인이 이상하거나, 여러 장치를 연결했을 때 신호 충돌이 생기는 이유를 설명하기 어렵습니다.

Push-Pull 출력은 HIGH와 LOW를 모두 능동적으로 만듭니다. 내부의 상단 스위치가 켜지면 전원 쪽으로 밀어 올리고, 하단 스위치가 켜지면 GND 쪽으로 당깁니다. 일반적인 디지털 출력, 칩 선택 신호, 간단한 제어 신호에서 많이 쓰는 방식입니다. 출력이 빠르고 회로가 단순하지만, 두 장치가 같은 라인을 서로 다른 값으로 강하게 구동하면 충돌 전류가 흐를 수 있습니다.

그래서 SPI의 CS, 일반 LED 제어, enable 핀처럼 한 MCU가 명확히 신호를 소유하는 경우에는 Push-Pull이 자연스럽습니다. 다만 외부 장치가 같은 라인을 끌어내릴 가능성이 있거나, 전원 도메인이 다른 회로와 직접 연결된다면 보호 저항, 레벨 시프터, 입력 모드 전환 같은 조건을 같이 봐야 합니다. 출력 모드 하나가 회로 안전성과도 연결됩니다.

Open-Drain은 LOW만 직접 만들고 HIGH는 풀업에 맡깁니다

Open-Drain 출력은 핀이 LOW를 만들 때만 내부 트랜지스터로 GND에 당깁니다. HIGH 상태는 핀이 직접 밀어 올리는 것이 아니라 풀업 저항을 통해 만들어집니다. 그래서 출력이 꺼져 있을 때 라인은 high impedance에 가까운 상태가 되고, 외부 또는 내부 pull-up이 라인 전압을 올립니다.

이 구조는 여러 장치가 한 라인을 공유할 때 유리합니다. 어느 한 장치라도 LOW로 당기면 라인은 LOW가 되고, 아무도 당기지 않을 때만 HIGH가 됩니다. I2C의 SDA, SCL 라인이 대표적인 예입니다. 여러 슬레이브와 마스터가 같은 선을 공유해야 하므로, Push-Pull로 서로 반대 값을 내보내는 구조보다 Open-Drain이 안전합니다.

Open-Drain은 알람 출력이나 fault 신호에도 자주 쓰입니다. 여러 IC의 오류 출력을 한 라인에 묶고, 어느 하나라도 LOW를 만들면 MCU가 fault를 감지하는 식입니다. 이때 풀업 전압을 MCU 입력 전압에 맞추면 서로 다른 전원 레벨 사이를 비교적 단순하게 연결할 수 있습니다. 물론 각 부품의 절대정격, 누설 전류, 입력 임계값은 데이터시트로 확인해야 합니다.

풀업 저항과 신호 속도를 같이 봐야 합니다

Open-Drain에서는 풀업 저항 값이 파형에 직접 영향을 줍니다. 저항이 너무 크면 라인이 HIGH로 올라가는 시간이 길어져 rise time이 느려질 수 있고, 통신 속도가 빨라질수록 문제가 됩니다. 반대로 너무 작으면 LOW로 당길 때 전류가 커져 불필요한 소모와 발열이 생길 수 있습니다. I2C 오류를 디버깅할 때 오실로스코프로 상승 시간을 보는 이유가 여기에 있습니다.

Push-Pull은 비교적 빠른 에지와 강한 구동이 장점이지만, 라인 공유에는 조심해야 합니다. Open-Drain은 공유와 wired-AND 구조에 적합하지만, 풀업과 배선 커패시턴스 때문에 속도와 전류를 계산해야 합니다. GPIO 설정을 고를 때는 “출력이냐 입력이냐”만 보지 말고, 누가 라인을 구동하는지, 여러 장치가 함께 쓰는지, 필요한 속도와 전압 레벨이 무엇인지까지 확인하는 편이 안전합니다.

디버깅할 때는 레지스터 설정과 실제 파형을 같이 봐야 합니다. 코드에서 Open-Drain으로 설정했다고 생각했는데 CubeMX 설정이 다르거나, 내부 pull-up만 켜져 상승 시간이 느린 경우도 있습니다. 멀티미터로 HIGH 전압만 확인하면 놓치는 문제가 있으므로, 통신 라인은 가능하면 오실로스코프로 상승 시간과 LOW 레벨까지 확인하는 습관이 좋습니다.

댓글 남기기