포럼 회원으로 등록하신분만 다운로드가 가능합니다. 최대 업로드 가능한 용량은 20MB 입니다.

 
 
 

RS232C가 장비간 혹은 시스템간의 통신 프로토콜로 각광받고 있다면 I2C는 보드내의 칩과 칩사이의 통신 프로토콜로 각광받는 2라인 시리얼 통신규격이라고 할 수 있다.
PCB내의 각종 칩들을 단 2가닥의 선만을 사용해서 시리얼로 데이터를 주고 받는 일종의 약정인 I2C는 필립스사에서 제안한 규격으로 현재는 많은 회사들이 지원하고 있는 프로토콜이다.

I2C통신을 어렵다고 생각하시는 분들이 많은 것 같아서, 여기에서 간략히 I2C통신이란 무엇인가를 짚고 넘어가려고 한다. I2C를 사용하면 아래 그림과 같이 단 두 가닥(SCL과 SDA)의 선으로 부품사이를 데이지 체인 형식으로 연결할 수 있다.


< 그림 > I2C디바이스들의 연결


클럭(SCL)을 발생시키는 디바이스를 마스터 모드상태의 디바이스라고 부르고 클럭(SCL)을 받아들이는 디바이스를 슬레이브 모드 상태의 디바이스라고 부른다.
슬레이브 디바이스들은 고유의 어드레스를 가지고 있어서 자신의 어드레스를 선두로 하는 신호블록(한 개의 프레임)에 대해서만 반응을 한다.

슬레이브십의 어드레스는 일반적으로 몇 개의 핀으로 결정한다.



< 그림 > 슬레이브칩의 어드레스 결정



SCL과 SDA 라인은 오픈콜렉터로 되어 있으며, 보통 47K정도의 저항으로 풀업되어 있다.마스터 디바이스는 원하는 슬레이브칩에 있는 정보를 가져오가나(READ) 써 넣을 수 있으며(WRITE), 슬레이브칩은 마스터칩의 요구에 응답하도록 되어있다.

가장 흔한 I2C통신의 예는 EEPROM(24계열)에서 찾아 볼 수 있다.
24LC04와 같은 I2C통신 프로토콜을 가진 EEPROM은 마이컴등과 2가닥의 신호선으로 연결된다. 마이컴에서는 EEPROM에 담긴 정보를 읽어오기 위해서 EEPROM의 어드레스를 보내고, 읽을 것인지 쓸 것인지의 정보도 함께 보낸다. 보통은 처음 보내는 8비트의 정보에 이러한 내용들이 모두 실리게 된다.




< 그림 > 첫번째 바이트 정보


그림에서 알수 있듯이 I2C는 MSB가 먼저 출력된다.(MSB FIRST라고 부른다. 이와는 반대로 RS232는 LSB FIRST이다.)제일 마지막 비트가 LOW이면 WRITE코멘트가 되고 HIGH이면 READ 코멘트가 된다. ACK는 ACKNOLOGY의 약자로 한 바이트의 전송이 제대로 끝났는지를 확인하는 일종의 확인절차라고 할 수 있다. (ACK에 해당하는 클럭에서는 SLAVE 의 SDA핀이 반드시 LOW상태로 있어야 정상적으로 받았다는 뜻이 된다.)

I2C에서의 첫번째 바이트는 이러한 명령의 성격을 가지고 있다. 그 다음으로 따라오는 내용은 슬레이브의 어드레스가 된다 EEPROM의 경우 데이트를 저장하거나 읽어올 번지를 두번째로 출력하는 것이다. 어드레스까지 전송이 끝나면 그 다음에는 앞의 코멘드 내용에 따라서 슬레이브의 반응이 틀려진다. 만약 READ코멘드였다면 해당 어드레스의 내용을 SCL의 클록에 맞추어 SDA(데이터핀)로 출력할 것이고 WRITE코멘드였담녀 마스터로부터 오는 데이터를 해당 어드레스에 WRITE 할 것이다.

이처럼 I2C통신은 3가지 성격의 데이터가 순서대로 송수신되는 시리얼 통신규격이라고 정리할 수 있다.




< 그림 > 3가지 성격의데이터


I2C로 엑세스 가능한 디바이스들은 EEPROM 이외에도 ADC,DAC를 비롯해 AUDIO,VIDEO,SVR 등의 다기능 칩들에서 많이 찾아 볼 수 있다.
예를들어 TV나 모니터에 간단한 글자를 표시해주는 OSC(On Screen Display)칩도 I2C프로토콜을 사용해서 간단한 정보만을 주고 받는 것이다.(X,Y 축, 표시할 캐릭터 등등)

