PCA9555는 I2C 인터페이스를 지원하는 16채널 I/O Expander이다.
이전에 올린 TCA9538(PCA953x 계열)칩과 기본 구조와 제어 방식이 상당히 유사한데, 가장 큰 차이는 I/O 포트 수가 두 배인 16bit(2 x 8bit)로 확장된 것이다.
2025.03.03 - [임베디드 개발/임베디드 리눅스] - TCA9538 데이터시트 및 리눅스 드라이버 분석 (Tested on Raspberry Pi 4)

지난번에 올린 TCA9538 칩과의 차이와 해당 글에서 언급하지 않았던 주요 특징을 중심으로 정리해 본다.

1. 공급 전압
공급 전압은 2.3V ~ 5.5V이다.
2. 3개의 하드웨어 주소 핀 제공

A0, A1, A2의 3개의 하드웨어 주소 핀이 있어 최대 8개의 디바이스를 동일 버스에 연결할 수 있고, 주소 범위는 0x21~0x27을 사용한다.
3. 핀아웃

- P00 ~ P07 : Port 0
- P10 ~ P17 : Port 1
- A0, A1, A2 : I2C 주소 설정 핀
- SDA, SCL : I2C 데이터 / 클럭
- INT : 인터럽트 출력 (Active-Low, Open-Drain)
- VCC / GND : 전원
4. 출력은 LED를 직접 구동할 수 있을 정도로 높은 구동 전류 제공


- Sink(LOW) 전류 : 핀당 25mA
- Source(HIGH) 전류 : 핀당 10mA
- 포트 합계 제한
- Port 0 (P00-P07) : 100mA
- Part 1 (P10-P17) : 100mA
- 디바이스 전체 제한 : 160mA
일반적으로 PCB에서 상태표시용으로 사용하는 LED의 구동전류가 2mA~5mA이기 때문에 충분하다.
5. Power-On-Reset(POR)

Vcc에 공급되는 전원이 Vpor에 도달할 때까지는 장치를 리셋 상태로 고정하고, Vcc 전압이 Vpor에 도달하면 리셋이 해제되면서 칩 내부 레지스터들이 Default 상태로 초기화된다. PCA953x 계열과 다르게 별도 /RESET 핀이 없기 때문에 장치를 강제로 다시 초기화하려면 Vcc 전압을 Vporf 이하로 떨어뜨려야 한다.
6. 레지스터 종류와 Command Byte(=Control Register)

해당 칩은 구조적으로 8-bit Shift Register 두 개를 묶은 형태이며, 모든 레지스터 또한 Port 0과 Port 1 쌍으로 존재한다. Port 0을 통해 핀 P00-P07을 제어하고, Port 1을 통해서는 핀 P10-P17을 제어한다.
칩에는 총 8개의 레지스터(4개씩 2 쌍)가 존재하고 I2C transfer 시 Address Byte 다음에 오는 Command Byte가 접근할 내부 레지스터를 지정하는 역할을 한다.
- Input Port Registers : Input으로 설정된 핀의 현 논리 레벨을 읽는다.
- 0x00 : Input Port 0 (Read Only)
- 0x01 : Input Port 1 (Read Only)
- Output Port Registers : Output으로 설정된 핀의 출력 값을 설정한다.
- 0x02 : Output Port 0
- 0x03 : Output Port 1
- Polarity Inversion Registers : Input으로 설정된 핀의 논리 반전 여부 설정한다. (1 = 극성 반전, 0 = 반전안함: deault)
- 0x04 : Polarity Inversion Port 0
- 0x05 : Polarity Inversion Port 1
- Configuration Registers : I/O 핀을 Input 또는 Output으로 쓸 지 설정한다. (1 = Input: default, 0 = Output)
- 0x06 : Configuration Port 0
- 0x07 : Configuration Port 1
7. Register Pair Access


좀 특이한 점인데 PCA9555는 각 기능 레지스터가 모두 pair(Port 0 / Port 1)로 구성되어 있어서, I2C transaction에서 Command Byte로 특정 레지스터를 지정한 뒤 연속으로 두 바이트를 읽거나 쓰면, 첫 번째 바이트는 지정한 레지스터에 접근하고, 두 번째 바이트는 같은 pair의 다른 레지스터에 접근한다.
일반적인 메모리처럼 레지스터 주소가 순차 증가하는 구조가 아니라, 같은 기능 레지스터 쌍 내부에서 토글 방식으로 이동하는 점이 특징이다. 따라서 Port 1을 지정해 먼저 접근하고 그 다음 Port 0에 접근하는 방식도 가능하다.
물론 이 방식은 한 레지스터에 접근해 두 바이트를 연속으로 읽거나 쓸 때 적용되는 거라서 원하는 Port의 레지스터만 단독으로 제어하는 것도 가능하다.
8. Errata

이 칩에는 Errata가 존재한다. PCA9555에 마지막으로 쓴 Command Byte(=Control Register)가 0x00(Input Port 0) 상태에서, I2C 버스에 연결된 다른 Slave가 자신의 Address와 R/W bit를 확인하고 ACK를 보내면 INT 신호가 비정상적으로 해제될 수 있다.
이에 대한 Workaround 방법으로 0x00 읽기 작업을 마친 뒤에는 Command Byte를 0x00이 아닌 다른 값을 한번 써서 바꿔두라고 한다.
칩의 /INT 핀 기능 사용하면서 동시에 Port 0를 입력으로 설정해 데이터를 읽는 경우에만 이 Error를 주의하면 된다.
'임베디드 개발 > 펌웨어' 카테고리의 다른 글
| UART 흐름제어 (RTS/CTS, DTR/DSR, XON/XOFF) (0) | 2026.05.24 |
|---|---|
| 리셋 신호가 Low Active인 이유 (0) | 2026.05.14 |
| VxWorks 셸에서 부트 파라미터 확인 및 설정 방법 (0) | 2026.04.06 |
| Eye Opening Monitor (EOM) (2) | 2026.03.15 |
| 오실로스코프 AC / DC 커플링 모드 (0) | 2026.03.01 |