관리 메뉴

거북이처럼 천천히

Verilog RTL 설계(8월 21일 - 1, I2C 통신 - 1) 본문

RTL Design/Verilog RTL 설계

Verilog RTL 설계(8월 21일 - 1, I2C 통신 - 1)

유로 청년 2024. 8. 22. 08:31

1. I2C 통신 이란?

  • I2C 통신은 Inter-Integrated Circuit의 약자로서 다음과 같은 의미를 갖는다.
    ▶ Inter는 I2C 통신이 여러 장치들 사이에서 이루어진다.
    ▶ Integrated Circuit는 하나의 집적 회로 안에 여러 기능이 통합되어 있다는 의미를 갖는다.
    ▶ 따라서 I2C 통신은 여러 개의 집적 회로 장치들 간에 데이터를 상호 교환할 수 있는 통신 프로토콜이다.
  • 이전 게시글에서 다루었던 DHT11은 DHT11 제작사에서 정의한 통신 방법 및 과정에 따라 데이터를 송수신이 가능하다. 이는 DHT11의 고유한 통신 방법이기 때문에 DHT11 외 다른 모듈에서는 적용할 수 없는 통신 방법이다.
  • 반면에 i2c 통신은 표준적인 통신 규약이기 때문에 i2c 통신을 지원하는 모듈에 대해서는 i2c 통신 방법 및 과정에 따른다면 데이터를 주고받을 수 있다.

 

 

2. I2C 통신는 어떻게 통신이 구성되며, 어떻게 사용할 수 있는가?

  • I2C는 1대 다() 통신이 가능하며, Master에서 전달하는 Clock Signal을 기준으로 데이터를 송수신하게 된다.
    (참고로, DHT11은 Low Signal Level을 기준으로 Pulse Wave의 펄스폭에 따라 데이터를 구분하고, 읽는다.)
  • I2C 통신은 아래와 같이 Clock Signal이 High Level일 때에만 딱  한 번 데이터를 읽는다.
  • I2C 통신에서 Clock Signal이 High Level일 때에만 딱 한 번 데이터를 읽기 때문에 
    Clock Signal이 Low Level일 때, 읽기전에 데이터를 수정해야 한다.

 

 

2.1. I2C 통신은 어떤 통신 회로를 갖는가?

  • I2C 통신은 아래와 같은 통신 회로를 일반적으로 갖는다.

일반적인 I2C 통신 회로

  • I2C 통신은 두 개의 신호선(Serial Data 신호선, Serial Clock 신호선)을 갖는다.
    Serial Clock 신호선 (SCL) : 
        역할 : 통신 동기화를 위해 Clcok 신호를 제공
        의미 : 통신의 동기화를 위해 Clock 신호를 제공함으로서 Master와 Slave간에 데이터 송수신 타이밍을 제공
        특징 : Clock Signal은  Master에서 제공하며, Master에서 Clock 신호를 제어한다.
                  SDA (Serial Data) 선은 양방향 단일선이지만, SCL (Serial Clock) 선은 Master에서 Slave로 
                  Clock 신호를 전달하는 단방향 단일선이다.


    Serial Data 신호선 (SDA) :
        역할 :
    Master와 Slave 간에 데이터를 양방향으로 전달하는 신호선
        의미 :
    Master와  Slave 간에 데이터 및 신호를 양방향으로 송수신한다.
        특징 : SLA 신호선은 단방향으로 동작하지만, SDA 신호선은 양방향으로 송수신이 가능하다.
                  SDA 신호선을 통해 데이터 비트, 주소 비트, ACK/NACK 비트 등을 송수신한다.

  • 하나의 SCL 신호선과 하나의 SDA 신호선을 통해  하나의 마스터와 여러개의 Slave, 외부 모듈을 연결할 수 있다.
  • 여러 개의 Slave를 연결 할 수 있기 때문에 Master 측에서 여러 개의 Slave 모듈을 구분하기 위해 Address을 이용하며, 각각의 Slave 모듈은 고유한 Address를 갖는다.

 

 

 