이처럼 I2C는 실제의 어플리케이션에서 자주 등장하는 유용한 통신 프로토콜이다. PIC16C7X에서는 안타깝게도 SLAVE보드만 내장되어 있다. MASTER모드는 소프트로 얼마든지 해결할 수 있기 때문에 웨이퍼사이즈를 아끼기 위해서 아마도 MASTER모드를 뺀 것 같다. 하지만 걱정할 것 없다. 이 책에서는 필자가 즐겨 사용하는 I2C마스터모드 서브루틴을 공개하고 있다. 이 루틴을 여러분의 소스에 그대로 삽입하여 쓴다면 아무 문제없이 I2C마스터 모드를 사용할 수 있을것이다.

SLAVE모드도 마음만 먹으면 소프트로 구현할 수 있지만, 본래의 I2C규격을 보면 400Khz의 수신도 받아 내도록 되어 있으므로 소프트로 구현하기에는 불가 항력이다.(마스터모드는 느리게 출력해도 되지만 슬레이브모드에서는 상대편에서 빠르게 전송할 경우 못받는 경우가 생기면 안되기 때문이다.)




 
 

마스터모드의 프로그램 구현은 PIC16C74의 I2C통신 모듈과 아무런 관련이 없다.(다시말해 I2C슬레이브 통신모듈이 없어도 I2C마스터모드 구현에는 아무런 지장이 없다는 얘기이다.실예로 통신모듈이 아무 것도 없는 PIC16C74에서도 I2C마스터 모드를 구현할 수 있다.)
프로그램 설명을 위해 다음 그림처럼 EEPROM과 PIC16C74가 연결되어 있는것으로 가정하도록 하겠다.

PC통신은 생각보다 쉽다. 그건 아주 단순한 곳에 착오가 있기 때문이다. HIGH-LOW의 순서만 정확히 지켜준다면 틀림없이 동작하도록 되어있다. I2C는 상당히 안정적이며, 잘짜여진 프로토콜이므로 안심하고 사용할 수 있다. 상당히 빠른속도(400Kbps)까지 허용하며 단 2개의 라인으로 많은 디바이스들을 연결 할 수도 있다.

PC는 보드내 통신이지만 이것을 보드 바깥으로도 응용하려고 했던 규격이 ACCESS bus이다. 이 규격을 PC에서의 키보드, 마우스, 스캐너, 프린터 등을 애플사의 ADB(Apple Desktop Bus)처럼 하나의 선으로 연결하려고 시도했던 규격이었다.
하지만 ACCESS bus보다 한수 위인 USB(Universal Serial Bus)의 등장으로 시장 선점은 실패한 셈이다. 어쨌든 PIC16C74는 이러한 ACCESS bus에서의 PC응용기기 시장을 노리고 ACCESS bus 기능을 내장시켰지만, 결과적으로 효과는 보지 못한 셈이 되었다. (PIC16C74가 발표되던 시점은 ACCESS bus와 USB가 치열한 경쟁을 벌이고 있던 시점이었다)



 
 

3-WIRE 시리얼 통신규격으로 주로 I2C등장 이전까지 자주 사용되던 통신 프로토콜이다. I2C와 마찬가지로 보드내에 있는 여러 디바이스간의 데이터 교환을 위해 사용하였다.
SPI프로토콜을 가진 대표적인 칩은 93C46(EEPROM)이 있다.

요사이는 I2C의 등장으로 SPI의 사용이 다소 줄었지만, 워낙 오랜 역사를 가지고 있는 프로토콜이기 때문에, SPI로 동작되는 디바이스들이 아직도 현존하고 있다.(주로 모토롤라의 디바이스들)

SPI는 3가닥으로 통신을 한다. 데이터입력(SDI),데이터출력(SDO), 클럭(SCK)이 있고 SPI의 동작을 허가하는 선택관이 별도로 존재한다.(결과적으로 4가닥이 필요하다는 뜻이다.)

PIC16C74는 SPI프로토콜을 FULL지원하고 있다. 마스터모드, 슬레이브 모드를 드라이브 할 수 있고, 마치 SPI디바이스처럼 lSS 입력을 받아서 동작하기도 한다.



 
 

SPI의 모드는 SSPCON 레지스터의 하위 4비트로 결정한다.
    - 마스터모드(SCK는 출력이다.)
    - 슬레이브 모드 (SCK는 입력이다.)

마스터모드에서의 구동 클럭은 다음 4가지중 하나로 결성할 수 있다.
    - OSC/4, OSC/16, OSC/64, TIMER2

슬레이브 모드는 다시 2가지로 나눌 수 있다.
    - /SS입력을 ENABLE (외부에서 /SS입력을 받는경우)
    - /SS입력을 DISABLE (외부에서 /SS입력을 받지 않는경우)



 
 

다른 통신모듈과 마찬가지로 SPI 통신도 2개의 전송버퍼를 가지고 있다.
SSPSR은 송수신을 위한 버퍼이다. 이 곳에서 송수신이 완결되면 SSPBUF로 옮겨진다.
(SSPBUF는 유저가 엑세스 가능한 레지스터이다.)

