임베디드 기초 9주차

2021. 11. 8. 02:12·학교수업
반응형

I(2)C 통신

- 대부분 MCU 들이 외부 모듈과 통신할 수 있도록 표준화된 디지털 통신 프로토콜

- 버스는 최소한의 입출력 핀만 사용하여 장치 간 양방향 통신 제공

- 버스는 

1. 정보를 보내는 마스터(Master) 장치 1개

2. 정보를 받는 슬레이브(Slave) 장치 여러 개로 구성

- 보통 MCU가 마스터 역할하고 슬레이브들의 동작을 제어

- 통신은 느린 속도의 간단한 주변 장치와의 통신에 적합

- 통신의 최대 속도는 평균 수백(100~400)KHz로 낮은 속도에 해당

 

I(2)C 통신 역사

- 1980 초반 필립스에서 개발

- 1990 표준화 많은 회사에서 호환 칩 생상

- 통신은 CLOCK과 DATA 회선 두개로 통신하기 때문에 두 가닥(two-wire) 프로토콜이라고 불림.

- 통신이라는 이름을 사용하지 않더라도 두 개의 선에 의한 프로토콜을 사용하는 장치는 I(2)C 통신 표준 지원

 

I(2)C 장치 간 연결 방법

- 통신 시스템은 여러 장치가 동일한 통신 회선 공유

1. CLOCK신호(SCL) : 전송을 개시하는 클럭 펄스가 생성되는 회선 (pull-up 사용)

2. DATA 신호 (SDA) : 마스터와 슬레이브 장치 간 전송되는 양방향 데이터 회선 (pull-up 사용)

데이터 전송을 안할 때 -> float 현상 발생 -> 전압을 걸어 pull-up 저항을 건다.(1~10k옴 사이)

 

I(2)C 장치 간 통신 주소 설정

- 버스는 하나의 마스터 장치와 다수의 슬레이브 장치가 통신 회선 공유

- MCU인 아두이노가 마스터 장치 역할

- 마스터 장치만이 통신을 초기화 가능, 슬레이브 장치는 마스터 장치의 요청에 응답만 가능

- 각 주변 장치는 7비트 고유한 통신 주소를 갖음

-> 버스에 연결된 모든 장치가 동일한 메세지를 전달 받아 고유 주소가 중복되면 안된다.

- 마스터 장치는 통신 초기화 후, 장치 ID, 데이터 전송, 슬레이브 장치는 자신의 ID가 호출되면 요청 받은 데이터 전송

- 대부분 I(2)C는 사전에 프로그램된 다양한 I(2)C 주소가 지정

 

I(2)C 통신 절차 (protocol)

1. 마스터에서 시작 비트(Start)를 전송

2. 마스터에서 통신하려는 슬레이브 장치의 7비트 주소를 보낸다.

3. I(2)C장치에서 레지스터에 데이터를 쏠지 읽어올지에 따라, 마스터에서 쓰기명령(O)또는 읽기명렬(1)을 보낸다.

4. 슬레이브에서 acknowledge 또는 ACK(LOW신호)로 응답

5. 마스터는 I(2)C 장치의 레지스터를 읽어 오겠다는 1바이트 명령을 쓰기 모드로 전송하고,

슬레이브에서는 ACK 비트로 응답

6. 마스터는 I(2)C 기기에서 전송되는 1바이트 정보를 읽기 모드에서 수신.

1바이트를 읽고 나면 슬레이브에 ACK 비트 전송

7. 마스터에서 STOP비트를전송하여 마스터와  슬레이브 기기 간 통신 완료

- I(2)C 장치 사양에 따라 통신 절차가 조금씩 다르다.

- 아두이노에는 I(2)C 라이브러리 Wire가 내장되어 있어 어려운 타이밍 작업 처리

 

TC74 - 디지털 온도 센서(외부온도를 섭씨온도 값으로 전송(다른 아날로그 센서는 온도값을 0~1023로 변환해서 보냄)

다리 1 : NC - 사용 X

다리 2 : SDA - 데이터 (풀업) A4핀에 연결

다리 3 : GND

다리 4 : SCLK - 클럭 (풀업) A5핀에 연결

다리 5 : VCC - 전원

아두이노 A4,5에는 2가지 기능이 다중화 되어 있다.(하나를 쓰면 하나를 못씀)

1. 아두이노 I(2)C 인터페이스

2. 내장 ADC

 

I(2)C 온도센서 TC74센서에서 온도를 읽는 절차(Read Byte Format)

1. MCU는 TC74 주소를 전송하여 통신하고자 지정

2. MCU는 쓰기 모드에서 명령값 0(Read Temperature Register:RTR)을 전송

3. MCU는 TC74 주소를 다시 전송 TC74가 읽을 대상임을 다시 알려줌

4. MCU는 기다렸다 TC74가 보낸 8비트 온도 데이터를 읽음

 

I(2)C 라이브러리 삽입

#include <Wire.h>

 

I(2)센서 ID를 10진수로 저장한 변수 선언

int temp_address=72; // A0 : 1001000 = 72

 

setup()에 Wire.begin() 사용 (I(2)C Wire 객체 시작)

 

loop()에

1. Wire.beginTransmission(temp_addreess); // I(2)C 센서의 주소와 통신을 개시하는 요청 전송

2. Wire.write(0); // 온도 레지스터를 읽겠다는 명령(0)을 쓰기모드에서 전송

3. Wire.endTransmission(); // 전송 완료(0값 전송 종료)

4. Wire.requestFrom(temp_address,1); // 지정 주소 I(2)센서(온도 센서)에서 읽기 모드로 1바이트 온도값 읽음

5. while(Wire.available()==0); // 응답이 올 때까지 대기

6. int c = Wire.read(); // 온도 레지스터 값을 읽어와 변수에 저장

- int f=round(c*9.0/5.0 +32.0); // 섭씨->화씨 변환

반응형
저작자표시 (새창열림)

'학교수업' 카테고리의 다른 글

가상현실프로그래밍 9주차  (0) 2021.11.12
정보보호개론 9주차  (1) 2021.11.09
사물인터넷의 이해 9주차  (0) 2021.11.07
웹개발 기초 10주차  (0) 2021.11.05
객체지향프로그래밍 9주차  (1) 2021.11.03
'학교수업' 카테고리의 다른 글
  • 가상현실프로그래밍 9주차
  • 정보보호개론 9주차
  • 사물인터넷의 이해 9주차
  • 웹개발 기초 10주차
숯불돼지왕갈비
숯불돼지왕갈비
  • 숯불돼지왕갈비
    게임 개발 공부기
    숯불돼지왕갈비
  • 전체
    오늘
    어제
    • 분류 전체보기 (302)
      • 학교수업 (165)
      • 취업강의 (6)
      • C++ (49)
        • 코딩 테스트 (4)
      • Unreal Engine 5 (25)
        • MMORPG 개발 (25)
      • Unreal Engine 4 (44)
        • Omak Project (3)
        • Unreal Engine 4 개발일지 (9)
        • Unreal Engine 4 (32)
      • Unity (1)
        • 개발 일지 (1)
      • 수학 (3)
        • 소프트웨어 공학용 수학 (3)
      • DirectX 11 (4)
      • 게임 디자인 패턴 (2)
      • 포트폴리오 (1)
      • 자격증 (1)
        • 정보처리기사 (0)
        • SQLD (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
숯불돼지왕갈비
임베디드 기초 9주차
상단으로

티스토리툴바