[통신]

I2C 개요

Neo Park 2012. 7. 3. 14:48

 

 

 

2C는 2개의 라인으로 100k 또는 400k까지의 비교적 저속의 데이터 전송을 할 수 있는 버스이다.

내부 레지스터로 제어되는 많은 종류의 디바이스들이 I2C를 지원하다. 간단해 보이기는 해도 버스하나에 여러개의 디바이스가

물려서 버스를 공유할 수도 있고 두 개 이상의 마스터를 둘 수도 있어서 아비트레이션(Arbitration) 이슈까지 있는, 알고보면

상당한 복잡한 버스이기도 하다.

 

 

주제가 너무 복잡해지는 것을 막기위해서(또는 잘 몰라서) 다루는 스펙을 제한하는데, 일단 마스터는 버스에 하나만 있는 것으로 해서 아비트레이션에 관련된 내용은 생략한다. 그리고 8비트 I2C 어드레스와 8비트 내부 레지스터 어드레스를 사용하는 디바이스를 읽고 쓰는 동작에만 국한한다.

 

 

여기에서 인용한 그림들은 I2C Specification 및 일부 디바이스 datasheet에서 가져온 것으로 문제가 제기되면 다른 것으로 바꾸거나 직접 그리기로 하겠다.

 

 

 

 

 

 

1. SCL, SDA

 

I

2C 버스를 두 개의 라인으로 구성된다. SCL(Serial Clock Line)과 SDA (Serial Data Line)으로 SCL은 데이터의 동기화를 위한 클럭, SDA는 데이터 라인이다.

I2C 버스 연결 단자는 모든 디바이스가 Open Collector (CMOS는 Open Drain)로 만들어진다. 따라서 버스라인에는 여러개의 디바이스가 동시에 연결될 수 있고 라인에는 반드시 풀업 저항이 있다. 풀업이 되어있으므로 휴지(Idle) 상태에서 버스의 신호는 High이고 특정 디바이스가 버스를 드라이브 하면 Low가 된다.

 

 

버스에는 하나의 마스터와 하나 이상의 슬레이브가 있다. 두 디바이스가 있다고 했을 때 데이터를 내어주는 쪽이 트랜스미터, 받는 쪽이 리시버가 된다. 마스터와 슬레이브는 데이터의 전달 방향에 따라 트랜스미터, 리시버의 역할을 번갈아 가며 수행한다.

 

마스터는 SCL의 클럭을 드라이브하고 시퀀스의 시작과 끝을 제어하는 주체이다. 슬레이브는 이 클럭에 동기해서 데이터를 내어주거나 받게 된다. I2C를 지원하는 디바이스는 고유의 슬레이브 어드레스를 가지고 있다. 보통 IC제조회사 및 제품군에 따라 어드레스가 부여되어있다. 만약에 어드레스가 동일한 두 개이상의 디바이스가 한 버스에 물려있으면 한마디로 쫑난다.

 

 

I2C 라인은 디바이스 전원에 따라 5V TTL을 사용할 때도 있고 3.3V TTL레벨을 사용하는 경우도 있다. 따라서 서로 다른 전압으로 구동되는 디바이스를 같은 버스에 물려야 할 경우 입력 허용 전압등을 잘 확인해야 한다. 필요하다면 Level Shifter 등을 사용해서 디바이스를 전압 별로 분리해야 할 수도 있다.

 

2. Slave Address

 

여러 개의 슬레이브가 하나의 I2C버스에 물려 있을 때 트랜스미터는 데이터를 주고 받을 디바이스의 어드레스를 제일 먼저 전송하게 된다. 모든 슬레이브 디바이스는 첫번째로 날아오는 어드레스에 관심을 준다. 만약 그 어드레스가 자신의 것이라면 계속해서 날아올 데이터에 반응할 태세를 갖추어야 한다. 만약 자신과 관계없는 어드레스라면 소위 쌩을 까면 된다.

 

 

디바이스의 어드레스는 8비트 값이다. 회사에 따라서 이 어드레스를 7비트 또는 8비트로 표시를 한다. 이렇게 하는 이유는 맨 마지막 비트값이 0이면 쓰기 동작을, 1이면 읽기 동작을 나타내기 때문이다.

 

 

