TWI(I2C) 통신
TWI(2 Wire Interrupt)에 대해서 다시 한번 복습해보쟈!!
4.7.1 TWI(I2C) 통신의 이해
TWI(Two-Wire Serial Interface)는 일반적인 마이크로 컨트롤러 응용 제품에게 이상적이다.
하나의 클럭(SCL) 과 하나의 데이터(SDA) 선으로 구성된 두 개의 버스 선으로 128개의 서로 다른 디바이스를 제어할 수 있다. 외부 하드웨어는 각 버스 선에 독립적인 pull-up 저항만 있으면 된다. 아래 그림은 TWI를 사용하여 연결된 디바이스들이다.
주요 특징은 다음과 같다.
- 단지 두 개의 버스 선을 사용하는 간단하고 효율적인 통신 방식
- 마스터(master)와 슬레이브(slave) 동작을 모두 지원
- 디바이스에서 송수신이 모두 가능
- 7비트 주소를 이용하여 128개의 다른 슬레이브 주소가 가능
- 400kHZ 데이터 속도 까지 지원
4.7.2 TWI 통신의 활용
위 그림과 같이 DK128-MAIN에서는 25번 핀이 SCL이고 26번 핀이 SDA이다. 그리고 아래는 DK128-EXT 보드인데 DK128에서는 TWI 통신을 지원하는 디바이스로 EEPROM인 AT24C16을 선택하였다. AT24C16을 선택하였다. AT24C16의 회로도는 아래와 같다. DK128-EXT 보드의 J18 헤더 핀의 1번 핀이 SCL이고 2번 핀이 SDA이다.
ATMega128에서는 TWI 통신을 위한 레지스터를 제공하고 있는데 여기서는 제공된 TWI 관련 레지스터를 사용하기 때문에 그에 대해 설명을 하기로 한다.
1)TWBR(TWI Bit Rate Register)
TWBR은 TWI의 전송속도를 설정하는 레지스터이다. 전송 속도는 다음과 같이 계산한다.
AT24C16의 데이터시트에 나와 있는 것과 같이 5V에서는 400kHz로 동작을 하므로 SCL frequency는 400k이다. DK128은 16MHz의 크리스털을 사용하기 때문에 CPU Clock Frequency는 16M가 된다. TWPS는 TWI Status Register에서 설정하는 값이다. 여기서는 TWPS를 00으로 설정할 것이기 때문에 여기서 정해지는 TWBR 값이 계산된다.
2) TWCR(TWI Control Register)
Bit 7 - TWINT : TWI Interrupt Flag
이 비트는 현재 작업이 끝났을 때 하드웨어에 의해서 1로 설정된다. SREG의 I비트와 TWCR의 TWIE가 1로 설정되었다면, MCU가 TWI 인터럽트 벡터로 점프시킨다. TWINT 플래그는 해당 비트를 1로 쓰는 것으로 소프트웨어에 의한 클리어를 해야만 한다. 이 비트는 하드웨어에 의해 자도이으로 클리어 되지 않는다. 그래서 TWI 연산을 하기 위해 처음에 클리어 되어야만 한다.
Bit 6 - TWEA : TWI Enable Acknowledge Bit
TWEA 비트는 ACK 신호를 만들어 준다. TWEA 비트가 1로 되어 있고 다음 조건을 만족하면 TWI 버스에 ACK 신호를 실어준다.
- 디바이스가 자신의 슬레이브 주소를 받았을 때
- 수신 모드에서 데이터를 한 바이트 수신했을 때
일반적으로 ACK 신호는 위와 같은 경우에 상대방에게 자신이 잘 수신했다는 것을 알려주기 위해 사용된다. 아래 그림은 ACK 신호의 실제 파형이다. SCL이 9번째 High가 되었을 때 데이터 즉, SDA를 Low로 만드는 것이 ACK 신호가 된다.
Bit 5 - TWSTA : TWI START Condition Bit
TWI 마스터로 동작할 때 버스가 비어 있다면 START 조건을 만들어 준다. 비어있지 않다면 STOP 조건이 될 때 까지 기다린다. START 조건이 만들어 지면 소프트웨어에 의해 클리어 되어야 한다.
START 조건과 아래에 나올 STOP 조건의 실제 파형은 아래 그림과 같다. START 조건은 SCL이 High에 있을 때 SDA가 하강 엣지를 만드는 것이고 STOP 조건은 SCL이 High에 있을 때 SDA가 상승 엣지를 만드는 것이다. 시간 간격에 대한 자세한 것은 해당 디바이스의 데이터시트를 참조.
Bit 4 - TWSTO : TWI STOP Condition Bit
TWSTA와 같이 TWI 마스터로 동작할 때 STOP 조건을 만들어 준다. 실행되고 나면 자동으로 클리어 된다.
Bit 2 - TWEN : TWI Enable Bit
TWI 동작을 활성화 시키기 위해 1로 설정해야 한다. 0으로 설정되면 TWI의 모든 동작이 멈추게 된다.
Bit 0 - TWIE : TWI Interrupt Enable Bit
이 비트가 1로 설정되고 SREG의 I비트가 1로 설정되면 TWINT 플래그가 High가 되었을 때 TWI 인터럽트가 발생한다.
3)TWSR(TWI Status Register)
Bits 1..0 - TWPS : TWI Prescaler Bits
TWI 속도를 설정하기 위해 분주비를 설정하기 위한 비트이다. 여기서 설정된 값을 참조하여 위에서 설명했던 TWBR에 설정할 수 있는 값이 결정된다. 여기서는 분주를 하지 않고 00으로 설정하여 사용한다.
4) TWDR(TWI Data Register)
TWDR은 송수신용 데이터를 담고 있는 레지스터이다. 송신 모드에서는 TWDR에는 전송할 다음 바이트 데이터가 있고, 수신 모드에서는 마지막에 받은 바이트 데이터가 있다.
위 그림은 ATMega2560 datasheet에 나와 있는 TWI동작 순서이다. 아래 부분은 하드웨어가 처리하는 부분이므로 소프트웨어에서는 응답을 기다리는 동작을 구현하면 된다. 각 번호 별로 설명을 하면 다음과 같다.
우선 AT24C16은 5V에서 400kHz로 동작을 하며 16K의 메모리 저장 공간을 가지고 있다. 100만 번의 쓰기를 지원하며 저장된 데이터는 100년 정도 보관이 된다. 아래 그림은 디바이스 주소로 사용되는 데이터 포맷이다.
데이터는 8비트 씩 읽어오게 되므로 AT24C16의 16K 메모리에 필요한 주소의 개수는 2048개이다. 이를 표현하기 위해서는 11비트가 필요한데 상위 3비트는 디바이스 주소의 뒷부분을 사용하여 해당 번지를 지정한다. 하위 8비트는 그 뒤의 데이터 공간에 저장되어 전송된다. 아래는 바이트 단위로 저장할 경우의 데이터 포맷을 보여준다.
먼저 START 조건을 만들어 준다. 주고 난 후 디바이스 주소를 전달해야 하는데 위 그림에서 보는 것과 같이 AT24C16의 디바이스 슬레이브 주소는 0xA0이다. 다만 보낼 때 WORD 단위의 주소의 상위 3비트를 포함하고 R/W 여부를 마지막 비트로 하여 전달한다. 쓰기의 경우에는 해당 비트를 0으로 만들어야 한다. 전송이 성공하여 ACK 신호를 받은 후에 나머지 8비트 주소 값을 전달하고 실제로 저장할 데이터를 전송한다. 데이터가 보내진 후에는 다시 ACK 신호를 받는다. ACK 신호는 ATmega2560이 처리를 해주기 때문에 사용자가 신경을 쓰지 않아도 된다. 다 전송이 끝나면 STOP 조건을 보내주어 전송을 종료한다. AT24C16에 데이터 시트에는 쓰는 시간의 최대값을 10ms로 정하고 있다. 쓰기가 완료될 때까지 이 시간만큼 대기한다.
'ATMega256' 카테고리의 다른 글
20140612 - 초음파 센서 (0) | 2014.06.12 |
---|---|
20140610 - TWI 동작 Write/Read 동작 (0) | 2014.06.10 |
20140609 - TWI의 데이터 송신 및 수신 포맷, TWI 레지스터 사용, Device Address (0) | 2014.06.09 |
20140605 - TWI(2-Wire Serial Interface) (0) | 2014.06.05 |
20140603 - DK-128 EXT 배워보쟈 (0) | 2014.06.03 |