본문 바로가기

Embedded

I2C-BUS(=TWI, Inter-IC-BUS)


Inter-IC Bus (= TWI :  Two-wire Serial Interface)



AVR에서는 2가닥의 선으로 128개의 다른 장치들과 통신할 수 있는 Two wire serial interface를 제공한다. 이를 통해 I2C-bus를 사용할 수 있다.

우선 Phillips가 정의한 I2C-bus(i square c)에 대해 알아보자.

2000년 2.1버전으로 정의된 I2C는 다음과 같은 특징을 가진다.

- 오직 2가닥의 bus만 필요; Serial data Line(SDA), Serial Clock Line(SCL)
 
-  bus에  연결되어  소프트웨어적으로  address가  가능한  각각의  장치들은  고유의  address값과  master/slave의  관계를  가진다.
master는 master-transmitter 또는 master-receiver로 동작이 가능하다.

- 다수의 master가 BUS에 연결되어 있어도 장치간 충돌을 감지할 수 있고 또한 2개 또는 그 이상의 master를 동시에 초기화 하여 데이터가 변조되는 일 없이 통신이 가능하다.

- 직렬, 8bit, 지향성 데이터 통신은 standard-mode에서 100kbps로 통신할 수 있고, Fast-mode에서   
  400kbps, High-speed mode에서 3.4Mbps로 통신이 가능하다.

- 단일 칩 필터링으로 bus data line에서 발생하는 spike(튀는 노이즈 값)을 차단할 수 있다.

- bus의 capacitance가 400pF을 넘지 않는 한도에서 IC를 계속 연결할 수 있다. 

참고하자면 ATmega128에서는 bus에 연결할 수 있는 IC는 최대 128개로 제한된다고 적혀있다.
(주소값이 7bit를 가지기 때문에 이론상 128개까지 연결 가능하나 실제로는 BUS의 capacitance를 고려해야 한다.)



다음은 I2C BUS의 연결 형태를 나타낸 것이다.




I2C-bus는 풀업저항에 의해 positive 전원(Vcc)가 연결되어 있는 SDA와 SCL을 이용하여 어떠한 IC간에도 정보교환이 가능하도록 구성되어 있다.

왜 풀업저항이 연결되어 있을까?

위와 같은 설계덕에 입출력 전압 level이 다른 장치간에도 I2C-BUS의 High와 Low 상관없이 Vcc의 레벨로  통합시켜버린다!! (물론 엄청난 전압차를 다 통합시키는 것은 아니고... 통신속도에 따라 가능한 범위가 한정되어 있다. 자세한것은 datasheet를 참조.) 


 


Master / Slave



이때, 장치는 master와 slave로 구분할 수 있고, 또 그 구분은 trasmitter와 reciever로 세분된다.

I2C-BUS에 연결된 장치는 master, slave어떠한 모드로도 작동할 수 있고 또한 trasmitter, receiver로도 작동할  수 있다. (이때, LCD와 같은 장치는 오직 receiver로만 동작할 수 있다.)

일반적으로 master는 MCU가 되고, slave는 각종 센서류, 메모리, 출력장치가 된다. 

 
마스터와 슬레이브의 기능 구분 

Master : I2C-BUS를 초기화 할 수 있다. SCL에 clock을 출력시킬 수 있다.
Slave  : 마스터에 의해 호출된다....

송신부와 수신부의 기능 구분 

Transmitter : I2C-BUS에 data를 보낸다.
Receiver    : I2c-BUS에서 data를 받는다.



 



I2C-BUS 통신 규격



1. Data Validity



실질적인 Data가 전송되는 SDA line에 존재하는 0, 1 신호는 SCL의 상태에 따라 유효하기도 하고 무효하기도 하다. 

Condition 1. SCL이 high이면, SDA의 신호(Data value)는 일정해야한다.
Condition 2. SCL이 low이면, SDA의 신호는 변경가능하다.


만약 이 이외의 경우가 발생한다면? 그것이 바로 I2C-bus의 start, stop 조건이다.



2. START and STOP conditions




SCL이 high, 즉 SDA의 신호는 변경할 수 없는 상황인데 변화가 일어났다면? 

Condition 3. SDA의 신호가 falling edge를 가진다면 -> START condition 
Condition 4. SDA의 신호가 rising edge를 가진다면 -> STOP condition


위의 4가지 조건이 I2C-BUS의 가장 기본적인 통신 규칙이다.

그렇다면 위의 조건들을 어떻게 사용하길래 단지 2가닥으로 수십개의 장치들이 충돌없이 통신이 가능한걸까?


당연할지도 모르는 소리지만, Condition 3, 즉 START condition을 알리는 신호는 다음과 같은 조건에서만 발생될수 있다.

SDA=high
SCL=high

이 두 조건이 만족하지 않는 다면, START condition은 절대 발생할 수 없다. 당연한 소리지만, SDA와 SCL는 풀업저항에 연결되어 있어, 신호가 없다면 항상 high를 유지한다. 둘 다 high상태라는 것은, I2C-bus를 사용하는 장치가 없다는 소리고, 이것은 I2C-bus를 사용할 수 있는 상태라는 말이다.  




3. Byte Format

Start condition이 발생된 뒤, SDA라인에는 SCL의 clock에 맞추어 데이터가 전송되게 되는데. 이때

Condition 5. Data는 반드시 8-bit이다.
Condition 6. 만약 slave가 Data를 다 전달 받지 못했는데, SCL이 high로 변경되려 하면, slave는 SCL신호를 Low로 잡아둘 수 있다.(풀업저항)



4. Acknowledge


Condition 7. Data전송이 끝나면 Acknowledge를 SCL에 의무적으로 발생시켜야 한다.

이때, Acknowledge는 Master에 의해 발생되고 (당연한 것이지만, SCL에서 clock을 발생시키는 것은 master의 기능이다) 이때, Master는 SDA를 풀어놓고(high출력), SCL에 clock이 발생하여 High상태인 동안에 Slave는 SDA를 Low로 유지시킨다.(pull up 저항의 원리를 생각하라.)


그럼 왜 acknowledge bit를 전달하는가?

이는 내가 사용하고자하는 장치를 선택함과 동시에 데이터 전달이 잘되는지 확인하는데 목적이 있다.


예를 보자. I2C-bus 통신에서는 우선 start condition이 발생하고나서 address값을 SDA에 전송하게 된다.
이때, bus에 연결된 각 장치들은 SDA를 통해 전달받은 address값이 자신이 가진 고유 address값과 다르다면, SDA 출력을 release 즉, 풀어놓는다. 만약 장치중에 하나가 주소값이 일치할 경우 SDA출력을 Low로 hold하여 장치가 선택되었음을 알리게 된다.
 
만약 일치하는 address값이 없어, SDA가 High상태를 유지하게 되면, master는 SDA에 address 전송을 신경쓰지 않고 강제적으로 STOP condition을 발생시키거나, START condition을 발생시킬 수 있다.(SDA는 이미 High상태이므로.) 
 

Not-Acknowledge

데이터가 문제없이 전달된다면 정말 좋겠지만... error를 완전히 없앨수는 없다. 만약 master가 전달하던 data를 slave에서 놓치게 되면, master는 전송하던 데이터를 무시하고, 다시 STOP condition or START condition을 발생시켜야 한다. 이 또한 acknowledge를 통해 알수 있는데, address값이 일치하지 않을 때와 마찬가지로, slave쪽에서 SDA를 High상태로 만들면 된다.
이를 not-acknowledge라고 한다.