(굵은■ 테두리 레지스터는 SW에서 데이터 접근이 가능한 레지스터)
1) Start/Stop controller
2) 중재 detection 기능
3) (N)Ack 응답신호 보낸다.
👉 TWDR(TWI Data Register) : 전송할 데이터, address를 저장해서 보낸다. SDA에 연결
1) 통신 속도를 지정
2) 마스터 모드로 동작할 때 SCL 클럭을 조절
1) TWAR(Address Register)이 7비트 TWI 슬레이브 주소를 결정한다.
2) TWGCE=1일 때 전체 슬레이브 호출된다.
TWCR(TWI Control Register)
1) TWINT(7bit)=1 새로운 동작을 할 수 있는 준비 상태, 준비 상태가 완료 되었을 때
1 → 0으로 만들어주면 다음 동작 시작(만약 TWINT=0, SCL line은 Low로 기능 정지)
2) TWEA(TWI Enable Acknowledge bit)=1 ACK(허가) 신호 발생, TWEA=0 연결 종료
3) TWSTA(TWI Start Condition bit)=1 마스터로 동작, TWSTA=0 슬레이브로 동작
4) TWSTO(TWI Stop Condition bit) : Stop bit, 마스터모드에서 TWSTO=1 STOP 조건 출력, 슬레이브모드에서 TWSTO=1 슬레이브 수신 대기 상태
5) TWWC(TWI Write Collision Flac)=1 충돌 발생
6) TWEN(TWI Enable)=1 PD0과 PD1을 SCL과 SDA 신호핀으로 사용
7) TWIE(TWI Interrupt Enable) : TWINT flag=high일 때 인터럽트 발생
TWSR(TWI Status Register)
1) TWSR은 이벤트의 동작 상태만 기록
2) TWS3=0 or 1 일 때 이 값을 16진수로 표현하면 0 or 8이다. 이것을 통해 데이터가 제대로 전송되었는지 확인할 수 있다.
1) TWINT=1일 때 동작완료
2) 인터럽트 flag가 set이 되면(=1이 되면) 동작완료, clear(=0이 되면) 시작신호를 의미
👉 TWI 통신은 인터럽트 기반의 바이트 단위를 전송하고 바이트단위로 송수신 될 때마다 TWINT=1이 된다(송수신이 끝나면 1로 되어 준비 상태가 되고 0이 되면 다음 동작 가능)
TWINT를 1에서 0으로 clear되면 전송(HW적으로는 1로 되는 기능만 가지고 있고 0으로 만드는 건 SW로만 가능하다)
마스터 전송 모드로 마스터에서 슬레이브로 데이터 전송, 마스터가 항상 클럭 만들어 동기화
각 단계별 신호가 제대로 전달되었는지 S/W로 확인
👉 TWSR의 값을 읽었을 때 정상/오류 확인 가능(00x08, 0x18, 0x38등)
1) TWCR의 초기값이 0인 상태에서 TWINT가 1이 되어서 준비 상태가 완료 되었을 때
0으로 전환 되면 동작할 수 있다.
2) 동시에 TWSTA가 1일 때 동작 시작
TWCR =0xa4; //start condition transmit(TWINT=0)
while(!(TWCR & 0x80) || ((TWSR & 0xf8) !=0x08); //TWINT가 1이되고 TWSR이 0x08되면 전송된것이고 빠져나감
//두 조건이 False가 되어야 함, TWINT는 start신호를 내보내면 set됨. TWSR의 값이 0x08이면 start신호 전송완료 의미함
1) Master : Slave+W 신호를 TWDR(data register)에 넣음
unsigned char addr = 0x07; //slave address
TWDR=(addr<<1)&0xfe; //W=0로 만듬
2) Slave : Slave Address = 0b0000 0111(10진수7)라고 하면 slave의 TWDR에
unsigned addr=0x07;
TWAR=((addr<<1)&0xfe); //를 저장한다.
주소와 w=0의 값을 정상적으로 전송되었는지 확인한다.
정상적인 작동 상태 : 상태 레지스터에서 $18(ACK) or $20(NACK)이 만들어진다.
TWINT==1 && ACK 신호확인을 통해 0x18인지 확인한다.
while(!(TWCR & 0x80)) || ((TWSR & 0xf8) != 0x18))
//0x18이 아닌 수신신호가 도달되었을때 처리되는 routine
unsigned char iic_write(unsigned char data){ // send data to the previously addressed device
TWDR=data; TWCR=TWINT|TWEN; //TWINT=0x80,TWEN=0x04로 TWDR의 내용을 TWI방식으로 동작시켜라
i2c_timer=255; while(!(TWCR&TWINT)&&i2c_timer--); //TWINT가 1이 되거나 timer가 감소하여 0될 때 까지 기다림
if(i2c_timer==0)return 1; //TWINT가 1이 안된 상태에서 타이머가 0이되면 비정상 동작으로 return
twst=TWSR&0xF8; // masking
if(twst!=TW_MT_DATA_ACK)return 1; // data정상전송코드 0x28과 다른 값이 읽혔으면 비정상적처리로 return
return 0; // 0x28이 읽히면 정상적처리
}
TWINT=1은 슬레이브에 address 보내는 before 동작이 완료되었다는 뜻으로 다음 동작 기다린다.
TWINT를 clear하고 이때 TWCR은 TWSTA=TWSTO=0이 된다.
MASTER TWI
unsigned char data;
TWDR=data; //데이터 입력
TWCR=0x84; //TWINT를 clear시키면 TWDR값 전송함
While( !(TWCR & 0x80) || (!(TWSR & 0xf8)==0x28)): //전송까지 기다림
Stop 신호인 p신호를 보내기 위해서 TWCR 0x94가 되어야한다.
Stop 조건 전송 후 TWINT는 Set 되지 않는다.
MASTER TWI
TWCR=0x94; //Stop 조건
정상적인 신호를 보내려면 $10을 보낸다.
MASTER TWI
TWCR=0xa4; // Rs신호발생
👉 TWINT에 S/W로 1을 기록하여 다음 동작을 개시하도록 한다=준비완료
(H/W적으로는 clear되지 않는다.)
TWINT를 clear(1→0)함으로서 TWI는 TWCR에 설정시켜 놓은 동작을 시작한다.