[아두이노] [강좌] 29. I2C 통신 (1) - I2C 통신이란 무엇인가

아두이노에 사용되는 센서나 모듈 등을 사용하다 보면의외로 시리얼 통신이나 I2C 통신, SPI 통신을 사용하는 모듈이 많은 것을 알 수 있다센서나 모듈의 값을 직접 쓰거나 읽기보다는 미리 정해둔 명령어를 통해 간단하게 사용할 수 있도록 하기 위해서가 아닌가 하는 생각이 든다개인적인 생각임.

 

아무튼어쩌면 시리얼 통신(정식 명칭으로는 USART 통신)보다 더 많이 사용되는 통신 방식인 I2C에 대해서 알아보자.

 

이번 시간에는 I2C의 정의와 기본 동작 방식에 대해 알아보고 다음 강좌에서 실제로 사용하는 방법을 설명할 예정이다이해를 위한 내용이라기보다 참고를 위한 내용이랄까사용법만 알아도 상관 없지만이왕이면 I2C가 뭔지 알고 지나가는게 좋지 않을까요? (갑자기 존댓말)

 

ㅇㅇㅇ이란 무엇인가라는 질문은 참 중요한 것이니까요.



brown_and_cony-49 

 

 

 

그럼 시작.



I2C(Inter-Integrated Circuit)는 아이--라고 쉽게 읽기도 하지만정식 발음은 아이-스퀘어-(I²C)”이다아두이노의 칩 제조사인 ‘Atmel’에서는 TWI(The Two-Wire Serial Interface)라고도 한다.

 

I2C 통신은 데이터를 주고 받기 위한 선(SDA) 하나와 송수신 타이밍 동기화를 위한 클럭 선(SCL) 하나로 이루어진다하나의 마스터(Master)와 하나 이상의 슬레이브(Slave)로 이루어지며슬레이브는 최대 127개까지 연결할 수 있다이론상으로아무도 127개를 다 연결해 본 사람은 없을걸?

 

다음은 여러 개의 기기가 I2C 통신으로 연결된 모습을 그림으로 나타낸 것이다.


c1b06f398b2dd3ee1198889ecdb9571f.png

(출처 : ATmega2560 Datasheet 중 TWI 부분)



위 그림에서 “Device n”들 중 하나가 마스터 기기가 되고 나머지는 다 슬레이브가 된다유의해야 할 점은 “R1”과 “R2”, 저항이다통신을 위해서는 SDA 선과 SCL 선이 모두 기본 HIGH 상태여야 하기 때문에 풀업 저항으로 HIGH 상태를 만들어주는 것이 중요함물론 친절한 아두이노에서는 내부 풀업 저항을 사용하기 때문에 직접 저항을 달아주거나 설정해 줄 필요는 없다.



* 추가1 : I2C 통신에서 한 라인에 하나 이상의 마스터가 존재할 수도 있다. (아직 그렇게 구성해 본 적은 없지만.) 단, 한 번에 하나의 마스터와 하나의 슬레이브만 통신할 수 있다. 

* 추가2 : 마스터든, 슬레이브든 데이터를 전송하고, 수신하는 동작을 모두 사용하기 때문에 SDA 선은 INPUT과 OUTPUT을 모두 사용하게 되고, 이로 인해 플로팅(Floating) 현상이 발생할 수 있기 때문에 풀업 저항이 필요한 것. 


 

데이터 송수신은 마스터에서 주도하며데이터를 전송하거나 읽어오기 전 반드시 슬레이브의 주소를 명시해준 후 통신을 시작해야 하기 때문에 긴 데이터 통신보다는 짧은 데이터 통신에 주로 사용된다.

 

시리얼(UART) 통신과 비교했을 때 I2C 통신의 장점은 동기화 통신 방식이라는 점이다동기화 통신 방식이란 클럭(Clock) 신호를 이용해서 데이터의 전송 타이밍을 맞추는 방식인데때문에 시리얼 통신처럼 통신 속도가 따로 정해지지 않아도 된다는 장점이 있다.

 

시리얼 통신에도 클럭 라인을 사용하는 USART 통신 방식이 있지만아두이노에서는 사용을 안하므로 패스. USART 통신은 시리얼 통신 강좌에서 잠시 언급했으니, 궁금한 사람은 참고.


 

클럭(Clock)이 뭔지는 이제 설명 안 해도 알겠지클럭 신호에 따라 데이터를 읽거나 쓰게 되므로 시간에 관계없이 데이터를 읽고 쓸 수 있다한 비트 보내는데 1분 걸려도 됨. 1시간 걸려도 됨. (단, 타임 아웃이 걸려있으면 안됨)

 

 

여기까지 정리해보면,

 


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

- 하나의 마스터에 여러 개의 슬레이브 기기가 연결될 수 있다는 장점

- 클럭 신호를 사용하는 동기식 통신 방식이기 때문에 시간에 자유롭다는 장점

- 슬레이브 선택을 위해 항상 주소 데이터가 붙기 때문에 긴 데이터에는 부적합하다는 단점

 

 

 

그럼 이제 실제로 데이터가 어떻게 동작되는지 살펴보자.

 

I2C 통신은 시작 신호와 데이터 신호정지 신호로 이루어진다다음 그림을 보자. 


04218cb01f39be037c5c12d9edb57a43.png

