엔지니어스 - Engineeus

I2C란? (엄청 쉽게 설명) 본문

About Computer

I2C란? (엄청 쉽게 설명)

Engineeus 2021. 7. 6. 19:30
728x90

간단 정리


- I2C 통신은 2개의 선을 이용하는 통신 방식

- 하나의 마스터와 여러개의 슬레이브 기기가 물려 통신이 가능

- 클럭 신호를 사용하는 동기식 통신 방식이라 시간에 자유로움

- 슬레이브 선택을 위해 항상 주소 데이터가 붙기에 긴 데이터를 전송 하기엔 부적합

 

 

 

세부 정리


I2C, 아이 투 씨 라고 주로 하지만 사실 정식 명칭은 '아이 스퀘어 씨' 이다.

Inter-Integrated Circut(I2C)는 IC 사이 통신 링크를 제공하는 양방향 2와이어 직렬 버스 이다.

즉, 두가닥으로 직렬 통신을 하는 통신프로토콜 이다.

 

첫번째 가닥은 SDA 선이다. 이는 데이터를 주고 받기 위한 선이다.

두번째 가닥은 SCL 선이다. 이는 타이밍을 동기화 하기 위한 클럭 선이다.

하나의 마스터와, 다른 하나의 슬레이브로 구성이 된다. 그리고 슬레이브는 127개까지 구성이 가능하다.

즉, 메인 ECU가 있으면, 그 외 여러가지 디바이스들이 묶여 통신이 가능 하다는 이야기 이다.

 

I2C 사용 시에 주의 해야 할 점은 '풀업 저항이다. 위 그림의 Rp 두개가 저항이다. 이 저항을 다는 이유는 I2C 통신을 위해 SDA선과 SCL 선이 모두 기본으로 High 상태가 되어야 한다. 풀업 저항은 이를 High 상태로 만들어 준다. (아두이노 사용 한다면 이는 내부 풀업 저항을 사용 하기 때문에 직접 달아 줄 필요는 없다.)

또한, 한가닥의 선우로 Tx, Rx를 하기 때문에 Floating 현상이 발생 함을 방지 하기 위해 풀업 저항을 달기도 한다.

 

데이터를 전송 또는 수신 할건지는 마스터에서 주도한다. 그리고 데이터를 송/수신 할때 반드시 슬레이브 주소를 마스터에 명시 해 두어야 통신이 된다.

 

시리얼 대표적 통신(UART)와 비교 해보면, I2C는 동기화 통신 방식이라는 것이다. 동기화 통신 방식이란 Clock 신호를 이용해서 데이터를 얼마나 보내는지 타이밍을 맞춘다. 이는 시리얼 통신처럼 통신속도(Baudrate)를 따로 정해주지 않아도 된다는 점이 있다. (물론 시리얼 통신에서 USART는 클럭을 사용 하지만, 일단 여기선 언급 하지 않겠다.)

 

 

데이터 통신에 대해 알아보기


아래 SDA와 SCL은 위에서 잠깐 언급한거와 마찬가지로 풀업저항에 의해 기본 High 이다.

 

그러다 SCA신호가 LOW로 떨어질때가 시작 신호(S)라고 판단한다.

그 후 SCL선으로 클럭 신호가 만드어지는데, 파란 부분 처럼 클럭 신호가 LOW일때가 SDA 신호를 비트 신호로 바꾸는 시간이다.

초록색 부분처럼 클럭 신호가 High 일때가 SDA 신호를 읽는 시간이다.

다시 SCL 신호가 Low(녹색)가 되면 비트신호로 바꾸고 다시 High(파란색)가 되면 다시 읽고. 이렇게 반복 한다.

한 클럭당 한 비트 데이터 신호를 만든다. 모든 비트의 전송이 끝난 후 SCL 신호가 High가 되면 SDA 신호 역시 High로 되어 정지 신호(P를 만든다.

시작 신호 뒤 나오는 첫 7비트는 슬레이브의 주소값이다. 8번째 비트는 데이터를 읽어올지 또는 쓸지를 나타내는 신호 비트이다.

 

 

 

쓰기/읽기


슬레이브의 주소 값과 읽기/쓰기 비트는 마스터에서 생성 가능하다. 

 

데이터 쓰기(Write)

쓰기의 경우엔 마스터에서 데이터를 생성 해야 한다.

 

데이터 읽기(Read)

읽기의 경우엔 슬레이브에서 데이터를 생성 해야 한다. 8비트 데이터 전송 후 슬레이브에서 응답신호(ACK)를 만들어 수신을 확인해준다.

응답 신호는 기본적으로 LOW여야 하며 만일 슬레이브가 데이터를 전송 하는 상태에서 모든 데이터의 전송이 끝났다면, High 상태로 바뀐다. 이를 NACK 라고 한다. 그 외 NACK가 생기면 통신 에러 또는 데이터의 에러이다.

 

위 신호들을 다 구현 해야 하는 것은 아니다. 대부분 칩에서 I2C 통신은 하드웨어 기능으로 구성 되어 있으므로 우리는 I2C 관련 레지스터의 비트를 설정 하는 것 만으로도 구현이 가능하다. (아두이노는 Wire란 라이브러리를 제공 하여 더욱 쉽게 이용 가능하다.)

 


다음엔 코드를 한번 분석 해보자.

Comments