대부분의 I2C 동작의 틀은 크게 다르지 않다고한다.
이해를 위해 임의의 데이터시트를 선택하여 I2C부분의 내용을 번역하고 이해가 수월하도록 몇 가지 추가하여 기록해 보았다.
MCP23008의 I2C 인터페이스 프로토콜 예시를 다룹니다.
MCP23X08에는 시리얼 인터페이스 블록을 통해 처리 할 수있는 11개의 레지스터가 있습니다.
Address | Access to |
---|---|
00h | IODIR |
01h | IPOL |
02h | GPINTEN |
03h | DEFVAL |
04h | INTCON |
05h | IOCON |
06h | GPPU |
07h | INTF |
08h | INTCAP (Read-only) |
09h | GPIO |
0Ah | OLAT |
I2C는 Inter Integrated Circuit의 줄임말로 TWI(Two Wire Interface)라고도 불림.
말그대로 두 개의 선으로 연결하여 통신이 가능하다.
I2C에서 사용되는 두 선은 SDA와 SCL로 구성되어 있다.
Master와 Slave 각각에 SDA와 SCL을 바로 연결해주기만 하면 된다고 생각하지만
직접 연결한 상태의 회로에서는 전압이 걸리지 않기 때문에 SDA와 SCL 라인에 풀업(Pull-up) 저항을 달아 전압을 공급해 줘야 함.
Pull-up: 신호 상태를 걸리는 전압기준 High 상태로 끌어 당김.
그렇기 때문에 풀업을 걸고나서 통신이 되고있지 않을땐 High상태로 쭉 있다가
신호가 걸리면 Low로 바뀌는 현상을 볼 수 있음.
I2C slave
장치이다.010 0xxx
.0x20 ~ 0x27
까지수신측에서 1개의 데이터 바이트를 받은 뒤 송신측에 잘 받았다고 보내주는 신호.
아래와 같은 상황에서 수신측이 송신측에 NACK 신호를 보냄.
1. Master는 I2C 버스에 쓰기 위해 Slave의 주소와 마지막 비트(R/W, Write: 0)를 쓰기상태로 설정하여 버스에 시작조건을 보냄.
2. Slave가 승인 비트(ACK)를 보내면 Master는 쓰기를 원하는 레지스터 내부의 주소를 전송함.
3. Slave는 다시 승인(ACK)하여 Master에게 준비가 되었음을 알림.
4. 그 후, Master가 필요한 모든 데이터를 보낼 때까지 레지스터 데이터를 Slave로 보내기 시작함.
5. Master는 STOP 상태(Slave로부터 NACK 받은 이후)에서 전송을 종료합니다.
I2C 쓰기 작업에는 제어 바이트 및 레지스터 주소 시퀸스가 포함되어있음.
이 시퀀스 다음에 Master에서 8 비트 데이터를 내보내면 MCP23008에서 ACK(Acknowledge)를 반환합니다.
Master에 의해 STOP 또는 RESTART 조건이 생성되면서 작업이 종료됩니다.
Slave로부터 데이터를 읽어오는 작업은 쓰는 과정과 매우 유사하지만 몇 가지 작업이 더 필요함.
Master가 먼저 Slave에 읽고자 하는 레지스터를 알리는 작업이 필요함
I2C 읽기 작업에는 제어 바이트가 포함됩니다.
그런 다음 MCP23008은 주소 지정된 레지스터에 포함 된 데이터를 전송합니다.
Master가 STOP 또는 RESTART 조건을 생성하면 시퀀스가 종료됩니다.
IOCON 레지스터의 순차 연산 (SEQOP) 비트는 주소 포인터의 작동을 제어합니다.
주소 포인터는 각 데이터 전송 후 주소 포인터가 자동으로 증가하도록 활성화 (기본값)하거나 비활성화 할 수 있습니다.
IOCON.SEQOP = 0
)에서 작동하는 경우 주소 포인터는IOCON.SEQOP = 1
) 에서 작동하는 경우 MCP23008은 데이터 전송 중
Master가 STOP 또는 RESTART 조건을 보내는 것으로 시퀀스가 종료됩니다.
MCP23008 주소 포인터는 마지막 레지스터 주소에 도달 한 후 주소 0으로 돌아감.