(출처 : 위키피디아 http://en.wikipedia.org/wiki/I%C2%B2C )


SDA SCL 선의 신호는 풀업 저항에 의해 기본적으로 HIGH. 그러다 SDA 신호만 LOW로 떨어지면 시작 신호(S)라고 판단한다그 후에SCL 선으로 클럭 신호가 만들어지는데클럭 신호가 LOW일 때가 SDA 신호를 비트 신호로 바꾸는 시간(파란색 부분), 클럭 신호가 HIGH일 때가 SDA 신호를 읽는 시간이다(녹색 부분). 다시 SCL 신호가 LOW가 되면 다음 비트 신호로 바꾸고다시 HIGH에서 읽고.

 

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

 

시작 신호 뒤에 나오는 첫 7비트는 슬레이브의 주소 값이어야만 하며, 8번째 비트는 데이터를 읽어오기 위한 신호인지쓰기 위한 신호인지를 나타내는 비트로 사용된다.

 

슬레이브의 주소 값과 읽기/쓰기 비트는 마스터에서 생성할 수 있으며, ‘쓰기일 경우에 마스터에서 이후 데이터를 생성, ‘읽기일 경우에는 슬레이브에서 데이터를 생성한다. 8비트 데이터 전송 후에는 슬레이브에서 응답 신호(ACK)를 만들어 수신을 확인해준다.


응답 신호는 기본적으로 LOW여야 하며, 만일 슬레이브가 데이터를 전송하는 상태에서 모든 데이터의 전송이 끝났을 경우에는 HIGH 상태가 된다. 이를 NACK라고 하는데, 이 외의 경우에 NACK가 발생하는 경우는 통신 에러나 데이터 에러의 경우이다.

 

다음은 데이터를 쓸 경우와 읽는 경우의 신호를 그림으로 아주 간단히 나타낸 것이다.


14f72feded555345a91e309f0cbed829.png

3c1a6060faa5b3d56934277f679b0b6c.png    


.. 참 간단하네.. cony_special-34


 

저 신호를 직접 다 만들어야 하는 건 당연히 아니다대부분의 칩에서 I2C 통신은 하드웨어 기능으로 구성되어 있어서 I2C 관련 레지스터의 비트를 설정하는 것 만으로도 시작 신호와 데이터 신호클럭 신호정지 신호를 출력할 수 있다.

 

거기에 한 발자국 더 나아간 아두이노는 “Wire”라는 객체를 제공하는 것으로 I2C 통신을 더더더 쉽게 사용할 수 있도록 하고 있다.

  


다음 강좌에서는 Wire 객체를 사용해서 I2C 통신을 사용하는 방법에 대해 알아보자.



brown_and_cony-80

0
0
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기

임베디드 보드

번호 제목 글쓴이 날짜 조회수
38 아두이노 [강좌] 30. I2C 통신 (2) - Wire 함수 알아보기 icon 양재동메이커 03-20 22,228
37 아두이노 [강좌] 29. I2C 통신 (1) - I2C 통신이란 무엇인가 icon 양재동메이커 03-20 26,641
36 아두이노 [강좌] 28. 시간 관련 함수 (3) - MsTimer2 라이브러리 icon 양재동메이커 03-20 18,261
35 아두이노 [강좌] 27. 시간 관련 함수 (2) - BlinkWithoutDelay 예제 icon 양재동메이커 03-20 12,937
34 아두이노 [강좌] 26. 시간 관련 함수 (1) - delay() / millis() icon 양재동메이커 03-20 18,544
33 아두이노 [강좌] 25. tone()/noTone() 함수 (2) - 부저 실습 icon 양재동메이커 03-20 13,036
32 아두이노 [강좌] 24. tone()/noTone() 함수 (1) - 함수 설명 icon 양재동메이커 03-20 14,587
31 아두이노 [강좌] 23. Interrupt(인터럽트) (3) - 인터럽트 함수 알아보기 icon 양재동메이커 03-20 13,735
30 아두이노 [아두이노 강좌] 22. Interrupt(인터럽트) (2) - 스위치로 LED 켜고 끄기 예제 icon 양재동메이커 03-20 20,951
29 아두이노 [강좌] 21. Interrupt(인터럽트) (1) - 인터럽트란 무엇인가 icon 양재동메이커 03-16 13,289
28 아두이노 [아두이노 강좌] 20. String (3) - 유용한 함수들 icon 양재동메이커 03-16 20,986
27 아두이노 [강좌] 19. String (2) - String() 생성자와 + 연산 icon 양재동메이커 03-16 11,336
26 아두이노 [강좌] 18. String (1) - 문자형(char) 배열과 String icon 양재동메이커 03-16 21,210
25 아두이노 [강좌] 17. Serial 통신(3) - 유용한 기능들 icon 양재동메이커 03-15 15,341
24 아두이노 [강좌] 16. Serial 통신(2) - 시리얼 통신 함수 알아보기 icon 양재동메이커 03-15 19,683
23 아두이노 [강좌] 15. Serial 통신(1) - 시리얼 통신이란 무엇인가 icon 양재동메이커 03-15 18,013
22 아두이노 [강좌] 14. analogRead()/analogWrite() 실습 - 조도 센서 + LED icon 양재동메이커 03-15 11,535
21 아두이노 [강좌] 13. analogWrite() 실습 - LED 밝기 조절하기(Fade 예제) icon 양재동메이커 03-15 11,810
20 아두이노 [강좌] 12. 아날로그 기능(2) - analogWrite() 함수 icon 양재동메이커 03-14 13,193
19 아두이노 [강좌] 11. analogRead() 함수 실습 - 습도 센서 icon 양재동메이커 03-14 11,303