I2C 통신 이해 (with MCP23008)

d3fau1t·2021년 12월 5일
0

Embedded

목록 보기
3/6

대부분의 I2C 동작의 틀은 크게 다르지 않다고한다.

이해를 위해 임의의 데이터시트를 선택하여 I2C부분의 내용을 번역하고 이해가 수월하도록 몇 가지 추가하여 기록해 보았다.
MCP23008의 I2C 인터페이스 프로토콜 예시를 다룹니다.

MCP23008

MCP23X08에는 시리얼 인터페이스 블록을 통해 처리 할 수있는 11개의 레지스터가 있습니다.

Register map

AddressAccess to
00hIODIR
01hIPOL
02hGPINTEN
03hDEFVAL
04hINTCON
05hIOCON
06hGPPU
07hINTF
08hINTCAP (Read-only)
09hGPIO
0AhOLAT

I2C 인터페이스


I2C는 Inter Integrated Circuit의 줄임말로 TWI(Two Wire Interface)라고도 불림.

말그대로 두 개의 선으로 연결하여 통신이 가능하다.

  • 위 그림과 같이 I2C 통신은 Master와 통신을 하고자 하는 주변 기기를 Slave로 설정할 수 있음.
  • 일반적으로 MCU 1대와 여러대의 I2C 통신을 지원하는 기기와 연결할 경우
    Master 1대와 Slave 여러대로 통신이 가능.
  • 물론 Master는 2대 이상도 가능.

I2C에서 사용되는 두 선은 SDA와 SCL로 구성되어 있다.

  • 통신이 개시되었을 때 SDA는 데이터를 주고 받는 역할
  • SCL은 동기화를 위한 CLOCK 역할

Master와 Slave 각각에 SDA와 SCL을 바로 연결해주기만 하면 된다고 생각하지만

직접 연결한 상태의 회로에서는 전압이 걸리지 않기 때문에 SDA와 SCL 라인에 풀업(Pull-up) 저항을 달아 전압을 공급해 줘야 함.

Pull-up: 신호 상태를 걸리는 전압기준 High 상태로 끌어 당김.

그렇기 때문에 풀업을 걸고나서 통신이 되고있지 않을땐 High상태로 쭉 있다가
신호가 걸리면 Low로 바뀌는 현상을 볼 수 있음.

제어

  • MCP23008는 1개의 R/W bit와 나머지 7개 bit, slave 주소지정방식을 지원하는 I2C slave장치이다.
    • slave 주소는 4개의 고정된 비트와 유저가 설정한 3개의 비트를 포함합니다.
    • (A2, A1, A0의 입력에 따라 달라짐.)

  • 제어를 위한 Slave 주소비트는 010 0xxx.
    • 0x20 ~ 0x27까지
  • ACK는 MCP23008이 내어주는 데이터

데이터 전송

  • 장치와의 I2C 통신은 Master가 START 조건을 전송함으로써 시작됨.
    • 통신 종료는 Master가 STOP 조건을 전송하면 됨.
  • SCL 라인이 High인 상태에서 SDA 라인이 High에서 Low로 전환될 때 START 조건 만족함.
  • SCL 라인이 Low에서 High로 전환된 이후 SDA 라인이 Low에서 High로 전환될 때 STOP 조건 만족함.

ACK bit

수신측에서 1개의 데이터 바이트를 받은 뒤 송신측에 잘 받았다고 보내주는 신호.

NACK bit

아래와 같은 상황에서 수신측이 송신측에 NACK 신호를 보냄.

  • 수신측에서 뭔가 다른 작업을 하고있거나 통신을 시작할 준비가 안되었을 때
  • 전송 중 수신측에서 이해하지 못하는 데이터나 명령을 받을 때
  • 전송 중 수신측에서 더 이상 데이터 바이트를 수신할 수 없을 때
  • READ 동작시 Master가 수신측으로 작동하면서 예상한 만큼 데이터를 읽었을 때 더 이상 안 보내도 된다고 Slave에 알릴 때

I2C Write

통상적인 작동방식


