본문 바로가기

Programming/General

I2C 파형 read write 정리

찰칵찰칵 님의 I2C 정리 부분

내가 본 한글 자료중 가장 잘 정리되어 있는 자료다.


원문 : http://cafe.naver.com/firstpicturestory/33







I2C 정리

 

-개념

Inter-Integrated Circuit의 약자

SCL(클럭), SDA(테이타)의 두개의 라인을 사용.

100Kbit/s(Standard Mode)~3.4Mbit/s(High-speed Mode)까지의 양방향 통신.

일반적으로 40~400Kbits의 속도로 사용됨

 

통신의특성

           신호는 크게 Start, data, stop 로 나뉜다.

Start  SCL  high 일 때 SDA 가 falling으로 가는 경우로 Slave 에게 I2C 의 시작 됨을알린다.

Stop  SCL  high 일 때 SDA  rising으로 가는 경우로 Slave 에게 종료를 알린다

Data  SCL low 일 때 SDA 가 변하며 SCL high 일때 SDA의 값은 유효한 값으로 안정화 상태 여야 한다.

보통 Data 신호는 Device ID >> Address  >> Data 순서로 나간다.

 

 

Data 는 총 9bits 가 나가며 8bits 는 데이터고 마지막 1bit 1byte 전송이 제대로 전송되었는지를 알려주는 Ack(low) , NAck(high) 신호이다.

 

통신의 예

1) Write

위 그림은 쓰기 작업의 예이다표 위의 신호가 SCL 신호이며 그 아래 신호가 SDA 신호이다.

 

1.     SCL 신호가 high 일 때 SDA 신호의 falling 으로 Start 가 되었고

2.     1byte  Device ID 가 나가고 Ack(low) 가 뜨고

3.     1byte  Address 가 나가고 또 한번 Ack(low)가 뜨고

4.     data  1byte 나가고 Ack가 뜸으로서 전송이 되고

5.     SCL 신호가 high 일 때 SDA 신호의 rising 으로 stop 이 된다.

1byte 단위로 해석해보자면

 

01100110

0

00010010

0

00100001

0

Device ID

Ack

Address

Ack

Data

Ack

0x66

 

0x12

 

0x21

 

Master 전송

Slave 응답

Master 전송

Slave 응답

Master 전송

Slave 응답

 

0x66  Device ID 를 가진 장치의 Address 0x12 번지의 주소에 0x21 라는 Data  write 했다

 

2) Read

 

위 그림은 읽기작업의 예이고 위와 마찬가지로 SCL이 위의 신호이고 SDA가 아래신호이다.

1.     SCL 신호가 high 일 때 SDA 신호의 falling 으로 Start 가 되었고

2.     1byte  Device ID 가 나가고 Ack(low) 가 뜨고

3.     1byte  Address 가 나가고 또 한번 Ack(low)가 뜬다 (여기까진 Write와동일)

4.     다시 한번 SCL 신호가 high 일 때 SDA 신호의 falling 으로 Start 가 되었고

5.     1byte  Device ID+1 이 나가고 Ack(low) 가 뜨고

6.     slave쪽에서 data 1byte 나가고 Master NAck(high)를 뜸으로서 Read 완료가되고

7.     SCL 신호가 high 일 때 SDA 신호의 rising 으로 stop 이 된다.

 

1byte 단위로 해석해보자면

 

01100110

0

00010010

0

1

01100111

0

00100001

1

Device ID

Ack

Address

Ack

rs

Device ID+1

Ack

Data

Nack

0x66

 

0x12

 

rs

0x67

 

0x21

 

Master

전송

Slave 응답

Master

전송

Slave 응답

 

Master

전송

Slave 응답

Slave

전송

Master 응답

 

0x66  Device ID 를 가진장치의Address 0x12 번지의 주소에있는 0x21 라는 Data 를 Read 했다

 

 

 

실제 파형분석

1) Write  (iiw 0x50 0x15 0x11)

 

파란색이 SCL 이고 노란색이 SDA 이다

 

01010000

0

00010101

0

00010001

0

Device ID

Ack

Address

Ack

Data

Ack

0x50

 

0x15

 

0x11

 

Master 전송

Slave 응답

Master 전송

Slave 응답

Master 전송

Slave 응답

 

0x50  Device ID 를 가진 장치의 Address 0x15 번지의 주소에 0x11 라는 Data  write 했다

 

 

 

 

2) Read ( iir 0x50 0x15 0x03 )

 

3개의 레지스터를 읽었기 때문에 3번의 Read 작업이 되었고

01010000

0

00010101

0

1

01010001

0

00010001

1

Device ID

Ack

Address

Ack

rs

Device ID+1

Ack

Data

Nack

0x50

 

0x15

 

rs

0x51

 

0x11

 

Master

전송

Slave 응답

Master

전송

Slave 응답

 

Master

전송

Slave 응답

Slave

전송

Master 응답

0x50  Device ID 를 가진장치의Address 0x15 번지의 주소에있는 0x11 라는 Data 를 Read 했다

 

01010000

0

00010110

0

1

01010001

0

00000000

1

Device ID

Ack

Address

Ack

rs

Device ID+1

Ack

Data

Nack

0x50

 

0x16

 

rs

0x51

 

0x11

 

Master

전송

Slave 응답

Master

전송

Slave 응답

 

Master

전송

Slave 응답

Slave

전송

Master 응답

0x50  Device ID 를 가진장치의Address 0x16 번지의 주소에있는 0x00 라는 Data 를 Read 했다

 

01010000

0

00010111

0

1

01010001

0

00000000

1

Device ID

Ack

Address

Ack

rs

Device ID+1

Ack

Data

Nack

0x50

 

0x17

 

rs

0x51

 

0x11

 

Master

전송

Slave 응답

Master

전송

Slave 응답

 

Master

전송

Slave 응답

Slave

전송

Master 응답

0x50  Device ID 를 가진장치의Address 0x17 번지의 주소에있는 0x00 라는 Data 를 Read 했다

 

 

정리

위와 같은 방법으로 I2C 통신의 Write , Read 작업이 수행된다.

'Programming > General' 카테고리의 다른 글

git 간편 안내서  (0) 2013.11.01
git 커맨드 시트  (0) 2013.09.13
text 기반의 계산기 pcalc  (0) 2010.11.15
shift 연산자(>>)를 이용한 곱셈과 나눗셈  (0) 2010.10.20
nand flash - ftl(last, ECC, FSOC)  (1) 2010.09.28