본문 바로가기
코스웨어/14년 스마트컨트롤러

2014년 6월 5일 업무일지 허수웅 [출석번호 22번]

by 알 수 없는 사용자 2014. 6. 7.
728x90
반응형
TWI (Two Wire Interface)


Byte Oriented 2-Wire Serial Interface  ->  바이트를 지향하는 2선 TWI

스트리밍 방식 - 정해지지 않은(명확하지 않은 크기의) 데이터를 그때 그때  보낼 때
                   ↕
구조체 방식(블럭 방식) - 정해진 크기의 데이터를 보낼 때

 


시리얼 통신에서 2선 통신 중에


  


TWI와 UART 방식이 있는데 차이는 UART 두개의 선으로 따로따로 송신과 수신을 하는 반면 TWI는 SDA하나로 송수신을 한다.


I²C(Inter-Intergrated Circuit)통신

 

1980년대 초에 필립스사에서 제안한 IC소자들을 연결하기 위한 던거리용 2선식 직렬통신 버스 

특징

-SDA,SCL 2개의 선으로 양방향 직렬통신을 수행

-반드시 마스터와 슬레이브 사이에 직렬 동기식 양방향 데이터 통신을 수행

-마스터가 데이터를 송신 또는 수신을 하기 위하여 데이터 SDA는 양방향 신호

-마스터가 데이터를 송신 또는 수신하더라도 클록 신호 SCL은 항상 마스터가 발생

-100Kbps,400Kbps,3.4Mbps의 3가지 전송속도 지원

-마스터가 슬레이브에게 7비트 또는 10비트 어드레스로 지정(어드레스=장치번호 or 장치ID)

-마스터가 전체호출 기능으로 전체 슬레이브를 동시에 지정하는 것이 가능

-멀티마스터 조정 기능 지원


전체 시스템의 구성을 보게 되면 장치는 여러개 연결이 가능하며 장치의 식별은 ID(고유번호)를 통하여 한다.

풀업저항은 연결함으로서 명확한 신호(H,L)를 보장한다.

ATmaga 2560 에서는 7비트의 어드레스를 지정하는데 이것은 장치의 ID를 의미 하고 0~127까지 지정할 수 있으며 총 128개 까지 장치연결이 가능하다.

전송속도는 400Kbps를 사용하여야 한다.

전송을 시작하고 클록을 발생하며 전송을 종료하는 모든 일을 주관하는 측의 장치를 마스터(master)
마스터에 의하여 주소가 지정되어 동작하는 측의 장치를 슬레이브(slave) 라고 한다.

원래는 시작조건과 정지 조건을 LCD처럼 상황에 따라 설정을 해 주어야 하나 있는 것들은 구지 설정할 필요가 없다.


데이터 송신 및 수신 포맷 

데이터 송신

①마스터가 슬레이브에게 데이터를 송신할 때는 먼저 마스터가 7비트의 슬레이브 어드레스를 보낸다.

②송신을 의미하는 L상태의 1비트를 보낸다.

③지정된 어드레스를 가지고 있는 슬레이브는 L상태의 1비트 확인신호로 응답한다.

④마스터는 n바이트의 데이터를 연속으로 송신하며 각 바이트를 송신할 때마다 해당 슬레이브로부터 확인 비트로 응답을 받는다.

 

데이터 수신

①마스터가 슬레이브로부터 데이터를 수신할 때는 먼저 마스터가 7비트의 슬레이브 어드레스를 보낸다.

②수신을 의미하는 H상태의 1비트를 보낸다.

③지정된 에드레스를 가지고 있는 슬레이브는 L상태의 1비트 확인 신호로 응답한다.

④마스터는 n바이트의 데이터를 연속으로 수신하며 각 바이트를 수신할 때마다 해당 슬레이브에게 확인 비트로 응답한다.




TWI 블럭도


빨간표시로 된 네모가 레지스터로 총 5개가 있다.

레지스터 중 TWBR(TWI Bit Rate Register) 을 보게 되면 TWI 비트속도 레지스터로 속도주파수를 계산하는 식이 있다.

 

TWPS를 1로 가정하고 계산해 보면 TWBR이 3이 나온다.

즉, 400Kbps 속도로 하기 위해서는 TWPS 1 이면 TWBR을 3으로 해주어야 한다.

 

회로 연결

 

 

DK128에서 J18번의 1번에는 ATmega 2560  43번에  2번은  44번에 연결해 준다.

 

레지스터 정의

#ifndef _TWI_H_
#define _TWI_H_

#include "Smart.h"

#define TWBR     (*((volatile unsigned char *)0xB8))
#define TWCR  (*((volatile unsigned char *)0xBC))
#define TWSR     (*((volatile unsigned char *)0xB9))
#define TWDR  (*((volatile unsigned char *)0xBB))
#define TWAR     (*((volatile unsigned char *)0xBA))
   
//TWCR
#define TWINT   7
#define TWEA    6
#define TWSTA   5
#define TWSTO   4
#define TWWC    3
#define TWEN    2
#define TWIE    0

//TWSR
#define TWS7    7
#define TWS6    6
#define TWS5    5
#define TWS4    4
#define TWS3    3
#define TWPS1   1
#define TWPS0   0

//TWAR
#define TWA6    7
#define TWA5    6
#define TWA4    5
#define TWA3    4
#define TWA2    3
#define TWA1    2
#define TWA0    1
#define TWGCE   0


#endif //_TWI_H_

이상 정리를 마칩니다.

잘못되었거나 수정되어야하는 부분 댓글 부탁드려요~

늦게 올리네요. 죄송합니다. 즐거운 주말들 보내세요~

728x90