임베디드랜드

S3C2800번역본 IIC

ARM/S3C2410 2007. 11. 2. 10:10
IIC-버스 인터페이스

 

 

개괄

 

S3C2800 RISC 마이크로프로세서는 2채널 멀티-마스터 IIC 버스 serial 인터페이스를 지원한다. 양방향 serial 데이터 라인(IICSDAn) serial 클럭 라인(IICSCLKn)을 통해서 버스 마스터와 IIC 버스에 연결된 페리페럴(peripheral) 디바이스 사이에 정보가 전달된다.

 

멀티-마스터 IIC-버스 모드에서, 여러 개의 S3C2800 RISC 마이크로프로세서는 슬래이브 디바이스들에게/로부터 serial 데이터를 수신/전송할 수 있다. 마스터 S3C2800 cpu IIC-버스를 통한 데이터 전송을 초기화할 수 있고, 전송의 마무리를 책임지고 있다. 표준적인 버스 조정(arbitration) 과정이 S3C2800 IIC-버스에 사용되고 있다.

 

멀티-마스터 IIC-버스 동작을 제어하기 위하여, 반드시 다음의 레지스터에 값들이 쓰여져야 한다.

 

l  멀티-마스터 IIC-버스 제어 레지스터, IICCONn

l  멀티-마스터 IIC-버스 제어/상태 레지스터, IICSTATn

l  멀티-마스터 IIC-버스 Tx/Rx 데이터 쉬프트 레지스터, IICDSn

l  멀티-마스터 IIC-버스 주소 레지스터, IICADDn

 

IIC-버스가 자유로울 때, SDA SCL 라인은 모두 하이(high) 레벨에 있어야 한다. SDA 신호의 하이-to-로우 변화는 start 조건을 초기화 할 수 있다. SCL 라인이 여전히 하이 레벨인 상태일 때, SDA 신호의 로우-to-하이 변화는 stop 조건을 초기화할 수 있다.

 

Start stop 조건은 항상 마스터 디바이스에 의해서 생성할 수 있다. 첫번째 데이터 바이트의 7비트 주소 값은, start 조건이 초기화 된 후에 버스에 놓여지는데, 버스 마스터 디바이스가 선택하는 슬래이브 디바이스를 결정한다. 8번째 비트는 전송의 방향 (read 또는 write)을 결정한다.

 

SDA 라인상의 모든 데이터 바이트는 전부 8비트가 되어야 한다. 각각의 버스 전송 시에 주고 받을 수 있는 바이트 숫자는 제한이 없다. 데이터는 항상 most-significant bit (MSB)부터 전송이 되고, 모든 바이트는 반드시 즉각적인 Acknowledge (ACK) 비트가 뒤를 따라와야 한다.

 

 

 

 

 

 

 


 

 

 

그림 16-1 IIC-버스 블록 구성도

 


IIC-버스 동작

 

IIC-버스 인터페이스

 

S3C2800 IIC-버스 인터페이스는 4가지 동작 모드를 지원한다:

 

l  마스터 트랜스미터 모드

l  마스터 리시버 모드

l  슬래이브 트랜스미터 모드

l  슬래이브 리시버 모드

 

이들 동작 모드의 기능적 관계는 아래에 설명되어 있다.

 

START STOP 조건

 

IIC-버스 인터페이스가 inactive일 때, 통상적으로 슬래이브 모드이다. 다시 말하면, SDA 라인에 start 조건이 검출되기 전에는, IIC-버스 인터페이스는 슬래이브 모드에 있어야 한다. (Start 조건은, SCL 라인이 하이(high)인 상태에서 SDA 라인이 로우-to-하이 변화일 때, 초기화 된다.) 인터페이스 상태가 마스터 모드로 바뀌면, SDA라인의 데이터 전송은 초기화되고, SCL (IIC 클럭)이 생성된다.

 

