찰칵찰칵 님의 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 |