ATmega128 TWI 구조

문주은·2021년 1월 3일
0

메디컬IOT

목록 보기
11/13

(굵은■ 테두리 레지스터는 SW에서 데이터 접근이 가능한 레지스터)

  • BUS Interface Unit

    1) Start/Stop controller
    2) 중재 detection 기능
    3) (N)Ack 응답신호 보낸다.
    👉 TWDR(TWI Data Register) : 전송할 데이터, address를 저장해서 보낸다. SDA에 연결

  • Bit rate generator unit

    1) 통신 속도를 지정
    2) 마스터 모드로 동작할 때 SCL 클럭을 조절

  • Addresss Match Unit

    1) TWAR(Address Register)이 7비트 TWI 슬레이브 주소를 결정한다.
    2) TWGCE=1일 때 전체 슬레이브 호출된다.

  • Control Unit

    • 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. TWI Bus

1) TWINT=1일 때 동작완료
2) 인터럽트 flag가 set이 되면(=1이 되면) 동작완료, clear(=0이 되면) 시작신호를 의미

👉 TWI 통신은 인터럽트 기반의 바이트 단위를 전송하고 바이트단위로 송수신 될 때마다 TWINT=1이 된다(송수신이 끝나면 1로 되어 준비 상태가 되고 0이 되면 다음 동작 가능)
TWINT를 1에서 0으로 clear되면 전송(HW적으로는 1로 되는 기능만 가지고 있고 0으로 만드는 건 SW로만 가능하다)

2. Master Transimtter Mode(MT mode)

마스터 전송 모드로 마스터에서 슬레이브로 데이터 전송, 마스터가 항상 클럭 만들어 동기화
각 단계별 신호가 제대로 전달되었는지 S/W로 확인
👉 TWSR의 값을 읽었을 때 정상/오류 확인 가능(00x08, 0x18, 0x38등)

  • START 전송

    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신호 전송완료 의미함
  • TWDR에 주소와 W=0값을 넣어줌

    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);	//를 저장한다.
  • 주소와 Write 신호 전송 시작 신호 발생

    주소와 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이 읽히면 정상적처리
}
  • Data를 TWDR에 넣고 전송 시작신호를 발생

    TWINT=1은 슬레이브에 address 보내는 before 동작이 완료되었다는 뜻으로 다음 동작 기다린다.
    TWINT를 clear하고 이때 TWCR은 TWSTA=TWSTO=0이 된다.

    MASTER TWI
    unsigned char data;
    TWDR=data;	//데이터 입력
    TWCR=0x84;	//TWINT를 clear시키면 TWDR값 전송함
  • Data 정상 전송 확인

    While( !(TWCR & 0x80) || (!(TWSR & 0xf8)==0x28)):  //전송까지 기다림
  • Stop Condition Transmit

    Stop 신호인 p신호를 보내기 위해서 TWCR 0x94가 되어야한다.
    Stop 조건 전송 후 TWINT는 Set 되지 않는다.

    MASTER TWI
    TWCR=0x94;			//Stop 조건
  • 필요시 Repeated Start Condition 전송

    정상적인 신호를 보내려면 $10을 보낸다.

    MASTER TWI
    TWCR=0xa4;	// Rs신호발생

👉 TWINT에 S/W로 1을 기록하여 다음 동작을 개시하도록 한다=준비완료
(H/W적으로는 clear되지 않는다.)
TWINT를 clear(1→0)함으로서 TWI는 TWCR에 설정시켜 놓은 동작을 시작한다.

profile
Data Engineer

0개의 댓글