즉 어드레스가 0x46이라면 쓰기 동작일 때는 트랜스미터가 0x46을 날리고, 읽기 동작일 경우에는 마지막 비트에 1을 더해서 0x47을 날리게 된다. 이 어드레스 값을 그냥 0x46이라고 표현하는 회사도 있고, 아니면 마지막 비트를 떼어내고 7비트로 0x23으로 표시하는 회사도 있어서 항상 헷갈리는 문제가 된다. I2C 제어 프로그램 루틴에서도 함수에 이 어드레스를 줄 때 7비트를 사용하는 경우, 8비트를 사용하는 경우 제각각이므로 엉뚱한 고생을 유발하는 경우가 많아 항상 주의할 필요가 있다.

 

 

3. Start - Stop 그리고 Repeated Start

 

 

I2C 액세스 시퀀스는 Start로 시작해서 Stop으로 끝난다.

 

 

 

 

I2C의 Idle 상태(놀고있는 상태)에서 버스는 항상 High 이다.

 

그림에서와 같이 SCL이 High인 상태에서 SDA가 Low로 가는 경우, 이는 버스 시퀀스의 시작을 알리는 Start 조건을 나타낸다. Start는 마스터가 제어한다. 종료를 알리는 Stop은 그림에서와 같이 차례로 SCL이 High로, 그다음 SDA가 High로 돌아가는 것으로 나타낸다.

 

 

한편 Stop 조건이 만들어지지 않은 상태에서 다시 Start 조건이 나타나는 경우가 있다, 이를 Repeated Start라고 하는데 시퀀스의 길이를 조금 단축시키는 효과가 있다. 이는 예를 통해서 다시 언급이 된다.

 

 

 

4. Acknowledge (ACK)

 

 

I2C specification에 따르면 통신 주체는 마스터, 트랜스미터와 리시버로 구분되어있다. 마스터의 책임은 I2C 사이클을 시작하고 끝내는 start, stop 제어와 SCL의 클럭을 생성하는 것이다. 트랜스미터는 클럭에 동기해서 SDA 라인상에 데이터를 내어놓는 넘이고, 리시버는 그 데이터를 받아가는 넘이다. 따라서 세 개의 디바이스가 이 짓을 나누어 하는 것도 가능한 것으로 보이는데, 통상 마스터가 클럭을 내면서 데이터를 주거나 받게 되는 경우를 겸하게 되므로 여기서는 하나의 마스터와 하나의 슬레이브간의 통신만 생각하기로 하겠다.

 

 

4-1) 마스터의 Write와 ACK

 

I2C의 데이터 전송단위는 반드시 8비트로 이루어진다. 8 비트 전송의 마지막 단계에는 Acknowledge라는 것을 사용해서 전송이 제대로 이루어졌는지 확인하는 절차가 추가된다. 마스터의 8비트 Write 동작의 경우, 트랜스미터는 마스터, 리시버는 슬레이브가 된다.

 

 

 

8비트의 전송이 마무리 된 단계에서 리시버는 데이터를 제대로 받았는지 아닌지를 알리기 위해 ACK 를 내주어야 한다. 이는 9번째 클럭에서 SDA 라인을 Low로 드라이브해서 표시한다.

 

즉, 위의 그림에서와 같이 마스터는 먼저 데이터 전송을 위한 8개의 클럭외에 마지막으로 ACK를 위한 9번째 클럭을 생성한다. 전송을 마친 트랜스미터는 ACK 구간에서는 SDA 라인을 드라이브하지 않고 놓아두어야 한다. 이렇게 되면 SDA라인은 High상태에 있게 되는데, 이상태에서 리시버는 데이터를 이상없이 수신했으면 SDA 라인을 Low로 드라이브한다.

 

 

마스터는 9번째 클럭에서 SDA라인을 확인해서 데이터 전송의 성공여부를 확인할 수 있다. 리시버가 데이터를 제대로 받지 못했거나 혹은 맛이 갔다면 SDA라인은 High상태로 머물러 있게 되는데 이 경우는 NACK(not acknowledge)라고 하고 에러 처리의 대상이 된다.

 

 

4-2) 마스터의 Read와 ACK

 

