노무현 대통령 배너


2006. 6. 2. 13:39

[본문스크랩] I2C : 보드 내의 시리얼 통신 규약

최초 필립스에서 제안한 통신방식으로 2개의 Bus 를 사용하여 주변 기기와 통신하는 방식이다.

Serial 통신, 7비트 지원, 양방향 데이터 전송이 가능하다. 총 3가지 모드로 동작을 하며 각각 모드에 따른 통신속도는 다음과 같다.

-Standard mode : 100kbps

-Fast speed mode : 400kbps

- High speed mode : 3.4Mbps

또한 1:1 통신이 아닌 1:다 통신이 가능하며 Lode BusCapacitance가 400pF 이하라면 몇개의 IC를 같은 Bus 라인에 연결해도 무방하다.

I2C 통신에 사용되는 2가지 line은 SDA(Serial Data Line)와 SCL(Serial Clock Line)이며,데이터 전송과 기준클력을 발생/중지시키는 Master와 그 Master의 신호를 받는 Slave로 나누어진다.

1:다 통신을 하는 대부분의 단자가 그러하듯 I2C 통신을 Wired-AND로 하기 위해서는 연결된 디바이스 출력단자는open-drain 혹은 open-collector에 연결을 해야한다.

출처블로그 : 나만의 공간

Inter-IC


RS232C가 장비, 기기 간의 시리얼 통신이라면, I²C는 보드내의 시리얼 통신 규약이다.

RS232C는 비동기통신 방식이지만, I²C 는 동기 통신 방식이다.

단 두선만을 사용하는 간단한 프로토콜로서 필립스에서 제안한 규격으로 현재 많은 회사들이 지원하고 있다. (동일 보드내에서의 통신이므로 전원규격은 필요없다.)

두 신호중 하나는 Clock 이고 (동기통신의 필수사항) 다른 하나는 DATA이다.

I²C Master에서 클럭을 발생하고 I²C Salve에서 그 클럭에 동기하여 통신을 하는 방식이다.(하나의 Master에서 다수의 Slave가 엮이는 방식)

가장 대표적으로 이 프로토콜을 사용하는 부품은 시리얼 방식 EEPROM이 되겠다.

---------------------------------------------------------------------------------------

SDA와 SCL 이 두개를 I2C-BUS라고 한다. 더 정확히 말해서 Serial_DAta와 Serial_CLock의 약자

---------------------------------------------------------------------------------------


I2C 통신을 하기 위해서는 두개의 라인만 있으면 된다.

한 라인은 통신에 필요한 클럭을 위한 라인이고 나머지 한 라인이 데이터 전송용 라인이다.

마이크로 콘트롤러 간의 통신이나 마이크로 콘트롤러와 메모리칩이나 리얼타임 클럭 칩과의 통신과 같은 보드 상에서의 통신으로 주로 사용된다.

통신을 할 경우에 통신을 관장하는 Master와 Master의 명령에 따라 움직이는 Slave로 나뉘게 된다. 예로,Microcontroller인 PIC17C756이 Master가 되고 리얼 타임 클럭 칩과 EEPROM 칩이 Slave가 된다.

Slave에 각각 아이디와 같이 어드레스를 지정해줄 수 있어서 한 라인에 여러개의 칩을 연결하여 사용이 가능하다. 예로,리얼 타임 클럭 칩 하나와 EEPROM 칩 4개를 연결해서 사용할 수 있다.


단점은 그다지 빠르지 않다

----------------------------------------------------------------------------------------

최근의 고속/대용량 데이타 전송에는 맞지않지만 비교적 간단한 버스이기때문의 간단한 통신을 위

한 곳에는 현재의 컴퓨터 내부에서도 많이 중요하게 사용되고 있다. 대표적으로 메모리노트북의

밧데리쪽에 사용이돼고있다.

---------------------------------------------------------------------------------------

