본문 바로가기
임베디드 개발/펌웨어

PCA9555, I2C 16-bit I/O Expander

by eteo 2026. 5. 10.
반응형

 

 

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를 주의하면 된다.

 

 

 

 

 

반응형