SSPBUF의 상태를 나타내는 BF(Buffer Full)비트가 있다.(SSPSTAT의 0번 비트) 이 비트가 SPI통신에 있어서는 중요한 키역활을 담당하고 있다.
이 비트가 1이면, 버퍼에 데이터가 있는것을 의미한다. 반대로 0이면 데이터가 없다는 뜻이다.

이 두개의 엑세스 포인트만 가지고도 SPI를 훌륭하게 제어할수 있다.



 
 

지금 소개하는 프로그램은 SPI통신을 사용하기 위한 표준 프로그램이라고 할 수 있다.
BF플레그가 세트되었다는 것은 송수신버퍼(SSPBUF)에 무언가 있다는 뜻이므로 BF 플레그가 1이 되는것을 기다린후 어떠한일을 처리하면 된다.

LOOP

  BSF STATUS, 5 ;BANK1
  BTFSS SSPSTAT,BF
  GOTO LOOP  
  BCF STATUS, 5 ;BANK0
  MOVE SSPBUF, W  
  MOVWF RXDATA  
    ;수신된 데이터를 다른곳에..
  MOVE TXDATA, W ;송신할 데이터
  MOVWF SSPBUF  

물론 이 프로그램을 실행 시키기 전에 사전 준비작업을 해주어야 한다

- SDI포트 (RC4)는 입력으로 만든다.
- SDO 포트 (RC5)는 출력으로 만든다.
- 마스터모드;SCK 포트 (RC3)은 출력으로 만든다.
- 슬레이브 모드,SCK 포트 (RC3)은 입력으로 만든다.
- /SS 포트 (RA5)는 입력으로 만든다.
- SSPCON 레지스터를 적당한 값으로 세팅한다.(SSPEN 은 반드시 1로 한다.)


- SPI마스터 모드 데이터 송신
SSPBUF에 원하는 데이터를 기입하면 그 즉시 송신된다. 송신이 환료되면 BF비트는 클리어 된다.

- SPI마스터 모드 데이터 수신
수신이 완료되면 BF비트는 세트되며, 수신된 데이터는 SSPBUF에 저장된다.

- SPI슬레이브 모드 데이터 송신
이 모드에서는 SCK단자에 외부 클록 펄스가 입력되어야만 동작개시된다. 클럭이 입력되면 SSPBUF에 있는 데이터가 SDO포트로 출력된다.
송신이 완료되면 BF비트는 클리어 된다.

- SPI슬레이브 모드 데이터 수신
외부에서 클록과 데이터를 모두 입력받는다. 수신이 완료되면 BF비트는 세트되고, 데이터는 SSPBUF에 로드된다.

profile

인생은 연극이고 세상은 무대이다!

이솝 임베디드 포럼 운영 및 비즈니스와 관련된 것 이외에 E-Mail이나 메신저 및 휴대폰 등을 통한 개인적인 질문 및 답변은 받지 않습니다. 문의 사항은 이솝 임베디드 포럼 게시판을 이용해 주시면 감사하겠습니다.

엮인글 :
http://www.aesop.or.kr/index.php?mid=Board_Documents_Hardware&document_srl=35103&act=trackback&key=2c6
List of Articles
번호 제목 글쓴이 날짜 조회 수
36 [요청] smdk2410 회로도 [1] neojg 2021-02-13 442
35 Origenboard (S5PV310) schematic - silk file 관리자 2011-07-23 9794
34 Origenboard (S5PV310) schematic - baseboard file 관리자 2011-07-23 9863
33 Origenboard (S5PV310) schematic - cpuboard file 관리자 2011-07-23 9771
32 S5PC100 User Manual [1] 관리자 2010-04-04 13782
31 ARM Cortex A9 Architecture 소개 (한국어) file [4] JhoonKim 2010-01-18 15073
30 NAND Flash Spare Assignment Recommendation file JhoonKim 2009-12-31 12721
29 NAND Flash File System Algorism file JhoonKim 2009-12-31 12770
28 NAND Flash ECC Algorithm file JhoonKim 2009-12-31 13944
27 삼성 NAND Flash Application Note file JhoonKim 2009-12-31 12678
26 MTD NAND Driver Programming Interface file 김재훈 2009-10-21 13109
25 OpenRISC Architecture Manual file 김재훈 2009-07-04 12601
24 MIPS Architecture Assembly Guide file [1] 김재훈 2009-07-04 12353
» I2C/SPI 프로토콜 기초 김재훈 2009-07-03 20962
22 I2C Bus 강좌 file [3] 김재훈 2009-07-02 14651
21 임베디드 시스템에서의 터치스크린 보정 방법 file 김재훈 2009-06-22 12821
20 ARM 아키텍쳐 소개 file [2] 김재훈 2009-05-17 13217
19 JTAG의 소개 및 원리 file 김재훈 2009-04-26 13017
18 ARM Architecture Reference Manual file [1] 김재훈 2009-04-05 14043
17 USB Driver Programming Guide For Linux file 김재훈 2009-04-05 13504

사용자 로그인