1. Master는 I2C 버스에 쓰기 위해 Slave의 주소와 마지막 비트(R/W, Write: 0)를 쓰기상태로 설정하여 버스에 시작조건을 보냄.
2. Slave가 승인 비트(ACK)를 보내면 Master는 쓰기를 원하는 레지스터 내부의 주소를 전송함.
3. Slave는 다시 승인(ACK)하여 Master에게 준비가 되었음을 알림.
4. 그 후, Master가 필요한 모든 데이터를 보낼 때까지 레지스터 데이터를 Slave로 보내기 시작함.
5. Master는 STOP 상태(Slave로부터 NACK 받은 이후)에서 전송을 종료합니다.

MCP23008에서의 작동방식


I2C 쓰기 작업에는 제어 바이트 및 레지스터 주소 시퀸스가 포함되어있음.


이 시퀀스 다음에 Master에서 8 비트 데이터를 내보내면 MCP23008에서 ACK(Acknowledge)를 반환합니다.


Master에 의해 STOP 또는 RESTART 조건이 생성되면서 작업이 종료됩니다.

  • 모든 바이트 전송 후 MCP23008에 데이터가 기록됩니다.
  • 데이터 전송 중에 STOP 또는 RESTART 조건이 생성되면 데이터가 MCP23008에 기록되지 않습니다.

I2C Read

통상적인 작동방식

Slave로부터 데이터를 읽어오는 작업은 쓰는 과정과 매우 유사하지만 몇 가지 작업이 더 필요함.

Master가 먼저 Slave에 읽고자 하는 레지스터를 알리는 작업이 필요함

  1. 쓰기와 유사한 방식으로 원하는 장치 주소에 R/W(0: Write) 전송함.
  2. 이후 읽고자 하는 레지스터 주소 전송
  3. Slave가 레지스터 주소를 확인하면 Master는 START 조건과 함께
    다시 원하는 장치 주소에 R/W(1: Read) 전송함.
  4. Slave가 읽기 요청 승인(ACK)하고 Master가 SDA 버스를 해제하지만 Slave에 클럭을 계속 공급.
  • Master는 클럭 펄스를 계속 전송하지만 SDA 라인을 해제하여 Slave가 데이터 전송 가능하도록 함.
  1. Master가 예상한 바이트 수를 수신하면 NACK를 전송하여 통신을 중지하고
    버스를 해제하라는 신호를 Slave에 보냄.(정지조건)

MCP23008에서의 구동 방식


I2C 읽기 작업에는 제어 바이트가 포함됩니다.

  • 이 시퀀스 다음에는 R/W 비트가 논리 1인 다른 제어 바이트가 이어집니다.
    • (R: 1, W=0)
    • (R/W=1, START 조건 및 ACK를 포함한 제어바이트)


그런 다음 MCP23008은 주소 지정된 레지스터에 포함 된 데이터를 전송합니다.


Master가 STOP 또는 RESTART 조건을 생성하면 시퀀스가 종료됩니다.

I2C Sequential access (순차접근)

Sequential operation bit (순차 작동 비트)


IOCON 레지스터의 순차 연산 (SEQOP) 비트는 주소 포인터의 작동을 제어합니다.

주소 포인터는 각 데이터 전송 후 주소 포인터가 자동으로 증가하도록 활성화 (기본값)하거나 비활성화 할 수 있습니다.

  • 순차 모드 (IOCON.SEQOP = 0)에서 작동하는 경우 주소 포인터는
    각 바이트가 클럭 된 후 다음 주소로 자동 증가합니다.
    - 데이터 전송 후 STOP 또는 RESTART 조건을 전송하는 대신
    Master는 주소 포인터가 가리키는 다음 바이트를 클럭합니다.
  • 바이트 모드 (IOCON.SEQOP = 1) 에서 작동하는 경우 MCP23008은 데이터 전송 중
    각 바이트가 클럭 된 후 주소 카운터를 증가시키지 않습니다.
    - 이를 통해 추가 제어 바이트 없이 추가 클럭을 제공하여
    동일한 주소를 지속적으로 읽거나 쓸 수 있습니다.
    - 데이터 변경을 위해 GPIO 레지스터를 폴링할 때 유용합니다.

순차적 읽기 및 쓰기


Master가 STOP 또는 RESTART 조건을 보내는 것으로 시퀀스가 종료됩니다.


MCP23008 주소 포인터는 마지막 레지스터 주소에 도달 한 후 주소 0으로 돌아감.

profile
웹 백엔드 합니다.

0개의 댓글

관련 채용 정보