본문 바로가기

Embedded

ATmega128간의 TWI통신기능 구현하자 - TWI 관련 레지스터(TWCR, TWSR, TWDR, TWAR 등) (Posted by H2K)


ATmega128의 TWI는 마스터 송신모드(MT), 마스터 수신모드(MR), 슬레이브 송신모드(ST), 슬레이브 수신모드(SR)의 4가지 모드로 동작한다.

  본인은 해당 포스팅을 통해서 궁극적으로 ATmega128간의 TWI통신을 구현하는 것이 목표이다. 그럼 먼저 TWI통신기능을 구현하기 위해서 관련 레지스터에 대해서 알아보자




TWI - 관련 레지스터

물론 해당 포스트는 ATmega128의 datasheet을 토대로 만들었다. 자 그럼 알아보자.

아래 블록도는 TWI모듈 내에 여러 세부모듈을 나타낸 것이다. 이때 굵은 선으로 표시된 레지스터들은 User가 직접 데이터 버스를 통해서 엑세스할 수 있다. 우리들은 이들 레지스터를 이용해서 TWI를 구현하게 된다.



자 그럼 이제 하나씩 알아보도록 하자~~





TWBR (TWI Bit Rate Register)




TWBR 레지스터는 마스터 모드에서 동작하는 bit rate 발생기의 나눗셈 비율을 결정한다. 이때 bit rate 발생기는 마스터 모드에서 SCL의 주파수를 발생하는 주파수 분배기이다.

TWBR 레지스터에 들어갈 값은 아래 식을 이용하여 구한다.






TWCR (TWI Control Register)




TWCR 레지스터는 이름과 같이 TWI의 동작을 제어하는데 사용된다. 이는 Bit별로 의미하는 바가 다르기 때문에 bit별로 알아보자~~>_<

bit 7 : TWINT (TWI Interrupt Flag)

이 비트는 TWI의 현재 작업이 끝나고, 응용 프로그램의 응답을 기다릴 때 하드웨어에 의해 1이 설정된다. 해당 bit가 셋 된 동안은 SCL은 low 상태로 유지되며, 인터럽트 루틴이 실행되어도 클리어 되지 않기 때문에 해당 bit에 1을 써서 소프트웨어적으로 클리어 시켜주어야 한다.

bit 6 : TWEA (TWI Enable Acknoledge bit)

TWEA bit는 Ack 펄스 생성을 제어하는 bit이다. 즉, TWEA가 1로 씌어지면 다음 조건을 만날 때 TWI 버스상에 ACK 신호를 발생하게 된다. ACK신호 발생하는 경우는 datasheet를 참고....;;

bit 5 : TWSTA (TWI Start Condition bit)

TWI통신을 수행하기 위해서 버스가 유용 가능한 상태인지를 하드웨어가 체크하고 나서 해당 bit가 1이 되면, START 신호를 발생한다. 만일 버스상태가 free가 아니라면 TWI 하드웨어는 다음의 STOP 상태가 탐지될 때까지 기다렸다가 새로운 START 신호를 발생하게 된다. 이때 TWSTA bit는 START 신호가 발생한 후에 소프트웨어적으로 클리어시켜 주어야 한다.

bit 4 : TWSTO (TWI STOP Condition bit)

TWSTO bit는 마스터 모드에서 STOP 신호를 생성시키기 위하여 해당 bit 값을 1로 바꾼다. 이때 TWSTO bit는 자동으로 클리어 된다.

bit 3 : TWWC (TWI Write Collision Flag)

TWI 데이터 레지스터(TWDR)에 쓰려고 할 때 TWWC bit가 1이 된다. 이 때 TWINT bit가 low인 상태이어야 한다. 이 플래그는 TWINT가 1인 상태에서 TWDR 레지스터에 쓰면 클리어된다.

bit 2 : TWEN (TWI Enable bit)

TWEN bit에 1을 쓰면 TWI 작동이 가능하게 되며, SCL, SDA핀에 연결된 I/O에 대한 제어권을 갖게 되어 slew rate limiter와 spike filter가 동작된다. 만일 TWEN bit가 클리어되어 0이라면 TWI 통신이 불가능해진다.

bit 1 : Res (Reserved Bit)

해당 bit는 사용되지 않는다.

bit 0 : TWIE (TWI Interrupt Enable bit)

이 bit가 1이고 SREG 레지스터의 I bit가 1로 셋되어 있으면 TWINT 플래그가 1인 동안 TWI 인터럽트 요구가 활성화된다.







TWSR (TWI Status Register)




bit 7~3 : TWS (TWI Status)

5개의 bit는 TWI로직과 TWI 버스의 상태를 나타낸다. 해당 bit들의 값에 따른 상태들은 datasheet을 참고하세요...
예를 들자면 마스터에서 전송된 신호(START, SLA+W, DATA, STOP)에 대한 슬레이브의 ACK응답의 수신 유무에 따라서 해당 bit 값이 변경된다.

bit 2 : Res (Reserved bit)

해당 bit은 사용하지 않는 bit로 항상 0값 유지.

bit 1~0 : TWPS (TWI Prescaler bits)

읽고 쓸 수 있는 bit로, bit rate prescaler를 제어







TWDR (TWI Data Register)






TWDR 레지스터는 다음 전송할 데이터를 저장하게 되며, 수신 모드에서 TWDR은 최근에 수신된 이전 데이터를 갖게 된다.
 




TWAR (TWI Address Register)





TWAR 레지스터는 마스터 모드에서는 사용되지 않는다. 해당 레지스터는 slave device에서 자신의 주소를 저장하는 공간으로, 7bit 주소가 저장된다. 그리하여 마스터에서 TWDR 레지스터에 slave주소를 넣어 전송하게 되면, 해당 주소와 동일한slave 에서는 응답을 하게 된다.

bit 7~1 : TWA (TWI slave Address Register)

7개의 bit로 TWI의 slave주소를 구성한다.

bit 0 : TWGCE (TWI General Call Enable bit)

해당 bit가 1일때 general call(broadcasting)을 인식할 수 있도록 한다. 예를 들면, 마스터에서 START신호를 발생하고 Address를 전송해야할 TWDR에 0x00을 넣어 전송하게 되면 general call을 의미하며, TWGCE가 1인 모든 slave에서는 응답을 하게된다.



이것으로 TWI 관련 레지스터의 간단한 설명을 마치겠습니다~~~

다음 포스트부터는 TWI의 동작에 대한 포스트가 될 것 같군요~~~>_</ㅋ