본문 바로가기
전자공학/LoRa 통신

I2C 통신에 대한 깔끔한 설명 - 원리부터 응용까지 (with 온도센서)-4

by ohj921189 2020. 3. 19.
반응형

 

   목차

 

1. I2C 통신이란?

  - I2C 통신이란?

  - I2C 통신의 특징

 

2. 왜 I2C 통신을 사용하는 가?

   - I2C통신과 SPI 통신,UART 통신과의 비교

 

3. I2C 통신을 위해 필요한 조건

  - I2C 통신을 위해 하드웨어적으로 필요한 것

 

4. I2C 통신의 원리

  - 데이터 전송을 위한 네개의 구간

  - Master와 Slave 사이의 통신

 

5. 온도센서에서의 I2C 통신 원리 - 응용

 

 

 

5. 온도센서에서의 I2C 통신 원리 - 응용

 

이때까지 온도 센서에서의 I2C 통신 원리에 대해 알아보았습니다. 그럼 과연 실제로 온도 센서가 작동할 때 마스터가 슬레이브에게 내리는 커맨드는 구체적으로 어떤 것인지 알아보도록 하겠습니다.

 

위는 마이크로프로세서가 온도 센서를 찾을 때의 함수입니다. 마스터가 통신할 슬레이브 주소를 보내고 Write 명령을 보냅니다. 그리고 그 슬레이브에게 0xFC 명령어와 0xC9 명령어를 보내는 것을 알 수 있습니다. 이 명령어가 무엇인기 알아보았습니다. 

 

위의 테이블에서 보니 Electronic ID의 두 번째 바이트를 읽어오는 명령어라는 것을 알 수 있습니다. 그럼 여기서 Electronic ID란 무엇인가 찾아보았습니다. I2C는 Address 방식으로 디바이스 간 통신을 하는 데 여기서 Address는 디바이스의 고유 번호를 의미합니다. 따라서 Electronic ID의 두 번째 바이트를 읽어오는 명령어는 내가 통신하고자 하는 슬레이브를 찾는 과정입니다. 

 

0xFC, 0xC9 명령어를 사용하려면 electronic ID(Slave 장치의 고유번호) 읽어올 때 체크섬 바이트가 필요로 합니다. 또한 슬레이브에서 체크섬 바이트를 반환하여 전송 오류를 점검할 수 있습니다. 마스터가 승인한 경우 체크섬 바이트는 최하위비트(LSB)를 따르게 됩니다. 마스터가 최하위비트(LSB)를 "NACK" 한 경우 체크섬 바이트는 반환되지 않습니다. 체크섬 바이트는 0x00의 초기화로 x8 + x5 + x4 + 1CRC 발생기 다항식을 사용하여 계산합니다.

 

그다음으로 온도 센서가 측정을 시작할 때의 함수입니다. 커맨드로 0xE5를 쓰는 것을 알 수 있었습니다.

 

0xE5는 상대습도를 측정하는 명령어이며, Hold Master Mode를 지원한다는 것을 알 수 있습니다. 그럼 여기서 Hold Master Mode가 무엇인가? 

 

Slave 가 데이터를 받을 준비가 안되었을 경우, slave 장치는 SCL 선의 상태를 low로 내려서 master 장치에게 데이터 전송을 미뤄달라는 요청을 할 수 있습니다. 이렇게 되면 master 장치는 slave 장치가 SCL 선의 상태를 high로 올리기 전까지 SCL 선으로 클럭신호를 발생시키지 않게 됩니다. 이것을 Hold Master Mode(clock stretching)이라고 부릅니다.

 

레지스터를 보면 Master가 Slave 주소를 보내고 Measure 명령어를 보낸 뒤에 Sr(재시작)을 하여 slave 주소를 보내고 slave는 clock stretching을 사용하여 master에게 데이터를 보냅니다.

 

또한 MS ByteLS Bytechecksum을 만들어 Master에게 보냅니다.

 

상대습도를 측정하고 나면 온도센서는 0xE0 명령을 수행합니다. 이 명령어는 무슨 역할을 하는 것일까요.

 

이전의 RH Measurement를 이용하여 온도 값을 읽어오는 명령어입니다. 

 

상대습도 측정이 이루어질 때마다 상대습도 측정에 대한 온도 보정을 목적으로 온도 측정이 이루어지게 됩니다. 온도 값이 필요할 경우 0xE0 명령을 사용하여 판독할 수 있으므로 두 번 온도 측정을 수행할 필요가 없습니다. 측정 온도 명령 0xE3 0xF3은 온도 측정을 수행하고 측정값을 반환하며 명령 0xE0은 측정을 수행하지 않고 상대 습도 측정 중에 측정한 온도 값을 반환합니. 0xE0 명령에서는 체크섬 출력을 사용할 수 없습니다.

 

레지스터를 보면 슬레이브 주소를 보내고 명령어로 0xE0을 슬레이브에게 Write 한 뒤에 Sr(재시작)을 하여 이전에 상대습도 측정 명령어를 통해 측정하였던 온도 값을 받아 온다는 것을 알 수 있습니다. 

반응형

댓글