Start 조건은 SDA 라인에 1바이트 serial 데이터를 초기화하고, stop 조건은 데이터 전송을 마무리한다. Stop 조건은 SCL 라인이 하이(high)인 상태에서 SDA 라인이 로우-to-하이 변화를 보인다. Start stop 조건은 항상 마스터에 의해 생성된다. IIC-버스는 start 조건이 발생하면 busy 가 된다. Stop 조건 후 몇 클럭이 지나면, IIC-버스는 다시 자유(free)가 된다.

 

마스터가 start 조건을 초기화하면, 반드시 슬래이브 주소를 보내어서 슬래이브 디바이스에게 알려야 한다. 주소 field 1바이트는 7비트 주소와 1비트 전송 방향 인디케이터 (, write 또는 read)로 구성된다. 만약 비트 80이면, 쓰기 동작을 의미한다. 비트 81이면, 데이터 읽기 (receive 동작)에 대한 요구를 의미한다.

 

마스터는 stop 조건을 전송하여 전송 동작을 마무리할 것이다. 마스터가 버스상에서 데이터 전송을 계속하고자 할 경우, 또다른 start 조건과 슬래이브 주소를 생성하여야 한다. 이러한 방식으로, 읽기와 쓰기 동작이 다양한 포맷으로 수행될 수 있다.

 

그림 16-2. START STOP 조건


데이터 전송 포맷

 

SDA 라인상에 놓인 모든 바이트들의 크기는 8비트가 되어야 한다. 전송시, 전송될 수 있는 바이트의 숫자는 무제한이다. Start 조건 이후 첫번째 바이트는 주소 필드를 가져야 한다. IIC-버스가 마스터 모드일 때, 주소 필드는 마스터에 의해 전송될 수 있다. 매 바이트마다 acknowledgement (ACK)비트가 뒤따라야 한다. Serial 데이터와 주소의 MSB 비트가 항상 먼저 전송된다.

 

 

 

그림 16-2. IIC-버스 인터페이스 데이터 포맷

 


 

 

그림 16-4. IIC-버스상의 데이터 전송

 

 

ACK 신호 전송

 

1바이트 전송 동작을 완전히 끝내려면, 리시버는 트랜스미터에게 하나의 ACK 비트를 보내야 한다. ACK 펄스는 SCL 라인의 9번째 클럭에 나타나야 한다. 8클럭은 1바이트 데이터 전송에 필요하다. 마스터는 ACK비트를 전송하기 위해 필요한 클럭 펄스를 생성해야 한다.

 

ACK 펄스 클럭이 수신될 때, 트랜스미터는 SDL 라인을 하이(high)로 만듦으로써 SDA 라인을 놓아(release)주어야 한다. 마찬가지로, 리시버는 9번째 SCL 펄스의 하이(high) 주기동안 SDA를 로우(low)이기 위해서, ACK 클럭 펄스동안 SDA 라인을 로우(low)로 드라이브해야 한다.

 

ACK 비트 전송 기능은 소프트웨어(IICSTATn) enable/disable될 수 있다. 그러나, SCL 9번째 클럭 위의 ACK펄스는 1바이트 데이터 전송 동작을 마무리하기 위해서 필요하다.

 

 

그림 16-5. IIC-버스상의 Acknowledge

 


읽기-쓰기 동작

 

트랜스미터 모드에서, 데이터가 전송된 후에, IIC-버스 인터페이스는 IICDSn 레지스터에 새로운 데이터가 써질 때까지 기다린다. 새로운 데이터가 써질 때까지, SCL 라인은 로우로 유지된다. 새로운 데이터가 IICDSn 레지스터에 써지고 나면, SCL 라인은 놓여진다. S3C2800은 현재 데이터 전송의 완료를 구분하기 위해서, 인터럽트를 중지(hold)하고 있어야 한다. CPU가 인터럽트 요구를 받은 후에, IICDSn에 다시 새로운 데이터를 써야 한다.

 

