어허

[스크랩] i2c study 본문

개발/Embedded

[스크랩] i2c study

AKDK 2011. 11. 9. 13:25
728x90

유영창이란분이 쓴 글인것 같다. 여기저기 블로그에 출처 없이 돌아다니는걸 보니 저작권 그런건 없는듯


자 시작.

I2C란 무엇인가?

I2C(I-square-C, ‘아이스퀘어시’라고 보통 부른다)란 필립스가 제안한 통신 방식이다. Inter-IC라고도 불리지만 이 명칭은 그리 잘 쓰이지 않는 명칭이다. I2C는 로컬 버스라고 부르는 병렬 버스와 다르게 주변 장치를 단지 두 가닥의 신호선으로만 연결하여 동작하는 양방향 직렬 버스 규격이다. 필립스는 TV, VCR, 오디오 장비 등과 같은 대량 생산되는 제품용으로 I2C 버스를 이미 20년 전에 소개했는데 지금은 내장 장치를 다루기 위한 사실상의 표준 솔루션이 되었다. I2C 버스에는 표준, 고속, 초고속 등 속도에 따라 세 가지 데이터 전송 모드가 있다. 표준 모드는 100Kbps, 고속은 400Kbps 그리고 초고속 모드에서는 최고 3.4Mbps의 속도를 지원한다. 이 세 가지 모두 하위 호환성을 갖는다. I2C 버스는 각 장치에 7비트와 10비트 주소를 지정하여 여러 장치들을 독립적으로 접근할 수 있다.
 
<그림 1>에서 보듯이 I2C 버스는 SDA(Serial DAta Line) 신호선과 SCL(Serial Clock Line) 신호선으로 통신의 주체가 되는 마스터인 MCU와 통신 대상이 되는 주변 장치인 슬레이브(slave) 간에 데이터를 전달하고 받는다.
 
디바이스 주소
슬레이브가 되는 디바이스를 지정하기 위해 사용되는 주소는 7비트로 표현되거나 10비트로 표현된다. 대부분의 디바이스들은 7비트 형식의 주소를 사용한다. 이런 이유로 7비트 형식의 주소를 사용하는 경우라면 마스터(master)가 지정할 수 있는 장치는 128개로 한정된다. 주소는 디바이스 따라서 디바이스 제작사에서 정해지기도 하고 디바이스의 외부 핀을 이용하여 지정할 수도 있다. 핀 수가 적은 패키지 형식의 디바이스라면 주소의 상위 비트는 고정되고 하위 비트만 지정하는 경우가 일반적이다. 그래서 I2C 버스에 연결되는 디바이스와 통신하는 프로그램을 작성하는 프로그래머라면 반드시 매뉴얼을 참조하여 해당 디바이스 주소를 알고 있어야 한다.
 
SCL, SDA 신호선
I2C 버스를 이용하여 MCU가 디바이스에 데이터를 써 넣거나 읽어 들이기 위해서는 SCL과 SDA라는 신호선을 제어해야 한다. SCL은 데이터를 전달하기 위한 동기용 클럭을 전달하는 신호선이고 SDA는 전달하고자 하는 데이터의 비트 정보를 표현하기 위한 신호선이다. SCL은 데이터의 전달을 위한 클럭 동기 신호선으로 이 클럭 신호는 마스터에서 공급한다. 그래서 SCL은 마스터에서 슬레이브로 전달되는 단방향 신호선이다. 그러나 SDA는 마스터에서 슬레이브로 데이터를 전달하거나 슬레이브에서 마스터로 데이터를 가져오기 때문에 양방향 신호선이다.
 
하드웨어적인 접속 방법은 이 컬럼의 특성상 다룰 이야기가 아니므로 버스에 연결되는 저항에 대한 설명이나 디바이스에 인가되는 전압과 같은 처리에 대한 것은 설명하지 않겠다.
 
