이 블로그는 임베디드 컴퓨터를 이용한 장치(시스템) 개발과 원격제어에 필요한 지식을 공유 하기 위한 블로그 입니다.
실제 개발과 프로그램 예를 위하여 Microchip 사의 ATmega128를 사용한 보드와 Arduino Mega 보드(ATmega2560), Raspberry Pi, Raspberry Pi Pico, WiFi 모듈을 사용 합니다.

twi-i2c-comm

Two-wire Serial Interface
Two-wire Serial Interface(TWI) - I2C


  • ATmega128 Two-wire Serial Interface 개요
    • 2개의 Bus lines 만 사용하는 효율적이고 유연한 통신 인터페이스인 TWI(Two-wire Serial Interface)는 Atmel 회사에서 사용하는 명칭이다. I2C(Inter Integrated Cricuit)는 다른 회사에서 상표문제를 피하기 위하여 도입한 명칭이기 때문에 TWI와 I2C는 동일한 통신 인터페이스 이다.
    • Master 와 Slave Operation 이 지원 된다.
    • Device는 Transmitter 또는 Receiver로 동작 할 수 있다.
    • 7-bit Address Space는 최대 128 개의 Slave Addresses를 사용 할 수 있게 한다.
    • Multi-master Arbitration(여러개의 Master Device를 사용 할 수 있다)이 지원 된다.
    • 최대 400kHz 데이터 전송 속도를 갖는다.

  • TWI 통신 시스템의 구성(연결)
    • TWI는 Microcontroller를 이용하여 비교적 가까운 거리(별도의 회로를 사용하지 않는 경우 보통 4m 이내. Rp 값과 전선의 상태에 따라 영향을 받는다.)에 있는 여러개의 Device를 제어하는 시스탬 구성에 적합하다.

      TWI 통신 시스템 구성 예


  • Data Transfer 와 Frame Format
    • Bits 전송 하기
      • 각각의 Data bit는 SCL Line의 Clock pulse에 동기되어 전달 된다. Data line의 Level은 Data 전송 시(Start 와 Stop 신호을 발생 시키는 경우는 제외) Clock line이 High 인 동안 안정되어(High 또는 Low인 상태를 유지) 있어야 한다.

        Data가 유효한 시간(조건)

    • START 와 STOP 신호(동작)
      • START 와 REPEATED START, STOP 신호

      • Master는 데이터 전송을 시작하고 종료 한다.
      • Master가 Bus에 START 신호을 발생하면 전송이 시작되고, Master가 Stop 신호을 발행하면 전송이 종료 된다. START와 STOP 신호 사이에서 Bus는 사용 중(Busy)으로 간주 된다.
      • Bus가 Busy 상태인 경우 다른 Master는 Bus를 사용 할 수 없다.
      • 특별한 경우 Start와 Stop 사이에 새로운 Start 신호(REPEATED START: 앞 Data의 전송이 끝나자 마자 바로 Start 신호가 발생)이 발생 할 수 있다.
      • 이 경우 Master는 바로 새로운 전송을 계속 할 수 있다.
    • Address Packet Format
      • Address Packet Format

      • 모든 Address Packet은 9 Bits(7 bits의 Address, 1 Bit의 READ/WRITE 신호, 1Bit Acknowledge 신호)로 전송 된다.
      • READ/WRITE 신호가 Set(High)인 경우 Read 동작이 실행되고,
      • READ/WRITE 신호가 Clear(Low)인 경우 Write 동작이 실행 된다.
      • 만약 Address가 일치하는 Slave 장치가 있으면 이 장치(Slave)로 부터 9 번째 SCL 신호 주기(ACK 주기)에 Acknowledge 신호(Low)가 SDA Bus에 인가 된다.
      • 만약 무슨 이유로 선택된 Slave 장치가 Address 신호를 받지 못하면 ACK 주기(9 번째 SCL 신호)에 SDA Bus는 High 상태가 된다.
      • ACK 주기에 SDA Bus가 High 상태 경우 Master는 Stop 신호를 전송 하거나, REPEATED START 신호를 전송하여 다시 전송을 시작 할 수 있다.
      • Address Packet은 Slave address와 READ 신호(SLA+R) 또는 Slave address와 WRITE 신호(SLA+W)로 구성 된다.
      • Address 값이 0000 000 인 경우는 특별히 General call(Master Device가 동일한 메세지를 여러 Slave Device에 전송 하는 경우 사용. 이 경우 General call이 허용된 Slave Device는 모두 동일한 메세지를 수신 할 수 있다.)로 사용 된다. General call은 Write 동작만 의미를 갖는다.
      • 1111 xxx 번지는 미래 다른 기능을 부여 할 수 있도록 사용이 유보된 번지 이다.
    • Data Packet Format
      • Data Packet Format

      • 모든 Data Packet은 9 Bits(8 bits Data, 1Bit Acknowledge 신호)로 전송 된다.
      • Data가 전송되는 동안 Master는 Clock 신호와 START, STOP 신호를 발생(전송) 시킨다.
      • Slave는 ACK 주기(9번째 SCL 주기)에 Acknowledge 신호(Low)를 SDA Bus에 발생 시킨다.
      • Acknowledge 신호가 High인 경우 NACK(Not acknowledge) 신호라고 한다. 이 신호는 Read 동작의 마지막 Byte를 표시하기 위하여 사용 된다.
    • Address 와 Data Packets을 결합한 전송 Format
      • Typical Data Transmission

      • Data 전송은 기본적으로 START 신호와 SLA+R/W 신호(Slave 주소와 READ/WRITE 신호)와 하나 이상의 Data Packets 과 STOP 신호로 이루어 진다.
      • SLA+R/W 신호와 STOP 신호 사이에 응용 프로그램의 Software Protocol에 따라 1 Byte 이상의 Data가 전송될 수 있다.
      • SCL 선에 각 장치가 Wired-ANDing(연결된 장치 중 하나가 LOW를 출력하면 이 선의 상태는 LOW 가 된다.)로 연결되어 있기 때문에 Slave 장치가 SCL 선의 LOW 주기을 연장하면 Master는 이 상태 동안 전송을 멈추게 된다. 이 기능을 이용하여 Slave 장치가 실행하여야 하는 프로그램이 SCL 신호의 한 주기 동안에 처리 할 수 없는 경우 Master와 동기를 위하여 이 기술을 사용 할 수 있다.

  • TWI 통신과 전송 Modes
    • TWI Bit Rate
      • Master mode로 동작 할때 Master는 SCL 신호를 SCL Bus에 출력 한다.
      • SCL 신호의 주기는 TWBR(TWI Bit Rate Register) Rg와 TWSR(TWI Status Register) Rg의 Prescaler bits의 설정(Setting)에 따라 결정 된다.
      • Slave device의 CPU Clock 주파수는 SCL 주파수 보다 16배 이상 빨라야 한다.
      • SCL 주파수를 결정하는 식은 아래와 같다.

        • TWBR = Value of the TWI Bit Rate Register
        • TWPS = Value of the prescaler bits in the TWI Status Register
        • Pull-up 저항 값(1K - 4.7K)은 SCL 주파수와 Bus line load의 Capacitive에 의하여 결정된다.
    • TWI Transmission operation의 이해
      • AVR TWI의 전송제어는 Interrupt를 사용하는 것을 기본으로 한다.
        • Interrupt 방식을 사용하는 것을 기본으로 하기 때문에 모든 Bus event(START, Data 전송과 수신 등) 다음에는 Interrupt 가 발생 한다.
        • Interrupt 방식을 사용하면 TWI가 Data를 전송하는 동안(TWI SCL 주파수는 보통 100KHz를 사용하고, 1 Byte의 Data를 전송하기 위하여는 9개의 Clock을 필요로함.) 프로세서는 다른 일을 계속 할 수 있기 때문이다.
        • AVR TWI에서 Interrupt를 사용하기 위하여는 TWCR RG의 TWIE(TWI Interrupt Enable) Bit와 SREG Rg의 Global Interrupt Enable bit를 Set 하여야 한다.
        • Interrupt 방식을 사용하지 않는 경우에는 프로그램에서 TWCR(TWI Control Register) Rg에 있는 TWINT flag의 상태를 계속 테스트하여 이 Flag의 상태에 따라 적절한 동작을 하도록 하여야 한다.
        • 한 동작이 완료되고 TWINT flag가 Set되면 TWSR(TWI Status Register) Rg에 TWI Bus의 현재 상태가 저장 되기 때문에 응용 프로그램에서는 TWSR Rg의 내용에 따라 다음 동작을 결정 한다.
      • Data 전송은 Byte 단위로 한다. 필요할 경우 Byta 단위 Data를 여러번 반복하여 전송 할 수 있다.
      • Data 전송 시 TWI와 전송(제어) 프로그램 사이의 Interfaceing 예
        • 아래 그림은 Master에서 Slave에 1 Byte Data을 전송하는 경우 전송 프로그램과 TWI Hardware 사이의 Interfacing(전송 프로그램에서 TWI를 제어하는 명령(프로그램)과 이 명령에 대응하여 TWI에서 발생하는 신호 사이의 관계를 표시) 예 이다.

        • 윗 그림에서 1번은 START 신호가 TWI Bus에 출력 되어 TWI에서 전송이 시작되는 것을 표시 한다. START 신호는 전송 프로그램에서 TWI의 TWCR Rg에 Start 명령 코드를 Write 하면 출력 된다.
          • START 신호를 TWI Bus에 출력하는 C Coding 예는 아래와 같다.
          • TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);

        • 2번: START 신호가 TWI Bus에 출력(전송)되면 TWCR Rg의 TWINT flag가 Set되고, TWSR Rg의 내용이 START 신호가 성공적으로 갱신되었음을 표시하는 Status code로 갱신 된다.
          • START 신호가 전송된 것을 확인 하는 C Coding 예는 아래와 같다.
          • while (!(TWCR & (1 << TWINT)));

        • 3번: 전송 프로그램에서 TWINT flag Set 상태를 확인 하여 TWINT flag Set 된 경우 TWSR Rg의 Status code를 확인 확인 한다. TWSR Rg의 Status code를 확인 결과 START 신호가 정상으로 보내진 경우 SLA+W 값을 TWDR Rg에 Load 하고, TWCR Rg의 TWINT에 1(TWINT flag를 Clear 하여야 Master에서 SLA+W 값의 송신을 시작 함)을 TWSTA에 0(Master에서 SLA+W를 전송하면 Slave에서 ACK 신호를 보내기 때문에 Master에서는 ACK 신호를 발생 하지 않아야 함)를 Write 한다.
          • START 신호가 정상으로 전송된 것을 확인 하고, SLA+W 값을 TWDR Rg에 Load 하고, TWCR Rg의 TWINT에 1을 TWSTA에 0를 Write 하는 C Coding 예는 아래와 같다.
          • if ((TWSR & 0xF8) != START)ERROR();

            TWDR = SLA_W;

            TWCR = (1 << TWINT) | (1 << TWEN);

        • 4번: Slave에서 SLA+W를 정상으로 수신하면 ACK 신호를 Master에 전송 한다. 이 ACK 신호를 Master가 수신하면 TWINT flag Set가 Set 되고 TWSR Rg의 Status code가 갱신(SLA+W가 정상으로 송신된 상태를 표시) 된다.
          • SLA+W가 정상으로 송신 전송되고, ACK 신호가 수신된 것을 확인 하는 C Coding 예는 아래와 같다.
          • while (!(TWCR & (1 << TWINT));

            if((TWSR & 0xF8) != MT_SLA_ACK) ERROR();

        • 5번: TWSR Rg의 Status code에서 SLA+W가 정상으로 송신되었음을 확인 한 다음, 전송 프로그램은 전송할 Data를 TWDR Rg에 Load 하고 TWCR Rg의 TWINT에 1(TWINT flag를 Clear)을 TWSTA에 0(Master에서 ACK 신호를 발생 시키지 않는 경우)를 Write 한다.
          • Data를 TWDR Rg에 Load하고, TWCR Rg의 TWINT에 1을 TWSTA에 0를 Write 하는 C Coding 예는 아래와 같다.
          • TWDR = DATA;

            TWCR = (1 << TWINT) | (1 << TWEN);

        • 6번: Slave에서 Data를 정상으로 수신하면 ACK 신호를 Master에 전송 한다. 이 ACK 신호를 Master가 수신하면 TWINT flag Set가 Set 되고 TWSR Rg의 Status code가 갱신(Data가 정상으로 송신된 상태를 표시) 된다.
          • Data가 정상으로 송신 전송되고, ACK 신호가 수신된 것을 확인 하는 C Coding 예는 아래와 같다.
          • while (!(TWCR & (1 << TWINT)));

            if ((TWSR & 0xF8) != MT_DATA_ACK) ERROR();

        • 7번: TWSR Rg의 Status code에서 Data가 정상으로 송신되었음을 확인 한 다음, 전송 프로그램에서 TWCR Rg에 STOP 신호와 TWINT Clear 신호를 Write 한다.
          • STOP 신호를 전송하는 C Coding 예는 아래와 같다.
          • TWCR = (1 << TWINT)|(1 << TWEN)| (1 << TWSTO);

    • TWI Transmission Modes
      • TWI는 Master Transmitter(MT), Master Receiver(MR), Slave Transmitter(ST), Slave Receiver (SR) 4개 종류 Mode 중 한 Mode로 동작 한다. 데이터 전송을 위한 동작(예: Slave로 부터 한 Byte Data를 읽는 경우 Master로 부터 Slave에 정보를 보내는 동작(MT)과 Slave로 부터 Data를 읽는 동작(MR)이 연속하여 실행 된다.)에 하나 이상의 모드가 연속하여 사용 될 수 있다.

      • Transmission Modes를 설명하기 위하여 아래와 같은 약어를 사용 한다.
        • S: START condition
        • Rs: REPEATED START condition
        • R: Read bit (high level at SDA)
        • W: Write bit (low level at SDA)
        • A: Acknowledge bit (low level at SDA)
        • ~A: Not acknowledge bit (high level at SDA)
        • Data: 8-bit data byte
        • P: STOP condition
        • SLA: Slave Address
        • Transmission Modes의 Formats 과 States 설명에 사용하는 Circles는 TWINT Flag가 Set 된 상태인 것을 표시하고, Circle 내의 번호는 TWSR Rg에 갱신된 Status code(Prescaler bits가 zero로 설정된 경우) 이다. Status code(각 Mode 별로 Status code를 설명하는 Table을 첨부 함)는 전송 프로그램에서 다음 동작을 실행하든데 필요한 중요한 정보 이다.

          TWINT Flag가 Set된 상태에서는 TWI 동작(Transfer 동작)이 중단 된다. TWI 동작을 계속하기 위하여는 전송 프로그램에서 TWINT Flag를 Clear 하여야 한다.

    • Master Transmitter Mode
      • Master Transmitter Mode는 Master에서 Slave로 Data bytes를 전송하는 Mode 이다.

        주: Register(TWBR, TWCR, TWSR, TWDR, TWAR)에 대한 설명은 "Register 설명"을 참고하기 바람.

        Start 신호가 전송된 다음 SLA+W 신호가 전송되면 Master Transmitter가 시작되고, Start 신호가 전송된 다음 SLA+R 신호가 전송되면 Master Receiver가 시작된다.

        Master Transmitter Mode의 Formats 과 States, Status Codes는 아래 Table과 그래프를 참고 하기 바람. 아래 Table의 Status Codes는 Prescaler bits가 zero 인 경우임.

      • START 신호는 TWCR Rg에 아래와 같은 값을 Write 하는 것에 의하여 전송 된다.
      • TWCR:     TWINT   TWEA   TWSTA   TWSTO   TWWC   TWEN      –      TWIE 
        Value:   1 X 1 0 X 1 0 X

        • 하늘색 Box 내의 상태와 같이 Bits를 설정 하여야 한다.
        • 위와 같이 설정하기 위한 C Coding은 아래와 같다.

          TWCR = (1 << TWINT) | (1 << TWSTA) | (0 << TWSTO) | (1 << TWEN);

        • 주: 위 프로그램에서 TWSTO Bit를 0으로 설정하는 (0 << TWSTO) Code는 생략하여도 동일한 결과를 얻는다. 여기서 이 Code를 포함한 이유는 이 Bit가 0으로 설정되어야 하는 것을 강조하기 위함 이다.

      • 위와 같은 프로그램이 실행되면 TWI는 Two-wire Serial Bus의 상태를 Test 하고 만약 Bus가 Free 상태이면 바로 START 신호를 전송 한다.
      • START 신호가 전송되면 Hardware에 의하여 TWINT flag가 Set 되고, TWSR Rg는 $08 값을 갖게 된다.
      • TWSR Rg의 값이 $08 인 것을 프로그램으로 확인 하고, TWDR Rg에 SLA+W를 Write 한 다음 TWCR Rg에 아래와 같은 값을 Write하면 SLA+W 이 전송되고 Master는 MT mode 가 된다. TWINT bit 가 Clear(TWINT bit에 1을 Write 하면 TWINT bit가 Clear 됨) 되어야 전송이 계속 된다.
      • TWCR:     TWINT   TWEA   TWSTA   TWSTO   TWWC   TWEN      –      TWIE 
        Value:   1 X 0 0 X 1 0 X

        • 위와 같이 설정하기 위한 C Coding은 아래와 같다.

          TWCR = (1 << TWINT) | (0 << TWSTA) | (0 << TWSTO) | (1 << TWEN);

      • SLA+W 신호가 전송되고 Acknowledgment bit 가 수신되면 다시 TWINT bit 가 Set되고 TWSR Rg의 status codes 가 갱신 된다.
      • 이 때 Master mode에서 가능한 status codes 값은 $18, $20, $38 이다. Status codes 값에 대한 설명은 아래 Table을 참고 바람.
      • SLA+W 신호가 성공적(프로그램으로 Status codes 값을 Test 함)으로 전송되면 TWDR Rg에 Data를 Write(TWINT Bit가 High 인 상태에서 Write 하여야 함) 하고, 아래와 같은 값을 TWCR Rg에 Write(TWINT bit를 Clear) 하면 Data 가 전송 된다.
      • TWCR:     TWINT   TWEA   TWSTA   TWSTO   TWWC   TWEN      –      TWIE 
        Value:   1 X 0 0 X 1 0 X

        • 위와 같이 설정하기 위한 C Coding은 아래와 같다.

          TWCR = (1 << TWINT) | (0 << TWSTA) | (0 << TWSTO) | (1 << TWEN);

      • 마지막 Byte를 전송 할때까지 Data 전송 과정을 반복 하고, STOP 신호 또는 REPEATED START 신호를 TWCR Rg에 Write 한다.
      • STOP 신호는 아래와 같은 값을 TWCR Rg에 Write 하면 전송 된다.
      • TWCR:     TWINT   TWEA   TWSTA   TWSTO   TWWC   TWEN      –      TWIE 
        Value:   1 X 0 1 X 1 0 X

        • 위와 같이 설정하기 위한 C Coding은 아래와 같다.

          TWCR = (1 << TWINT) | (0 << TWSTA) | (1 << TWSTO) | (1 << TWEN);

      • REPEATED START 신호는 아래와 같은 값을 TWCR Rg에 Write 하면 전송 된다.
      • TWCR:     TWINT   TWEA   TWSTA   TWSTO   TWWC   TWEN      –      TWIE 
        Value:   1 X 1 0 X 1 0 X

        • 위와 같이 설정하기 위한 C Coding은 아래와 같다.

          TWCR = (1 << TWINT) | (1 << TWSTA) | (0 << TWSTO) | (1 << TWEN);

        • REPEATED START 신호($10)는 동일한 Slave에 다시 전송 하는 경우 또는, STOP 신호를 전송하지 않고 새로운 Slave에 전송하는 경우에 사용 한다.

        Master Transmitter Mode의 Status Codes

        Master Transmitter Mode의 Formats 과 States

    • Master Receiver Mode
      • Master Receiver Mode는 Slave로 부터 Master가 Data bytes를 수신하는 Mode 이다.

        Start 신호가 전송된 다음 SLA+R 신호가 전송되면 Master Receiver가 시작된다.

        Master Receiver Mode의 Formats 과 States, Status Codes는 아래 Table과 그래프를 참고 하기 바람. 아래 Table의 Status Codes는 Prescaler bits가 zero 인 경우임.

      • START 신호는 TWCR Rg에 아래와 같은 값을 Write 하는 것에 의하여 전송 된다.
      • TWCR:     TWINT   TWEA   TWSTA   TWSTO   TWWC   TWEN      –      TWIE 
        Value:   1 X 1 0 X 1 0 X

        • 하늘색 Box 내의 상태와 같이 Bits를 설정 하여야 한다.
        • 위와 같이 설정하기 위한 C Coding은 아래와 같다.

          TWCR = (1 << TWINT) | (1 << TWSTA) | (0 << TWSTO) | (1 << TWEN);

      • 위와 같은 프로그램이 실행되면 TWI는 Two-wire Serial Bus의 상태를 Test 하고 만약 Bus가 Free 상태이면 바로 START 신호를 전송 한다.
      • START 신호가 전송되면 Hardware에 의하여 TWINT flag가 Set 되고, TWSR Rg는 $08 값을 갖게 된다.
      • TWSR Rg의 값이 $08 인 것을 프로그램으로 확인 하고, TWDR Rg에 SLA+R를 Write 한 다음 아래와 같은 프로그램으로 TWCR Rg에 제어 값을 Write하면 SLA+R 이 전송되고 Master는 MR mode 가 된다. TWINT bit 가 Clear(TWINT bit에 1을 Write 하면 TWINT bit가 Clear 됨) 되어야 전송이 계속 된다.
        • TWCR = (1 << TWINT) | (0 << TWSTA) | (0 << TWSTO) | (1 << TWEN);

      • SLA+R 신호가 전송되고 Acknowledgment bit 가 수신되면 다시 TWINT bit 가 Set되고 TWSR Rg의 status codes 가 갱신 된다.
      • 이 때 Master mode에서 가능한 status codes 값은 $38, $40, $48 이다. Status codes 값에 대한 설명은 아래 Table을 참고 바람.
      • SLA+R 신호가 성공적(프로그램으로 Status codes 값을 Test 함)으로 전송되면 수신된 Data를 TWDR Rg로 부터 Read(TWINT Bit가 High 인 상태에서 Read 하여야 함) 한다.
      • 이와 같은 과정은 마지막 Byte를 수신 할때까지 반복 된다. Slave 가 마지막 Byte를 송신한 다음 NACK 신호를 송신 한다. Master는 이 NACK 신호를 받으면 Data 수신이 종료된 것으로 판단하고,
      • Master는 STOP 신호 또는 REPEATED START 신호를 TWCR Rg에 Write(STOP 신호 또는 REPEATED START 신호를 송신) 한다.
      • STOP 신호는 아래와 같은 프로그램으로 TWCR Rg에 제어 값을 Write하면 하면 전송 된다.
        • TWCR = (1 << TWINT) | (0 << TWSTA) | (1 << TWSTO) | (1 << TWEN);

      • REPEATED START 신호는 아래와 같은 프로그램으로 TWCR Rg에 제어 값을 Write하면 하면 전송 된다.
        • TWCR = (1 << TWINT) | (1 << TWSTA) | (0 << TWSTO) | (1 << TWEN);

        • REPEATED START 신호($10)는 동일한 Slave에 다시 전송 또는 수신 하는 경우 또는, STOP 신호를 전송하지 않고 새로운 Slave에 전송 또는 수신 하는 경우에 사용 한다.

        Master Receiver Mode의 Status Codes

        Master Receiver Mode의 Formats 과 States

    • Slave Receiver Mode
      • Slave Receiver Mode는 Master로 부터 전송되는 Data bytes를 Slave가 수신하는 Mode 이다.

        Slave Receiver Mode의 Formats 과 States, Status Codes는 아래 Table과 그래프를 참고 하기 바람. 아래 Table의 Status Codes는 Prescaler bits가 zero 인 경우임.

      • Slave Receiver mode의 초기화는 Slave의 TWAR Rg와 TWCR Rg를 아래와 같이 설정하는 것으로 실현 된다.
      • Slave device의 초기화를 위한 TWAR Rg 설정

        TWAR:     TWA6   TWA5   TWA4   TWA3   TWA2   TWA1  TWA0  TWGCE 
        Value:   Device’s Own Slave Address
        • 윗 표의 7Bits(TWA6 - TWA0)는 Slave device의 Address 이다.
        • TWGCE Bit는 Master로 부터 General call address($00)이 발생한 경우 응답 여부를 결정 한다. 이 Bit 가 Set 된 경우 General call에 응답 하고, Clear 된 경우 General call을 무시 한다.

        Slave device의 초기화를 위한 TWCR Rg 설정

        TWCR:     TWINT   TWEA   TWSTA   TWSTO   TWWC   TWEN      –      TWIE 
        Value:   0 1 0 0 0 1 0 X

        • 하늘색 Box 내의 상태와 같이 Bits를 설정 하여야 한다.
        • 위와 같이 설정하기 위한 C Coding은 아래와 같다.

          TWCR = (1 << TWEA) | (0 << TWSTA) | (0 << TWSTO) | (1 << TWEN);

      • 위 프로그램에서 TWEN을 Set 하는 것은 TWI를 Enable 하기 위한 것이고, TWEA Bit는 Slave 가 선택되었을 때 ACK 신호를 Enable 하기 위한 설정이다. TWSTA와 TWSTO는 0로 설정되어야 한다.
      • Slave device 가 초기화 되면 TWI는 Master로 부터 자신의 번지(Slave 번지)와 Data 전송 방향 Bit(READ/WRITE 신호)가 전송되기를 기다린다.
      • 만약 Data 전송 방향 Bit가 WRITE(0)이면 Slave는 SR mode가 되고, READ(1)이면 ST mode가 된다.
      • 자신의 SLA+W Data가 수신되면 Slave의 TWINT flag 가 Set되고 TWSR Rg로 부터 유효한 Status code를 읽을 수 있게 된다.
      • Status code는 프로그램에서 다음에 필요한 동작을 결정하는데 사용 된다.
      • 만약 전송중 TWEA Bit가 Reset 되면 다음 Data Byte를 수신한 다음 SDA에 NACK(Not Acknowledge: 1) 신호를 Return 한다. 이 것은 Slave 가 더 이상 Data를 수신 할 수 없음을 표시 한다.
      • Slave Receiver Mode의 Status Codes

        Slave Receiver Mode의 Formats 과 States

    • Slave Transmitter Mode
      • Slave Transmitter Mode는 Slave로 부터 Master로 Data bytes를 전송하는 Mode 이다.

        Slave Transmitter Mode의 Formats 과 States, Status Codes는 아래 Table과 그래프를 참고 하기 바람. 아래 Table의 Status Codes는 Prescaler bits가 zero 인 경우임.

      • Slave Transmitter mode의 초기화는 Slave의 TWAR Rg와 TWCR Rg를 아래와 같이 설정하는 것으로 실현 된다.
      • Slave device의 초기화를 위한 TWAR Rg 설정

        TWAR:     TWA6   TWA5   TWA4   TWA3   TWA2   TWA1  TWA0  TWGCE 
        Value:   Device’s Own Slave Address
        • 윗 표의 7Bits(TWA6 - TWA0)는 Slave device의 Address 이다.
        • TWGCE Bit는 Master로 부터 General call address($00)이 발생한 경우 응답 여부를 결정 한다. 이 Bit 가 Set 된 경우 General call에 응답 하고, Clear 된 경우 General call을 무시 한다.

        Slave device의 초기화를 위한 TWCR Rg 설정

        TWCR:     TWINT   TWEA   TWSTA   TWSTO   TWWC   TWEN      –      TWIE 
        Value:   0 1 0 0 0 1 0 X

        • 하늘색 Box 내의 상태와 같이 Bits를 설정 하여야 한다.
        • 위와 같이 설정하기 위한 C Coding은 아래와 같다.

          TWCR = (1 << TWEA) | (0 << TWSTA) | (0 << TWSTO) | (1 << TWEN);

      • 위 프로그램에서 TWEN을 Set 하는 것은 TWI를 Enable 하기 위한 것이고, TWEA Bit는 Slave 가 선택되었을 때 ACK 신호를 Enable 하기 위한 설정이다. TWSTA와 TWSTO는 0로 설정되어야 한다.
      • Slave device 가 초기화 되면 TWI는 Master로 부터 자신의 번지(Slave 번지)와 Data 전송 방향 Bit(READ/WRITE 신호)가 전송되기를 기다린다.
      • 만약 Data 전송 방향 Bit가 READ(1)이면 Slave는 ST mode가 된다.
      • 자신의 SLA+R Data가 수신되면 Slave의 TWINT flag 가 Set되고 TWSR Rg로 부터 유효한 Status code를 읽을 수 있게 된다.
      • Status code는 프로그램에서 다음에 필요한 동작을 결정하는데 사용 된다.
      • 만약 전송중 TWEA Bit가 Reset 되면 TWI는 마지막 Data Byte를 송신 한다. 마지막 Data를 전송한 다음 TWSR Rg의 Status code는 NACK 또는 ACK 신호의 전송에 따라 $C0 또는 $C8 값을 갖게 된다.
      • Slave Transmitter Mode의 Status Codes

        Slave Transmitter Mode의 Formats 과 States

    • 기타 상태 코드(status codes)
      • 위에서 설명한 4가지 Mode의 상태 코드(status codes)외에 현재 전송 대기 또는 진행 중 상태 코드($F8)와 Bus error 상태 코드($00)가 있다.

      • $F8 Code는 TWINT Flag가 Set 되지 않았기 때문에 유효한 관련 상태 정보가 없는 상태임을 표시 한다.
      • $00 Code는 Two-wire Serial Bus 전송 중 Error(TWI format frame의 부적절한 위치에서 START or STOP 신호가 발생한 경우)가 발생한 상태 이다.
      • Bus error를 회복하기 위하여는 전송제어 프로그램에서 TWSTO Bit를 Set 하고, TWINT Flag를 Clear(1을 Write) 하여야 한다.
      • 기타 상태 코드(status codes)

    • 하나 이상의 TWI Mode(동작)를 결합한 전송
      • 원하는 동작을 위하여 하나 이상의 TWI Mode를 결합한 전송이 필요한 경우가 있다. EEPROM으로 부터 Data를 읽는 경우를 예로 들면 아래와 같은 단계로 실행 된다.

        • 전송이 시작된다.
        • 읽어야 할 EEPROM 위치(번지)를 전송 한다.
        • 읽기 동작이 실행 된다.
        • 전송이 종료 된다.
      • 윗 예에서 Data는 Master와 Slave 양쪽으로 전송 된다.
      • Master는 MT mode를 사용하여 Slave에게 읽을 위치를 알리고(Slave에게 명령을 전송),
      • MR mode를 사용하여 Slave로 부터 Data를 읽는다.
      • 만약 Multimaster system인 경우 MT mode와 MR mode 동작 사이에 다른 Master가 Bus를 사용하게 되면 Master는 다른 Data를 수신하게 된다.
      • 전송 방향이 변경될 때 발생 할 수 있는 이러한 문제를 피하기 위하여 REPEATED START 신호를 사용하면 Master는 계속하여 Bus 사용 권한을 유지하게 되어 정상적으로 송수신 동작을 실행 할 수 있다.
      • 아래 예는 위와 같은 경우의 전송 과정을 보여 준다.

  • Register 설명
    • TWBR - TWI Bit Rate Register
      • Bits 7:0 – TWI Bit Rate Register
        • TWBR는 Master modes에서 SCL clock frequency를 결정하기 위한 Bit rate generator의 Division factor를 선택 하는데 사용 된다.
    • TWCR - TWI Control Register
      • TWCR은 TWI의 동작을 제어하는 ​​데 사용된다.

      • Bit 7 – TWINT: TWI Interrupt Flag
        • 이 Bit는 TWI가 현재 작업을 끝내고, 제어 프로그램의 동작(응답)을 기대 할 때 Hardware 에 의하여 Set 된다.
        • 만약 SREG의 I-bit와 TWCR Rg의 TWIE bit가 Set 되어 있는 상태에서 이 Bit가 Set되면 MCU은 TWI interrupt vector로 Jump 한다.
        • TWINT flag가 Set 되어 있는 동안 SCL Low 주기가 연장 된다.
        • TWINT flag는 제어 프로그램에서 Clear(이 Bit에 1을 Write) 하여야 한다. Hardware에서 자동으로 Clear 되지 않는다.
        • TWINT flag가 Clear 되면 TWI의 동작이 시작되기 때문에 TWI의 동작이 시작되기 전에 실행되어야 하는 다른 Rg의(TWI Address Register(TWAR), TWI Status Register(TWSR), TWI Data Register(TWDR)) Accesses는 TWINT flag를 Clear 하기전에 실행하여야 한다.
      • Bit 6 – TWEA: TWI Enable Acknowledge Bit
        • TWEA bit는 Acknowledge pulse의 발생을 제어 한다.

          만약 TWEA bit가 Set 되었으면 아래와 같은 조건일 때 ACK Pulse가 발생 한다.

        • Slave device 가 자신의 Slave address를 수신 하였을 때,
        • Slave device TWAR Rg의 TWGCE bit가 Set된 상태에서 General call를 수신 하였을 때,
        • Master Receiver 또는 Slave Receiver mode에서 Data byte를 수신 하였을 때.
        • TWEA bit에 0를 Write 하면 Device는 임시적으로 Two-wire Serial Bus로 부터 분리(Disconnected) 상태가 된다. TWEA bit에 1를 Write 하면 Address 인식이 재개 된다.

      • Bit 5 – TWSTA: TWI START Condition Bit
        • Two-wire Serial Bus에서 Master가 되고자 할 때 제어프로그램에서 TWSTA bit에 1을 Write 한다.
        • TWI hardware는 Bus가 사용 가능한 상태인지 Check 하여 만약 현재 Bus 가 Free 상태이면 START 신호를 Bus에 생성 한다.
        • 그러나 Bus가 Free 하지 않으면 TWI는 STOP 조건까지 기다린다. Free 상태를 감지 한 다음 Master가 되기 위해 새로운 START 신호를 생성한다.
        • TWSTA bit는 START 신호가 전송된 다음 제어프로그램에서 Clear 되어야 한다.
      • Bit 4 – TWSTO: TWI STOP Condition Bit
        • Master mode에서 TWSTO bit에 1을 Write 하면 Two-wire Serial Bus에 STOP 신호가 생성된다.
        • STOP 신호가 생성되면 TWSTO bit는 자동으로 Clear 된다.
        • Slave mode인 경우 Error condition에서 Recover하기 위하여 TWSTO bit에 1을 Write 한다.
        • Slave mode에서 TWSTO bit에 1을 Write 하여도 STOP 신호가 생성 되지는 않는다. 그러나 TWI는 초기화되고, SCL과 SDA 선은 High impedance state로 된다.
      • Bit 3 – TWWC: TWI Write Collision Flag
        • TWWC bit는 TWINT이 Low인 상태에서 TWI Data Register(TWDR)에 Write 하는 경우 발생 한다.
        • 이 Flag는 TWINT이 High인 상태에서 TWI Data Register(TWDR)에 Write 하면 Clear 된다.
      • Bit 2 – TWEN: TWI Enable Bit
        • TWEN Bit는 TWI 작동을 활성화하고 TWI 인터페이스를 활성화한다.
        • TWEN Bit에 1을 Write 하면 TWI에 사용하는 I/O pins이 TWI로 동작(보통 I/O Pin은 한 가지 이상의 용도로 사용 함)하게 되어 SCL과 SDA 신호에 연결 된다.
        • 이 Bit를 0을 Write 하면 TWI가 꺼지고 모든 TWI가 진행중인 작업에 관계없이 전송이 종료된다.
      • Bit 1 – Res: Reserved Bit
      • Bit 0 – TWIE: TWI Interrupt Enable
        • SREG의 I-bit와 TWIE에가 Set된 상태에서 TWINT flag가 High로 되면 TWI Interrupt Request가 활성화 된다.
    • TWSR - TWI Status Register
      • Bits 7:3 – TWS: TWI Status
        • 이 5 Bits는 TWI Logic 과 Two-wire Serial Bus의 상태를 반영한다. Status codes에 대한 설명은 앞의 Transmitter Mode를 참고하기 바람.
        • TWSR Rg는 5-bit의 Status value 와 2-bit의 Prescaler value을 포함 하고 있다.
        • Status value를 사용 할 경우에는 TWSR Rg를 $F8로 Masking하여 0 - 2번 Bits를 0가 되도록 하여 사용한다.
      • Bit 2 – Res: Reserved Bit
      • Bits 1:0 – TWPS: TWI Prescaler Bits
        • 이 Bits는 Read/Write가 가능하고, Bit Rate Prescaler를 제어 한다.
    • TWDR - TWI Data Register
      • Bits 7:0 – TWD: TWI Data Register
        • 이 8 bits는 Two-wire Serial Bus에서 다음에 전송할 Data byte 또는 최근에 수신한 Data byte를 저장 한다.
        • Transmit mode에서는 다음에 전송할 Data byte를 저장하고,
        • Receive mode에서는 마자막(최근)에 수신한 Data byte를 저장 한다.
        • TWI interrupt flag(TWINT)가 Set(Hardware에 의하여 Set 됨)되어 있는 동안(이 동안에는 TWDR Rg는 변동하지 않음)에만 이 Rg에 Read/Write가 가능하다.
    • TWAR - TWI (Slave) Address Register
      • Bits 7:1 – TWA: TWI(Slave) Address Register
        • 이 7 bits는 Slave device의 Slave address를 저장 한다.
        • Master mode에서 이 값은 사용되지 않는다.
        • Multimaster system에서 이 Device를 Slave로 사용하는 경우에는 이 값을 사용 한다.
      • Bit 0 – TWGCE: TWI General Call Recognition Enable Bit
        • Slave mode에서 이 Bit가 Set되면 General Call에 응답하게 된다.

  • TWI 통신을 사용한 응용 프로그램 예
    • AVR Master - Slave TWI 문자 통신 예(Atmel Studio 7 개발 환경 사용)
      • AVR1(ATmega128) 과 AVR2(ATmega128) 사이의 I2C 통신을 위한 구성도

        AVR1(ATmega128) 과 AVR2(ATmega128) 사이의 I2C 통신 실험을 위한 회로 예

        이 예는 TWI 통신의 이해를 위한 기본 프로그램으로 UART 통신으로 Master에 입력된 문자를 Slave에 전송하여 Slave의 모니터에 출력하고, 이 문자를 Slave에서 Master에 다시 전송하여 Master의 모니터에 출력하는 예 이다.

      • AVR Master 측 프로그램(Microchip Studio 개발 환경) 예: cho_avr_i2c_master_basic.zip
      • AVR Slave 측 프로그램(Microchip Studio 개발 환경) 예: cho_avr_i2c_slave_basic.zip
      • 실험을 위한 준비
        • I2C(TWI) Pin 연결
          • AVR1 SDA(PD1) <=> AVR2 SDA(PD1): Bidirectional Serial Data
          • AVR1 SCL(PD0) <=> AVR2 SCL(PD0): Serial Data Clock Input
          • I2C pull up 저항(Rp: 보통 1K를 사용)을 SDA와 SCL 신호선에 연결한다.
          • AVR1와 AVR2 GND를 연결한다.
        • AVR1과 AVR2 각각에 대하여 아래와 같이 UART 신호선을 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Atmega128의 TXD0(PE1)를 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Atmega128의 RXD0(PE0)를 연결한다.
          • 컴퓨터(USB --> UART(RS232)의 GND와 Atmega128의 GND를 연결한다. "USB --> UART(RS232) 변환 모듈"를 사용하는 경우 변환 모듈의 GND와 Atmega128의 GND를 연결한다.
      • 실험 방법
        • cho_avr_i2c_master_basic.zip과 cho_avr_i2c_slave_basic.zip 파일을 Download하여 압축을 해제한다.
        • cho_avr_i2c_master_basic.hex를 AVR1 개발 보드에 Upload 한다.
        • cho_avr_i2c_slave_basic.hex를 AVR2 개발 보드에 Upload 한다.
        • AVR1을 위한 모니터 프로그램(예: OC-Console, Tera Term)을 실행하고 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
        • AVR2을 위한 모니터 프로그램(예: OC-Console, Tera Term)을 실행하고 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
        • 주: AVR1을 위한 모니터 프로그램과 AVR2을 위한 모니터 프로그램의 Serial Port 번호(제어판에서 확인요)가 서로 다르게 설정되어야 한다.

        • 실험:
          • AVR1의 Reset SW를 누르면 AVR1 모니터 프로그램에 "AVR I2C comm(Master - Slave) testing..." 메세지와 "Input transmit char: " 메세지가 출력된다.
          • AVR2의 Reset SW를 누르면 AVR2 모니터 프로그램에 "I2C testing." 메세지가 출력된다.
          • AVR1 모니터 프로그램에서 문자를 입력하면 AVR1에서 입력한 문자가 AVR2 모니터 프로그램에 출력된다.
          • AVR1 문자열을 수신한 AVR2는 수신한 문자를 다시 AVR1에 전송한다.
          • AVR2에서 전송한 문자가 "R:" 메세지 다음에 AVR1 모니터에 출력된다.

    • AVR Master - Slave TWI 문자열 통신 예(Atmel Studio 7 개발 환경 사용)
      • 이 예는 TWI 통신의 이해를 위한 문자열(String) 전송과 수신 프로그램으로 UART 통신으로 Master에 입력된 문자열을 Slave에 전송하여 Slave의 모니터에 출력하고, Slave에서 "AVR i2c testing" 메세지를 Master에 다시 전송하여 Master의 모니터에 출력하는 예 이다.

      • AVR Master 측 프로그램(Microchip Studio 개발 환경) 예: cho_avr_i2c_master_string.zip
      • AVR Slave 측 프로그램(Microchip Studio 개발 환경) 예: cho_avr_i2c_slave_string.zip
      • 실험을 위한 준비
        • 위 "AVR(ATmega128) 1 과 AVR(ATmega128) 2 사이의 I2C 통신 실험을 위한 회로 예"를 참고하여 아래와 같이 회로를 연결한다.

        • I2C(TWI) Pin 연결
          • AVR1 SDA(PD1) <=> AVR2 SDA(PD1): Bidirectional Serial Data
          • AVR1 SCL(PD0) <=> AVR2 SCL(PD0): Serial Data Clock Input
          • I2C pull up 저항(Rp: 보통 1K를 사용)을 SDA와 SCL 신호선에 연결한다.
          • AVR1와 AVR2 GND를 연결한다.
        • AVR1과 AVR2 각각에 대하여 아래와 같이 UART 신호선을 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Atmega128의 TXD0(PE1)를 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Atmega128의 RXD0(PE0)를 연결한다.
          • 컴퓨터(USB --> UART(RS232)의 GND와 Atmega128의 GND를 연결한다. "USB --> UART(RS232) 변환 모듈"를 사용하는 경우 변환 모듈의 GND와 Atmega128의 GND를 연결한다.
      • 실험 방법
        • cho_avr_i2c_master_string.zip과 cho_avr_i2c_slave_string.zip 파일을 Download하여 압축을 해제한다.
        • cho_avr_i2c_master_string.hex를 AVR1 개발 보드에 Upload 한다.
        • cho_avr_i2c_slave_string.hex를 AVR2 개발 보드에 Upload 한다.
        • AVR1을 위한 모니터 프로그램(예: OC-Console, Tera Term)을 실행하고 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
        • AVR2을 위한 모니터 프로그램(예: OC-Console, Tera Term)을 실행하고 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
        • 주: AVR1을 위한 모니터 프로그램과 AVR2을 위한 모니터 프로그램의 Serial Port 번호(제어판에서 확인요)가 서로 다르게 설정되어야 한다.

        • 실험:
          • AVR1의 Reset SW를 누르면 AVR1 모니터 프로그램에 "AVR I2C comm(Master - Slave) testing..." 메세지와 "Input transmit string: " 메세지가 출력된다.
          • AVR2의 Reset SW를 누르면 AVR2 모니터 프로그램에 "I2C testing." 메세지가 출력된다.
          • AVR1 모니터 프로그램에서 문자열을 입력하고 Enter key를 입력하면 AVR1에서 입력한 문자열이 AVR2 모니터 프로그램에 출력된다.
          • AVR1에서 전송한 문자열을 수신한 AVR2는 "AVR i2c testing" 메세지를 AVR1에 전송한다.
          • AVR1에 AVR2에서 전송한 "AVR i2c testing" 메세지가 출력된다.

    • AVR Master - Slave TWI 문자열 통신(Interrupt) 예(Atmel Studio 7 개발 환경 사용)
      • 이 예는 TWI 통신의 이해를 위한 문자열(String) 전송과 수신 프로그램으로 UART 통신으로 Master에 입력된 문자열을 Slave에 전송하여 Slave의 모니터에 출력하고, Slave에서 "AVR i2c testing" 메세지를 Master에 다시 전송하여 Master의 모니터에 출력하는 예 이다. 이 예에서는 Slave에서 문자열 수신과 전송에 Interrupt를 이용한다.

      • AVR Master 측 프로그램(Microchip Studio 개발 환경) 예: cho_avr_i2c_master_interrupt_string.zip
      • AVR Slave 측 프로그램(Microchip Studio 개발 환경) 예: cho_avr_i2c_slave_interrupt_string.zip
      • 실험을 위한 준비
        • 위 "AVR Master - Slave TWI 문자열 통신 예"와 동일하다.

      • 실험 방법
        • cho_avr_i2c_master_interrupt_string.zip과 cho_avr_i2c_slave_interrupt_string.zip 파일을 Download하여 압축을 해제한다.
        • cho_avr_i2c_master_interrupt_string.hex를 AVR1 개발 보드에 Upload 한다.
        • cho_avr_i2c_slave_interrupt_string.hex를 AVR2 개발 보드에 Upload 한다.
        • AVR1을 위한 모니터 프로그램(예: OC-Console, Tera Term)을 실행하고 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
        • AVR2을 위한 모니터 프로그램(예: OC-Console, Tera Term)을 실행하고 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
        • 주: AVR1을 위한 모니터 프로그램과 AVR2을 위한 모니터 프로그램의 Serial Port 번호(제어판에서 확인요)가 서로 다르게 설정되어야 한다.

        • 실험:
          • AVR1의 Reset SW를 누르면 AVR1 모니터 프로그램에 "AVR I2C comm(Master - Slave) testing..." 메세지와 "Input transmit string: " 메세지가 출력된다.
          • AVR2의 Reset SW를 누르면 AVR2 모니터 프로그램에 "I2C testing." 메세지가 출력된다.
          • AVR1 모니터 프로그램에서 문자열을 입력하고 Enter key를 입력하면 AVR1에서 입력한 문자열이 AVR2 모니터 프로그램에 출력된다.
          • AVR1 문자열을 수신한 AVR2는 "AVR i2c testing" 메세지를 AVR1에 전송한다.
          • AVR1에 AVR2에서 전송한 "AVR i2c testing" 메세지가 출력된다.

    • AVR Master - Slave TWI 통신을 이용하여 문자를 LED에 출력하는 예(Atmel Studio 7 개발 환경 사용)
      • AVR Master - Slave I2C 통신을 이용한 LED 제어 실험을 위한 회로 예

        이 예는 TWI 통신의 이해를 위한 문자 전송과 수신 프로그램으로 UART 통신으로 Master에 입력된 문자를 Slave에 전송하여 Slave의 LED Array에 출력하고, Slave에서 수신한 문자를 Master에 다시 전송하여 Master의 LED Array에 출력하는 예 이다.

      • AVR Master 측 프로그램(Microchip Studio 개발 환경) 예: cho_avr_i2c_master_led.zip
      • AVR Slave 측 프로그램(Microchip Studio 개발 환경) 예: cho_avr_i2c_slave_led.zip
      • 실험을 위한 준비
        • I2C(TWI) Pin 연결
          • AVR1 SDA(PD1) <=> AVR2 SDA(PD1): Bidirectional Serial Data
          • AVR1 SCL(PD0) <=> AVR2 SCL(PD0): Serial Data Clock Input
          • I2C pull up 저항(Rp: 보통 1K를 사용)을 SDA와 SCL 신호선에 연결한다.
          • AVR1와 AVR2 GND를 연결한다.
        • AVR1에 아래와 같이 UART 신호선을 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Atmega128의 TXD0(PE1)를 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Atmega128의 RXD0(PE0)를 연결한다.
          • 컴퓨터(USB --> UART(RS232)의 GND와 Atmega128의 GND를 연결한다. "USB --> UART(RS232) 변환 모듈"를 사용하는 경우 변환 모듈의 GND와 Atmega128의 GND를 연결한다.
        • AVR1과 AVR2의 PORTF에 저항(330Ω)과 LED Array(8Bits)를 연결한다. AVR1에는 LED Array가 없는 경우에도 실험을 진행할 수 있다.
        • 참고자료: 8Bit-LED-array-module 제작 예

      • 실험 방법
        • cho_avr_i2c_master_led.zip과 cho_avr_i2c_slave_led.zip 파일을 Download하여 압축을 해제한다.
        • cho_avr_i2c_master_led.hex를 AVR1 개발 보드에 Upload 한다.
        • cho_avr_i2c_slave_led.hex를 AVR2 개발 보드에 Upload 한다.
        • AVR1을 위한 모니터 프로그램(예: OC-Console, Tera Term)을 실행하고 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
        • 실험:
          • AVR1의 Reset SW를 누르면 AVR1 모니터 프로그램에 "AVR I2C comm(Master - Slave) LED control" 메세지와 LED에 전송할 문자를 기다리는 "Input transmit char: " 메세지가 출력된다.
          • AVR1 모니터 프로그램에서 문자을 입력하면 문자가 AVR2에 전달되어 AVR2에 연결된 LED Array에 출력된다.
          • AVR1 문자열을 수신한 AVR2는 수신한 문자를 다시 AVR1에 전송한다.
          • AVR2에서 전송한 문자는 AVR1에 수신되고 AVR1의 LED Array에 다시 출력된다.

    • AVR Master - Slave TWI 통신(Interrupt)을 이용한 LED 제어 예(Atmel Studio 7 개발 환경 사용)
      • 이 예는 UART 통신으로 Master에 입력된 문자(LED 제어 명령)를 Slave에 전송하여 Slave의 LED Array를 제어하는 프로그램 예 이다.

      • AVR Master 측 프로그램(Microchip Studio 개발 환경) 예: cho_avr_i2c_master_interrupt_led.zip
      • AVR Slave 측 프로그램(Microchip Studio 개발 환경) 예: cho_avr_i2c_slave_interrupt_led.zip
      • 실험을 위한 준비
        • 위 "AVR Master - Slave I2C 통신을 이용한 LED 제어 실험을 위한 회로 예"를 참고하여 아래와 같이 회로를 연결한다.

        • I2C(TWI) Pin 연결
          • AVR1 SDA(PD1) <=> AVR2 SDA(PD1): Bidirectional Serial Data
          • AVR1 SCL(PD0) <=> AVR2 SCL(PD0): Serial Data Clock Input
          • I2C pull up 저항(Rp: 보통 1K를 사용)을 SDA와 SCL 신호선에 연결한다.
          • AVR1와 AVR2 GND를 연결한다.
        • AVR1에 아래와 같이 UART 신호선을 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Atmega128의 TXD0(PE1)를 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Atmega128의 RXD0(PE0)를 연결한다.
          • 컴퓨터(USB --> UART(RS232)의 GND와 Atmega128의 GND를 연결한다. "USB --> UART(RS232) 변환 모듈"를 사용하는 경우 변환 모듈의 GND와 Atmega128의 GND를 연결한다.
          • 프로그램에는 Debugging을 위하여 AVR2에도 UART를 사용할 수 있도록 작성되어 있으나 AVR2에 UART를 연결하지 않아도 실험에 문제는 없다.

        • AVR2의 PORTF에 저항(330Ω)과 LED Array(8Bits)를 연결한다.
        • 참고자료: 8Bit-LED-array-module 제작 예

      • 실험 방법
        • cho_avr_i2c_master_interrupt_led.zip과 cho_avr_i2c_slave_interrupt_led.zip 파일을 Download하여 압축을 해제한다.
        • cho_avr_i2c_master_interrupt_led.hex를 AVR1 개발 보드에 Upload 한다.
        • cho_avr_i2c_slave_interrupt_led.hex를 AVR2 개발 보드에 Upload 한다.
        • AVR1을 위한 모니터 프로그램(예: OC-Console, Tera Term)을 실행하고 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
        • AVR2 UART를 연결한 경우AVR2을 위한 모니터 프로그램(예: OC-Console, Tera Term)을 실행하고 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
        • 실험:
          • AVR1의 Reset SW를 누르면 AVR1 모니터 프로그램에 "AVR I2C comm(Master - Slave) LED control" 메세지와 LED 제어 명령을 설명하는 "Input Command(L:Left, R:Right, B:Blinking, S:Set LED, G:Get LED): " 메세지가 출력된다.
          • AVR2의 Reset SW를 누르면 AVR2 UART가 연결된 경우 AVR2 모니터 프로그램에 "I2C LED control" 메세지가 출력된다.
          • AVR1 모니터 프로그램에서 명령 문자을 입력하면 명령이 AVR2에 전달되어 AVR2에 연결된 LED Array가 제어된다.

    • DS1621을 사용한 온도 측정 프로그램 예(Atmel Studio 7 개발 환경 사용)
      • Master(ATmega128)와 Slave(DS1621) I2C 통신을 위한 구성도

        AVR(ATmega128)과 I2C 통신기능을 내장한 온도센서(DS1621)을 사용한 온도 측정 회로 예

          주: DS1621에 Rp가 내장된 경우 Rp를 연결하지 않아도 된다.


      • DS1621을 사용한 온도 측정 프로그램(Microchip Studio 개발 환경) 예: cho_TWI_temperature_DS1621.zip
      • 실험을 위한 준비
        • I2C(TWI) Pin 연결
          • DS1621 SDA(1번 Pin) <=> ATmega128 PD1(TWD): Bidirectional Serial Data
          • DS1621 SCL(2번 Pin) <=> ATmega128 PD0(TWCK): Serial Data Clock Input
          • DS1621 A0(7번 Pin), A1(6번 Pin), A2(5번 Pin) Address Select Pin를 GND에 연결한다.
          • I2C pull up(Rp: 보통 1K를 사용)를 연결한다. DS1621에 Rp가 내장된 경우 Rp를 연결하지 않아도 된다.
          • DS1621 VDD(5V, 8번 Pin)와 GND(4번 Pin)를 연결한다.
        • UART 연결
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Atmega128의 TXD0(PE1)를 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Atmega128의 RXD0(PE0)를 연결한다.
          • 주: 컴퓨터에 Serial Port가 없는 경우 "USB --> UART(RS232) 변환 모듈"를 사용(USB Port를 Serial Port로 변환)하여 연결한다. 개발보드에 따라서는 "USB --> UART(RS232) 변환 모듈"을 내장하고 있는 경우가 많기 때문에 본인이 사용하는 개발보드에서 확인 하여야 한다.

            참고자료: USB - Serial 변환 모듈

          • 컴퓨터(USB --> UART(RS232)의 GND와 Atmega128의 GND를 연결한다. "USB --> UART(RS232) 변환 모듈"를 사용하는 경우 변환 모듈의 GND와 Atmega128의 GND를 연결한다.
      • 실험 방법
        • cho_TWI_temperature_DS1621.zip 파일을 Download하여 압축을 해제한다.
        • cho_TWI_temperature_DS1621.hex를 개발 보드에 Upload 한다.
        • 모니터 프로그램(예: OC-Console, Tera Term)을 설치(이미 설치되어 있는 경우에는 실행만 하면됨)하고 실행 한다.
        • 모니터 프로그램에서 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
        • 실험:
          • 개발 보드의 Reset SW를 누르면 모니터에 "--- Temperature Display and Control ---"와 명령(1 - 9번) 설명과 번호가 출력된다.
          • 모니터 프로그램에서 원하는 명령 번호를 입력하면 결과가 모니터에 출력된다.

    • I2C 통신을 사용한 LCD 모듈 제어(Atmel Studio 7 개발 환경 사용)
      • 장치 제어에 사용하는 Microcontroller는 I/O Port의 수가 제한되어 있기 때문에 LCD 모듈 제어(보통 8 Bits 가 필요)와 같이 많은 I/O Ports를 필요로 하는 장치의 제어를 위하여 I2C 통신을 사용한 I/O Port 확장(8 Bits) 모듈을 사용 한다. 이 예는 I2C 통신을 사용한 I/O Port 확장(8 Bits) 모듈을 이용하여 LCD 모듈을 제어하는 기술에 대하여 설명 한다.

      • I2C 통신을 사용한 LCD 모듈
        • I2C 통신을 사용한 I/O Port 확장(8 Bits) 모듈
          • SCL, SDA Pin은 I2C 통신에 사용 된다.
          • P0 - P7은 8 Bit Input/Output Port로 I/O Port 확장에 사용 한다.
          • A0 - A2는 Address를 설정하기 위하여 사용 한다.

        I2C 통신을 이용한 I/O Port 확장 Chip(PCF8574)의 Block diagram


        • I2C 통신을 사용한 LCD 모듈
          • I2C - LCD Module은 I2C - I/O Expander(PCF8574)와 LCD의 Contrast를 조정하는 회로(가변저항 포함), Backlight Control 회로로 구성 되어 LCD 모듈을 제어 한다.
          • I2C - LCD Module은 Microcontroller로 부터 I2C 통신을 이용하여 Data를 수신하고, 이 Data를 이용하여 LCD Module을 제어 한다.
          • I2C - LCD Module과 LCD Module은 함께 조립되어 판매 하기 때문에 이용자는 Microcontroller(AVR)과 I2C - LCD Module 사이의 4선(SCL, SDA, VCC, GND) 만 연결하면 된다.

          I2C 통신을 사용한 LCD 제어 시스템 구성도


          I2C - LCD Module 과 LCD Module(1602)을 통합한 제품 예

      • I2C 통신을 사용한 LCD 모듈 제어 프로그램(Microchip Studio 개발 환경) 예: cho_avr_i2c_lcd_basic.zip
        • I2C 통신을 사용한 LCD 모듈 제어 프로그램 실험을 위한 회로 예

        • 실험을 위한 준비
          • I2C(TWI) Pin 연결
            • AVR SDA(PD1) <=> I2C-LCD Module SDA: Bidirectional Serial Data
            • AVR SCL(PD0) <=> I2C-LCD Module SCL: Serial Data Clock Input
            • I2C pull up 저항(Rp: 보통 1K를 사용)을 SDA와 SCL 신호선에 연결한다.
            • Vcc: I2C-LCD Module에 전원(Module에 따라 5V or 3.3V)을 연결한다.
            • GND: AVR GND <=> I2C-LCD Module GND
          • PC와 AVR 사이에 UART 신호선을 연결한다.
            • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Atmega128의 TXD0(PE1)를 연결한다.
            • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Atmega128의 RXD0(PE0)를 연결한다.
            • 컴퓨터(USB --> UART(RS232)의 GND와 Atmega128의 GND를 연결한다. "USB --> UART(RS232) 변환 모듈"를 사용하는 경우 변환 모듈의 GND와 Atmega128의 GND를 연결한다.
        • 실험 방법
          • cho_avr_i2c_lcd_basic.zip 파일을 Download하여 압축을 해제한다.
          • 주: 이 예에서는 LCD 모듈의 Slave 주소를 0x3f로 설정하였다. 만약 자신이 사용하는 LCD 모듈의 Slave 주소가 다른 경우 avr_lcd_1602_4bit_i2c.h 파일에서 LCD_ADDR를 변경하고 다시 컴파일 하여야 한다. 보통 PCF8574를 사용한 경우에는 0x27 번지이고, PCF8574A를 사용한 경우에는 0x3f 번지이다.

          • cho_avr_i2c_lcd_basic.hex를 AVR1 개발 보드에 Upload 한다.
          • PC에서 모니터 프로그램(예: OC-Console, Tera Term)을 실행하고 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
          • 실험:
            • AVR의 Reset SW를 누르면 모니터에 "LCD test" 메세지가 출력된다.
            • LCD display module의 첫 Line에 "Line1 T" 메세지가 출력된다.
            • LCD display module의 둘째 Line에 "Line2" 메세지가 출력된다.
            • 모니터 프로그램에서 영문자를 입력하면 모니터와 LCD의 첫줄에 문자가 출력(첫줄의 끝까지만 출력됨)된다.