질문 : i2c 통신에서 timing도를 보면 한 바이트를 read하고 난후 stop condition이 뜨기 전에 high signal이 data 라인에 뜨던데 이건 data line을 통해 device에 write를 해주는 건가요? 아니면 CLK만 하나 띄워줘서 device로부터 read하는 건가요?
제가 i2c통신을 통해서 device를 컨트롤하는 프로그램을 짰는데, 일단 코드는 아무리 뚫어져라 쳐다봐도 틀린 부분이 없는데 device로부터 값을 read할 수 가 없네요.. read가 안되니 device에 write가 되는 건지도 확인할 방법이 없습니다.
도와주세요. 뭔가를 알 것 같은데 질문이 난해하다면 쪽지 주세요.
참고로 device는 microtune사의 mt5100 라고 불리는 tuner입니다. datasheet도 구할 수가 없고.. 이거 완전 노가다중입니다.

답변 : iic통신에서 ACK신호는 데이터를 받는 쪽에서 해주어야 됩니다.

그러니까 메인에서 디바이스 쪽으로 데이터를 Write할때는 (M->S : W)
데이터 8비트를 보내고 마지막 9비트째는 클록만 하나 더 보내면 디바이스측에서 데이터 선를 LOW로 하여 잘받았다고 ACK를 내보내 줍니다. 메인에서는 데이터 라인이 LOW가 되는지 확인하면 되겠습니다. LOW가 확인이 되면 정상적으로 전송이 된것이므로 다음 데이터를 똑같은 방식으로 보내면 됩니다.
만일 디바이스에서 Read 할 경우에는(M<-S : R) 클록을 8개보내면서 8비트데이터를 읽어낸 후, 메인에서 데이터 버스를 LOW(ACK)로 해주고, 클록을 띄우면 디바이스가 다음 데이터를 보내줄 준비가 됩니다. 만일 데이터받기가 끝났을 경우에는 마지막 ACK타임에 데이터버스를 High(NAK)로 하고 클록을 띄워서 데이터를 더 보내지 말라고 조작하면 됩니다.

출처블로그 : Lisa's 자가 발전소

질문 : i2c 통신에서 ack 신호와 관련한 질문입니다.

master에서 데이터를1 byte를 전송하면, slave에서 데이터를 잘 받았다고 ack를 master에 보내주지않습니까? 여기서 SDA를 release (HIGH)해놓고, SCL을 한 클럭 주면 slave에서 잘 받았다고 보내주는 ack신호를 SDA line이 LOW가 됨으로써 확인할 수 있잖아요. 그런데 SDA를 release 하라는 뜻은, 프로그램상에서 강제로 High 신호를 줘놓고 기다리라는 뜻인가요? release의 의미상 강제로 신호를 주는건 아닌것같은데, 강제로 High를 줌으로써 release 시키는 방법밖에는 없는것같아서.. 고수님들 답변 부탁드립니다..

답변 : 통신에서 기본은 두 PORT가 절대로 충돌하면 안됩니다. 다시 말해 어느 한쪽이 HIGH 인 상태에서 다른 한쪽이 LOW가 되면 과전류로 인해 자칫 PORT가 죽을 수 있습니다. 따라서 절대로 두 PORT가 출력 MODE가 되어서는 안되죠.

I2C 통신의 경우 기본적으로 SCL, SDA는 반드시 OPEN DRAIN(또는 OPEN COLLECTOR)형태를 사용해야 합니다. 여기에 FULL UP을 걸어주므로써 출력은 LOW일때는 LOW로 출력되지만 HIGH일때는 HIGH를 내보내주는 것이 아니라 OPEN(Release)을 해주므로써 full up저항에 의해high가 되는 것이죠.마이컴에 따라 출력 형태가 다소 다르지만 만약 출력이 c-mos only로 된경우는 HIGH를 주고 싶을때는 DDR(방향레지스터)를 입력형태로 전환해 주면 됩니다. 즉 출력은 항상 LOW로 설정한 다음 PORT를 입력으로 하면 FULL UP에 의해 HIGH가 되고 PORT를 출력으로 하면 LOW가 되는 것이죠.

위의 경우는 어차피 SLAVE의 SDA를 읽어야 하므로 MASTER는 SDA PORT를 입력으로 전환해 줘야 합니다. 그렇게 하면 FULL UP에 의해 HIGH가 되었다가 SLAVE에서 ACK를 주면 LOW가 되고 MASTER는 그것을 읽어들이고 다음으로 넘어가면 되죠.

출처 : 네이버 지식IN