I2C 버스의 데이터 전송
I2C는 시리얼 전송 방식을 사용하기 때문에 데이터의 전달은 기본적으로 비트 정보를 전달한다고 이해해야 한다. I2C 버스에서 비트 데이터들을 디바이스에 써 넣거나 읽기 위해서는 다음과 같은 기본적인 표현요소가 필요하다.
◆ 마스터가 슬레이브에 전송을 시작한다는 표현 - Start
◆ 전송 목적지의 주소 표현 - Address
◆ 전송 목적 표현(읽기용인가 또는 쓰기용인가) - R/W
◆ 전송 데이터 표현 - Data
◆ 슬레이브가 정상적으로 데이터를 수신했다는 응답 표현 - Ack
◆ 전송 종료 표현 - Stop
이와 같은 표현을 포함하여 I2C 버스상에서 데이터를 전송하는 기본 데이터는 8비트 단위로 지정한다. 시작과 종료, 응답 표현은 1비트로 지정한다. I2C에서 데이터를 전송하는 포맷은 <그림 2>와 같은 형태가 된다.
 
START 표현
Start는 마스터가 슬레이브에 전송 시작을 알리기 위한 것으로 I2C 버스를 사용하겠다는 신호의 시작이다. 이 신호는 1비트 형태로 구현되며 SCL이 HIGH 상태가 유지될 때 SDA가 HIGH에서 LOW로 변화되면 START 신호로 해석된다. <그림 3>은 START의 신호 변화이다. START 신호는 STOP 이전에 여러 번 나올 수도 있다. 첫 번째 START와 달리 두 번째 START 신호는 REPEAT START 신호라고 하는데 보통 디바이스 안에 내부적인 주소가 있어서 이 주소를 지정하고 데이터를 읽을 경우에 사용된다.
 
STOP 표현
Stop은 MCU가 슬레이브에 전송을 종료한다는 것을 알리기 위한 것으로 I2C 버스를 더 이상 사용하지 않겠다는 신호이다. 이 신호는 1비트 형태로 구현되며 SCL이 HIGH 상태가 유지될 때 SDA가 LOW에서 HIGH로 변화되면 STOP 신호로 해석된다. <그림 4>는 STOP를 표현하기 위한 신호 변화 상태이다.
 
DATA 1비트 신호 표현
마스터에서 슬레이브에 전달하거나 슬레이브에서 데이터를 읽어 올 때 데이터의 1비트를 표현하기 위해서는 SCL 신호선을 LOW 상태에서 전송하고자 하는 비트 데이터를 SDA 신호선에 결정하고 SCL 신호선을 HIGH 상태로 만든다. 슬레이브 또는 마스터는 SCL이 HIGH 상태일 때의 SDA 신호 상태를 보고 SDA 신호가 HIGH면 1로 LOW면 0으로 판단한다(<그림 5>).
 
ACK 표현
슬레이브는 마스터가 전송한 데이터(주소와 읽기 쓰기를 결정하는 것도 데이터로 취급한다)를 제대로 수신받았다거나 슬레이브에서 마스터에 데이터를 전달할 경우에 8비트 데이터 다음에 ACK 신호를 표현한다. ACK도 일종의 데이터이기 때문에 SCL의 상태가 LOW일 때 SDA의 상태를 HIGH 또는 LOW로 결정하며 SCL의 상태가 HIGH일 때 SDA의 상태를 마스터가 읽으면 된다. 이때의 SDA 상태가 LOW라면 정상적인 통신이 이루어진 것이고 만약 HIGH라면 정상적인 통신에 실패한 것으로 판단한다.

----------------------------------------------------------------------------------------------
GPIO를 이용해 sw i2c 명령을 만들었다.
DATA 의 IN OUT direction 설정을 start, end, wait ack함수의 가장 처음 부분에 넣어두자,
그때그때 부르려면 햇갈릴 가능성이 크므로
또, wait 할때 data를 high로 올려놓고 SDA_IN으로 하면 가끔가다 그 신호를 ack로 받아들이는지 어쩌는지
불규칙적으로 i2c가 제대로 동작하지 않았다.
waitack는 그냥 단순히 data input -> clk high -> clk low 하면 끝 ! (data output은 그다음 function에서 하는 것 !)


728x90

'개발 > Embedded' 카테고리의 다른 글

[openwrt] sysupgrade 명령어 사용  (0) 2015.10.22
openwrt 에서 configuration 관리 툴  (0) 2015.10.19
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
공유하기 링크
Comments