리시브 모드에서, 데이터가 수신된 후, IIC-버스 인터페이스는 IICDSn 레지스터가 읽혀질 때까지 기다린다. 새로운 데이터가 읽혀질 때까지, SCL 라인은 로우로 유지된다. 새로운 데이터가 IICDSn 레지스터에서 읽혀진 후, SCL 라인은 놓여진다. S3C2800은 현재 데이터 수신의 완료를 구분하기 위해서, 인터럽트를 중지하고 있어야 한다. CPU가 인터럽트 요구를 받은 후에, IICDSn에서 새로운 데이터를 읽어내야 한다.

 

BUS 조정(arbitration) 과정

 

조정은 SDA 라인에 발생하는데, 두 마스터사이의 버스 분쟁을 예방한다. SDA 라인이 하이인 하나의 마스터가, SDA 라인이 로우로 동작중인 다른 마스터를 검출하면, 이 마스터는 새로운 데이터 전송을 초기화하지 않을 것이다. 왜냐하면, 버스의 현재 레벨이 자기 자신의 레벨에 해당하지 않기 때문이다. 조정 과정은 SDA 라인이 하이가 될 때까지 연장될(extended) 것이다.

 

그러나, 마스터들이 동시에 SDA 라인을 로우로 하게 되면, 각 마스터는 통제권이 자기자신에게 있는지 평가해야 한다. 평가를 하기 위해서, 각 마스터는 주소 비트를 검출해야 한다. 각 마스터가 슬래이브 주소를 생성하지만, 또한 SDA라인의 주소비트를 검출해야 한다. 왜냐하면, SDA라인은 하이로 유지하는 것보다 로우로 유지하는 것이 더 강하기 때문이다. 예를 들면, 한 마스터가 주소의 첫 비트를 로우로 생성하고, 다른 마스터는 하이일 경우이다. 이 경우, 두 마스터들은 버스상에서 로우 신호를 검출하게 될 것이다. 심지어 마스터가 먼저 하이로 유지하고 있었더라도, 하이 신호를 유지하는 것보다 로우 신호를 만드는 것이 훨씬 강하기 때문이다. 이러한 일이 발생하면, 로우로 생성한 마스터가 통제권을 갖게 되고, 하이를 생성한 마스터는 통제권을 빼앗기게 된다. 만약 두 마스터가 주소의 첫번째 비트를 로우로 생성하더라도, 다시 두번째 주소 비트에 대하여 조정이 발생한다. 이러한 조정은 주소의 마지막 비트까지 계속될 것이다.

 

ABORT 조건

 

슬래이브 리시버가 슬래이브 주소에 대한 응답을 할 수 없다면, SDA 라인을 하이로 유지해야 한다. 이 경우, 마스터는 stop 조건을 발생해야 하고, 전송을 취소해야 한다.

 

마스터 리시버가 취소된 전송에 관여하고 있었다면, 슬래이브로부터 마지막 데이터 바이트를 수신한 이후에, ACK 신호의 생성을 취소하여 슬래이브 전송 동작의 종료를 알려야 한다. 그때 슬래이브 트랜스미터는 SDA 라인을 놓아주어서 마스터가 stop 조건을 생성하도록 해야 한다.

 

IIC-버스 설정

 

Serial 클럭(SCL)의 주파수를 제어하기 위해, 4비트 프리스케일러 값이 IICCONn 레지스터에 프로그램될 수 있다. IIC-버스 인터페이즈 주소는 IIC-버스 주소 레지스터, IICADDn에 저장된다. (디폴트로, IIC-버스 인터페이스 주소는 알 수 없는(unknown) 값이다.)

 


각 모드별 동작 플로우차트

 

다음의 단계들은 모든 IIC Tx/Rx 동작 전에 수행되어야 한다.

 

1) 필요하다면 자신의 slave 주소를 IICADDn에 쓴다.

2) IICCONn 레지스터을 설정한다.

a) 인터럽트를 Enable 한다.

