
I2C 통신설계
I2C 통신
1. I2C ( Inter – Integrated Circuit ) 통신

1980년대 초반 필립스에서 제안한 근거리 통신 방식
MCU, CPU, FPGA 등 주변장치와 통신할 수 있는 통신프로토콜
두 Wire 로 여러 디바이스를 연결할 수 있는 저속 통신 인터페이스
동시에 송수신이 불가한 반이중( Half – Duplex ) 방식
각 Slave 는 각자의 주소를 가지고 주소에 해당하는 Slave만 응답하는 방식
2. I2C 통신구성

SCL ( Serial Clock ) : 통신의 동기를 맞추기 위한 클럭신호를 마스터에서 슬레이브로 전송함
동기화 : 마스터가 SCL 신호를 생성하여 슬레이브와 통신속도를 맞춤
데이터 읽기/쓰기 : SCL 신호의 변화(상승, 하강)에 맞춰 SDA의 데이터를 읽거나 씁니다.
Ex. SCL이 High인 동안 SDA의 상태를 읽어 한 비트의 데이터를 인식
마스터 주도 : 일반적으로 SCL 신호를 마스터 장치에 의해서만 생성
SDA ( Serial Data ) : SCL 의 클럭 신호에 맞추어 마스터와 슬레이브 간에 데이터를 송수신함
양방향 통신 : SDA는 데이터를 보내고 받는데 모두 사용, 마스터가 슬레이브에게 데이터를 보낼 때도, 슬레이브가 마스터에게 응답(ACK)를 보낼 떄도 SDA를 사용
데이터 전송 : SCL 의 클럭 신호에 맞춰 한 번에 한 비트씩 데이터를 전송
시작/정지 조건 : 통신의 시작과 끝을 알리는 데도 SDA가 사용
시작 조건 : SCL이 High인 상태에서 SDA가 High에서 Low로 떨어지는 것
정지 조건 : SCL이 High인 상태에서 SDA가 Low에서 High로 올라가는 것

3. I2C 통신의 장단점
장점)
2개의 입출력 핀을 이용해 장치들의 반이중통신이 가능
2개의 선(SCL, SDA)만으로 여러 장치와 통신할 수 있어 하드웨어 연결이 간단
시스템 동작 중에도 I2C 통신 버스에 새 장치의 추가 및 제거가 가능
하드웨어 구성이 간단하며 대화형 동작이 가능함
멀티 마스터/슬레이브 지원 : 하나의 마스터와 여러 개의 슬레이브가 통신하거나, 여러 개의 마스터가 하나의 버스를 공유
단일 마스터 주소 지정 : 각 슬레이브 장치는 고유한 주소를 가짐, 마스터를 특정 슬레이브를 지정해 통신 가능
단점)
데이터 전송 속도가 SPI나 UART와 비해 상대적 저속 ( 일반모드 : 최대 100kHz, 고속모드 : 최대 400kHz ), 대용량 데이터를 전송하는데 적합하지 않음
(저속 데이터 통신 또는 장치의 제어에 적합)
전이중통신 불가 : 마스터와 Slave가 동시에 데이터를 송신할 수 없음
Slave의 주소값이 7bit로 제한되어 있기 때문에, Slave 장치를 동시에 최대 128개까지만 연결가능 : Slave 장치들 사이에 주소 충돌 가능성 있음
통신 거리의 한계 : 통신 선로의 저항과 커패시턴스 떄문에 통신 거리가 짧고, 거리가 멀어질수록 신호의 안정성이 떨어짐
풀업 저항 필요 : 통신 선로를 항상 High 상태로 유지하지 위해 외부 풀업 저항 필요
복잡한 프로토콜 : UART처럼 단순한 프로토콜에 비해 주소, 데이터, ACK(응답 신호) 비트 등 프로토콜 구조가 더 복잡
I2C 동작 방식
1. I2C Write 동작 방식

Write 동작은 마스터 장치가 슬레이브 장치에게 데이터는 보내는 과정
Master는 SCL 과 SDL핀이 모두 High 상태일때, SDA를 Low로 바꾸어 Slave에게 통신시작을 알림
Master는 통신하고자 하는 Slave의 주소를 SDA를 통해 송신
Master는 해당 주소의 Slave와 통신 ( 송신 )을 수행
Master는 SCL이 High이고 SDA가 Low인 상태에서 SDA를 High로 바꾸어 Slave에게 통신종료를 알림
2. I2C Read 동작 방식

Master 는 SCL 과 SDA 핀이 모두 High 상태일 때, SDA 를 LOW 로 바꾸어 Slave에게 통신시작을 알림
Master 는 통신하고자 하는 Slave 의 주소를 SDA를 통해 송신
Master 는 해달 주소의 Slave 와 통신 ( 수신 )을 수행
Master 는 SCL 이 High 이고 SDA 가 Low 인 상태에서 SDA 를 High 로 바꾸어 Slave에게 통신종료를 알림