2.2. I2C 통신은 어떻게 사용하며, 어떤 과정을 갖으며 통신이 이루어지는가?

  • I2C 통신은 아래와 같은 과정을 통해 I2C 통신이 이루어지며, I2C 통신을 통해 Master와 Slave 간에 데이터를 Read / Write가 가능하다.

 

  • 위에서 설명했듯이 SCL(Serial Clock) 신호선이 High-Level 일 때, SDA (Serial Data) 신호선으로부터 데이터를 딱 한번 읽는다.
  • 따라서 데이터를 전달하기 위해서는 SCL(Serial Clock) 신호선이 High-Level일 때, SDA (Serial Data) 신호선에서는 Signal Level을 0 or 1로 고정된 상태여야 한다.

    ★★★★★★★★★★★★★★
  • Q) 통신의 시작 (Start)와 끝 (End)은 어떻게 정의하는가?
    A) 
    통신의 시작과 끝은 SCL (Serial Clock) 신호선이 High-Level 일 때, SDA (Serial Data) 신호선의 신호 값이 변화하고 있을 때가 바로 통신의 시작 or 끝이며, 이때, SDA 신호선이 Negative edge를 발생시키면 Start Signal이고, Positive edge를 발생시키면 End Signal이다.

    ▶ SCL (Serial Clock) 신호선이 High-Level 일 때, SDA (Serial Data) 신호 값이 Negative edge이면
                                                                                                   →   I2C 통신의 Start

 

 

 

              ▶ SCL (Serial Clock) 신호선이 Low-Level 일 때, SDA (Serial Data) 신호 값이 Positive edge 이면
                                                                                                →  I2C 통신의 End

 

 

 

 

  • I2C 통신은 Master와 Slave 간에 아래와 같은 과정을 거쳐 데이터를 주고 받게 된다.

    1단계) Master에서 SCL (Serial Clock) 값이 High-Level 일 때, SDA (Serial Data) 값을 High → Low로
               변환시켜 Negative edge 발생시킨다. SCL (Serial Clock) 값이 High-Level 일 때, SDA 값에서 
               Negative edge가 발생하면 해당 신호는 "I2C 통신의 시작점"이 된다.


    2단계) Master가 SDA (Serial Data) 신호선을 통해 타겟으로 잡은 Slave의 주소 (7bit)와 해당 Slave에 
               대해서 Read / Write 할 것인지 정보 (1bit)를 결합하여 보낸다. 


    3단계) Master에서 타겟으로 잡는 Slave에게 { Address + Read / Write 정보 } 를 보내면 해당 Slave는 
               ACK or NACK 신호를 Master에게 보내게 된다.  

     
       ▶ Q) ACK과 NACK은 무엇이며, 어떤 의미를 갖는가?
            A) ACK ( Acknowledgment ) 은 수신자측에서 데이터 전송이 성공적으로 이루어 졌음을 송신자에게 
                알려주는 신호이다. 따라서 ACK 신호를 통해 송신자는 제대로 데이터가 전송되었음을 확인하고, 
                다음 데이터를 전송할 수 있게 된다.

                NACK ( Negative Acknowledgment ) 은 수신자측에서 데이터 전송이 실패했음을 송신자에게 알
                려주는 신호이며, 데이터를 일부 손실하거나 오류가 발생하여 수신자측에서 데이터가 못 받았을 때,
                해당 신호가 송신자에게 전달 된다.


                 Master는 Slave 모듈에세 신호를 제대로 받았는지 여부를 ACK 과 NACK을 통해 판단하며, ACK 
                 신호를 받으면 "slave 측에서 response signal을 제대로 보냈구나." 라고 판단하여 다음 데이터를
                 보내며,  NACK 신호를 받으면 "slave 측에서 예기치 못한 원인으로 데이터를 못 받았구나." 라고 
                 판단하여 그에 대한 후처리를 진행한다.


        4단계) Write일 경우,  Master에서 Slave 모듈측으로 8bit 데이터를 전송하게 되며,
                   Read일 경우, Slave에서 Master 측으로 8bit 데이터를 전송하게 된다.


       5단계) 다시 한번 Slave 측에서 데이터가 송수신이 제대로 이루어졌는지 여부를 나타내는 Response
                  signal인 ACK or NACK 을 Master에게 전달한다.


       6단계) I2C 통신의 끝 (End)하기 위해 Master 측에서 SDA 신호선을 0으로 떨어뜨려 준 뒤, 
                  SCL 신호선이 High-Level 일때, Positive edge를 발생시켜 통신을 끝내게 된다.