b) SCL 주기를 정의한다.

3) Serial output 이 가능하도록 IICSTATn을 설정한다.

 

 

 

그림 16-6. 마스터/트랜스미터 모드의 동작

 


 

 

그림 16-7. 마스터/리시버 모드의 동작

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

그림 16-8. 슬래이브/트랜스미터 모드의 동작

 

 

 

 


 

 

그림 16-9. 슬래이브/리시버 모드의 동작

 

 

 

 

 

 

 

 


IIC-버스 인터페이스 특수 기능 레지스터들

 

IIC-버스 제어 레지스터 (IICCONn)

 

레지스터

주소

읽기/쓰기

설명

리셋 값

IICCON0

0x1019 0000

읽기/쓰기

IIC-버스 0 제어 레지스터

0x0000 0020

IICCON1

0x101A 0000

읽기/쓰기

IIC-버스 1 제어 레지스터

0x0000 0020

 

 

IICCONn

비트

설명

초기 상태

Acknowledge enable (1)

[6]

IIC-버스 acknowledge enable 비트

0 = ACK 생성 Disable

1 = ACK 생성 Enable

 

Tx모드에서, ack 시에 IICSDA free.

Rx모드에서, ack 시에 IICSDA Low.

0

Tx 클럭 source

선택

[5]

IIC-버스 transmit 클럭 프리스케일러의 Source 클럭 선택 비트

0 = IICCLK = APBCLK/16

1 = IICCLK = APBCLK/256

1

Tx/Rx 인터럽트

enable

[4]

IIC-버스 Tx/Rx 인터럽트 enable/disable 비트

0 = 인터럽트 Disable

1 = 인터럽트 Enable

0

Transmit 클럭 값 (2)

[3:0]

IIC-버스 transmit 클럭 프리스케일러

IIC-버스 transmit 클럭 주파수는 이 4비트 프리스케일러 값으로 결정되는데, 다음 공식에 따른다.

Tx 클럭 = IICCLK/(IICCON[3:0]+1)

0x0

 

주의 :

1. EEPROM을 연결할 때, Rx모드에서 STOP조건을 발생하기 위해서 마지막 데이터를 읽기 전 ACK 생성이 diable 되어야 할지도 모른다.

2. IICCLK IICCON[5]에의해 결정된다.

Tx 클럭은 SCL 전송 시간에 의해 변할 수 있다.

 

 

 

16-1. IICSCL 설정 예제

 

IIC_SCL (KHz)

APBCLK = 50MHz

APBCLK = 37.5MHz

 

IICCON[5]

IICCON[3:0]

IICCON[5]

IICCON[3:0]

100 (Real = 73.2)

-

-

1 = APBCLK/256

0x1 = IICCLK/2

100 (Real = 97.7)

1 = APBCLK/256

0x1 = IICCLK/2

-

-

400 (Real = 390.6)

0 = APBCLK/16

0x7 = IICCLK/8

0 = APBCLK/16

0x5 = IICCLK/6

 

 


IIC-버스 제어/상태 레지스터 (IICSTATn)

 

레지스터

주소

읽기/쓰기

설명

리셋 값

IICSTAT0

0x1019 0004

읽기/쓰기

IIC-버스 0 제어/상태 레지스터

0x0000 0000

IICSTAT1

0x101A 0004

읽기/쓰기

IIC-버스 1 제어/상태 레지스터

0x0000 0000

 

 

IICSTATn

비트

설명

초기 상태

모드 선택

[7:6]

IIC-버스 master/slave Tx/Rx 모드

선택 비트:

00 : Slave receive 모드

01 : Slave transmit 모드

10 : Master receive 모드

11 : Master transmit 모드

00

Busy 신호 상태/

START STOP 조건

[5]

IIC-버스 busy 신호 상태 비트:

0 = read) IIC-버스 not busy. (IIC는 버스의 start/stop 조건을 항상 감지 한다.)