마스터가 데이터를 읽어가는 경우, 즉 마스터가 리시버이고 슬레이브가 트랜스미터인 경우 ACK의 생성 책임은 마스터에 있다. 한가지 더 언급할 것은 여러 바이트의 데이터를 계속해서 읽어가는 경우 데이터의 끝을 알리는 신호를 NACK로 처리한다는 것이다.

 

마스터 Write의 경우, 마지막 바이트를 쓰고 리시버의 ACK를 확인 한 다음 Stop 조건으로 사이클을 마무리 하면 깔끔하게 종료가 되므로 아무런 문제가 없다.

그런데 마스터 Read의 경우, 슬레이브는 데이터를 어디서 끊어야 하는지 알 수가 없이 하염없이 마스터의 ACK에 맞추어 데이터를 내놓아야 한다. 이를 해결하기 위해서 마스터는 마지막 바이트를 받으면 ACK대신 NACK 조건을 만들어 낸다.

슬레이브는 NACK를 이제 데이터를 그만 보내라는 의미로 해석하여 마무리 단계로 들어가게 된다.

 

 

 

 

5. 가장 많이 쓰는 마스터 Write 시퀀스

 

I2C는 기본적으로 앞에 설명한 Write와 Read 사이클을 조합하여 여러가지 형태의 전송 시퀀스를 만들어 낼 수 있다. 하지만 일반적으로 사용하는 CPU와 디바이스의 사이에서의 주로 사용되는 전송의 형태는 대부분 비슷하다.

 

앞서 언급한대로 슬레이브 디바이스는 고유의 어드레스가지고 있다. 따라서 1) 전송의 시작에는 이 어드레스를 버스에 쓰는 동작으로 시작된다. 2) 디바이스 내부에는 통상 여러개의 레지스터가 있고, 레지스터에는 또 각각의 어드레스가 있다. 따라서 두번째는 이 어드레스값 오게 된다. 그 다음은 3) 그 레지스터에 저장할 데이터이다. 한 바이트를 쓰는 경우도 많고 레지스타가 16비트 값이라면 두 바이트를 써주어야 한다. 한편 벌크스타일로 여러바이트를 쭉 써주는 경우도 있는데, 이런 경우 통상 디바이스 내부 레지스터 어드레스는 자동 증가 된다.

 

 

 

위의 그림은 0xBA라는 슬레이브 어드레스를 갖는 디바이스의 0x09번 레지스터에 0x2와 0x4를 차례로 쓰는

경우를 보여준다. 사실 이 디바이스는 내부 레지스터가 16비트인 경우로, 이렇게 데이터 사이클이 반드시 두 번 오도록 되어있다. 벌크로 전송하는 경우라면 뒤의 데이터 사이클은 필요한 데이터 수만큼 늘어난다.

 

 

6. 가장 많이 쓰는 마스터 Read 시퀀스

 

Read의 경우는 살짝 더 복잡하다. Read라고 하지만 전체 시퀀스는 Write + Read 형태를 취한다. 1) 먼저 오는 Write 사이클에서는 슬레이브 어드레스와 레지스터 어드레스가 전달된다. 이를 통해서 슬레이브 내부 레지스터 어드레스가 지정되므로 슬레이브는 액세스할 내부레지스터를 준비하게 된다.

 

2) 두번째 Read 사이클에서는 앞서 설명한대로 슬레이브 어드레스+1이 와서 Read 사이클임을 알린다. 3) 이 다음 사이클부터는 트랜스미터와 리시버의 역할을 바뀌게 되며, 슬레이브가 데이터를 내어주고 마스터가 데이터를 받아가게 된다. 4) 슬레이브는 먼저 설정된 내부 레지스터 어드레스를 기준으로 내부 카운터를 증가시키면서 마스터에서 NACK를 내기 전까지 계속해서 레지스터 값을 버스에 실어 준다.

 

Write와 Read 시퀸스 사이에는 보통 Repeated Start가 온다. Write 시퀀스 후에 Stop을 주고 다시 Start를 할 수도 있지만 보통 아래 그림과 같이 Repeated Start를 사용하는게 일반적이다.

 

 

 

 

참조 : http://blog.naver.com/sigsaly?Redirect=Log&logNo=100133911365