write) IIC-버스 stop 조건 발생

1 = read) IIC-버스 busy

write) IIC-버스 start 조건 발생

 

IICDSn의 데이터는 start신호 바로 다음에 자동적으로 전송될 것이다. 또한, start조건을 점검하기위한 delay도 자동적으로 insert 될 것이다.

0

Serial Output enable

[4]

IIC-버스 데이터 출력 enable/disable

비트:

0 = Disable Rx/Tx,  1 = Enable Rx/Tx

0

Arbitration 상태 flag

[3]

IIC-버스 arbitration 과정 상태 flag 비트:

0 = 버스 arbitration 성공

1 = 버스 arbitration 실패 (serial I/O )

0

주소/데이터 field

classification field

[2]

IIC-버스 주소/데이터 classification 비트:

0 = 리셋일 때 , START/STOP일 때, 또는 수신된 데이터가 데이터 field일 때

1 = 수신된 slave 주소가 IICADDn 레지스터와 같을 때, 또는 일반적인 call일때

0

주소 zero 상태 flag

[1]

IIC-버스 주소 zero 상태 flag 비트:

0 = start/stop 조건이 SDA/SCL line에서 검출되었을 때, clear.

1 = 수신된 slave 주소가 000000000b

0

Last-received 비트 상태 flag

[0]

IIC-버스 last-received 비트 상태 flag 비트:

0 = last-received 비트 = 0

(ACK 수신됨)

1 = last-received 비트 = 1

(ACK 수신안됨)

0

 

 

 

 

 


IIC-버스 주소 레지스터 (IICADDn)

 

레지스터

주소

읽기/쓰기

설명

리셋 값

IICADD0

0x1019 0008

읽기/쓰기

IIC-버스 0 주소 레지스터

미정

IICADD1

0x101A 0008

읽기/쓰기

IIC-버스 1 주소 레지스터

미정

 

 

IICADDn

비트

설명

초기 상태

Slave 주소

[7:0]

IIC-버스에서 래치된 7비트 slave 주소:

IICSTATn serial output enable = 0일때, IICADDn write-enabled이다. IICADDn 값은, 현재의 serial output enable 비트 (IICSTATn) 설정과는 상관없이, 언제든지 읽을 수 있다

IICADDn IIC 모드가 slave receive / transmit 모드일 때에만 사용된다.

Slave 주소 = [7:1]

Not mapped = [0]

미정

 

 

 

IIC-버스 TRANSMIT/RECEIVE 데이터 쉬프트 레지스터 (IICDSn)

 

레지스터

주소

읽기/쓰기

설명

리셋 값

IICDS0

0x1019 000C

읽기/쓰기

IIC-버스 0 transmit/receive 데이타 쉬프트 레지스터

미정

IICDS1

0x101A 000C

읽기/쓰기

IIC-버스 1 transmit/receive 데이터 쉬프트 레지스터

미정

 

 

IICDSn

비트

설명

초기 상태

데이터 쉬프트

[7:0]

IIC-버스 Tx/Rx 동작을 위한 8비트 데이터 쉬프트 레지스터 :

IICSTATn serial output enable = 1일때, IICDSn write-enabled이다. IICDSn 값은 현재의 serial output enable 비트(IICSTATn) 설정과는 상관없이, 언제든지 읽을 수 있다.

주의 : start 조건 직후 전송된 데이터의 비트[0]은 모드 선택 비트에 의해 결정된다. 만약 모드 선택 비트가 receive이면, 그 비트는 1(read)가 될 것이다. 만약 모드 선택 비트가 transmit이면, 그 비트는 0(write)가 될 것이다.

미정

 
2007/11/02 - [임베디드/ARM] - S3C2800번역본 리모트 제어
2007/11/02 - [임베디드/ARM] - S3C2800번역본 UART
2007/11/02 - [임베디드/ARM] - S3C2800번역본 WATCHDOG

Posted by suvisor