I2C(TWI) 통신

임베디드/MCU 2014. 7. 24. 16:12

 오랜만에 MCU를 다루게 되면서 처음으로 I2C 통신을 사용하는 부품을 쓰는 일이 생겨 무려 3일동안 I2C에 대해 연구를 해보았습니다. 맨 처음엔 TivaWare에 들어있던 I2C 예제를 복붙해서 그냥 빌드시켜 프로그램을 실행해 보았는데 프로그램 구동 자체가 되지 않는 것을 확인하고는 상당히 시간을 많이 들여 공부해야 되겠다는 생각이 들더군요.

 직접 오실로스코프를 사용하여 화면에 나오는 값들을 일일해 측정하며 I2C 통신의 동작원리를 이해하였고 소스코드도 일일히 하나씩 써 가며 파형이 어떻게 달라지는지를 확인한 결과 드디어 센서가 정상적으로 동작함을 확인할 수 있었습니다.

 이후에 I2C를 공부하게 될 사람들에게 조금이나마 도움을 드리고자 I2C 통신에 처음으로 입문하시는 분들께 큰 힘이 되기를 바랍니다.


 I2C는 Inter Integrated Cricuit의 줄임말로 TWI(Two Wire Interface)라고도 불립니다. I2C 통신의 가장 큰 장점은 바로 단 2가닥의 선으로 여러 대의 기기와 연결하여 통신이 가능하다는 점입니다.



 위 그림에서 보았을 때 I2C 통신은 2종류의 주체로 나눌 수 있습니다. 통신의 중심이 되는 Master와 통신을 하고자 하는 주변 기기를 Slave로 설정할 수 있습니다. 일반적으로 mcu 1대와 여러대의 I2C 통신을 지원하는 기기와 연결할 경우 Master 1대와 Slave 여러대로 통신이 가능합니다. 물론 Master는 2대 이상도 가능하다.


 I2C에서 사용되는 두 선은 SDA와 SCL로 구성되어 있습니다. 통신이 개시되었을 때 SDA는 데이터를 주고 받는 역할을 하고 SCL은 동기화를 위한 CLOCK 역할을 합니다. 여기서 Master와 Slave 각각에 SDA와 SCL을 바로 연결해주기만 하면 되는 것이죠. 그러나 이러한 회로만으로는 오픈 드레인(회로에 + 전압이 걸리지 않는 상황) 상태가 되기 때문에 SDA와 SCL 회로에 풀업 저항(Pull-up resistor)을 달아 전압을 공급해 줘야 합니다. 풀업 저항에 대해 자세히 알고 싶으신 분은 아래 블로그를 참조해 주시길 바랍니다.


풀업(pull-up) 풀다운(pull-down) 저항 1

http://air802.tistory.com/2



 I2C 통신이 이루어지지 않고 있는 상황일 때에는 SDA와 SCL은 High 상태를 유지합니다. Master가 I2C 통신을 개시하게 될 때 SDA가 Low 상태로 내려가게 됩니다. 이 때 SCL은 I2C 통신이 시작되었음을 인지하고 클럭 역할을 하기 시작합니다.

 I2C 통신이 완료되었을 때 Master는 I2C 통신을 종료하게 됩니다. SCL이 HIGH 상태로 돌아왔을 때 SDA가 Low에서 High로 변하게 되면 I2C 통신이 완료됩니다.






 I2C Slave는 각각 자신의 고유 주소를 가지고 있습니다. 주소는 총 7비트로 구성되어 있으며 Master에서 맨 처음 통신하기를 원하는 Slave의 주소를 SDA를 통해 전달하면 해당 주소의 Slave는 Master에게 주소를 수신하였다는 ACK를 Low 상태로 끌어내려 마스터에게 발신합니다. 이후 Master는 Slave에게 데이터를 전송할 수 있게 됩니다. 이 때 데이터는 한 번에 8비트씩 여러번 전송이 가능합니다.




 위에서 Slave address가 모두 전송된 뒤 R/S 부분을 보실 수 있습니다. 이는 해당 Slave의 레지스터를 읽거나 쓸건지의 여부를 물어보는 레지스터로 R의 경우 SDA가 High 상태로 Slave에게 Data를 전달받을 수 있으며 S의 경우 SDA가 Low 상태로 Slave에게 Data를 전송할 수 있습니다.

 


참고자료 : http://mintnlatte.tistory.com/201

300x250

[Tiva] Tera Term으로 런치패드와 UART 통신하기

임베디드/TI 2014. 7. 23. 21:35

 마이크로프로세서를 활용해 보신 분들이라면 UART 통신에 대해 상당한 지식을 가지고 있으실 것이라 생각합니다. 특히 ATmega128에서도 UART를 지원하기 때문에 UART 통신에 큰 어려움은 없을 것이라 생각합니다.

 이번 포스트는 TeraTerm 프로그램을 사용하여 TIVA 런치패드와 UART 통신을 하는 방법에 대해 설명드리겠습니다.


우선 TeraTerm을 컴퓨터에 설치합니다.

http://ttssh2.sourceforge.jp/


윗 부분에서 Download 메뉴를 선택합니다.


다운로드 페이지로 넘어오게 되는데 여기서 최신 버전(화면에서는 teraterm-4.83.exe)을 다운로드 받습니다.


다운로드가 완료되면 설치 프로그램을 실행합니다.



I accept the agreement 를 선택하신 후 Next 버튼을 누릅니다.



프로그램을 설치하기 원하시는 경로를 선택합니다.



Standard installation을 선택하신 후 Next 버튼을 누릅니다.



언어를 선택하는 메뉴입니다.

자신이 원하는 언어를 선택하신 후 Next 버튼을 누릅니다.





Install 버튼을 눌러 프로그램을 설치합니다.



TeraTerm 프로그램을 새로 열자마자 다음과 같은 화면이 나타납니다.



시리얼(E)를 선택하신 후 런치패드와 연결된 포트를 선택합니다.

포트명은 'Stellaris Virtual Serial Port'입니다.(COM 번호는 컴퓨터의 상황에 따라 다릅니다.)

만약 ICDI를 설치하지 않으셨거나 오류가 발생할 경우 포트가 보이지 않습니다.

ICDI를 설치하여야만 다음 단계로 진행이 가능합니다.


설치 방법은 다음 포스팅을 참조해주세요.

http://elecs.tistory.com/6




일단 여기까지 진행하셨다면 런치패드와 TeraTerm과의 연결은 성공한 것입니다.

현재 TeraTerm의 전송속도는 9600으로 런치패드에서 설정한 전송속도와 맟지 않을 경우 글자가 깨져서 출력됩니다.

서로 속도를 맟주기 위해 TeraTerm의 설정을 변경하도록 합니다.

설정 → 시리얼포트를 선택합니다.



시리얼포트의 전송속도를 설정합니다.

TivaWare에 있는 예제인 hello 프로젝트의 경우 속도는 115200입니다.




코드 내부에서 UARTStdioConfig() 함수에서 전송속도를 확인하실 수 있습니다.

전송속도는 두번째 인자인 115200입니다.


코드의 메인에 다음과 같은 함수를 입력합니다.

UARTprintf("Hello, world!");

위 함수는 C언어의 printf() 함수와 기능이 거의 동일합니다.


TeraTerm 화면이 다음과 같으면 통신은 성공한 것입니다.



차후 계속해서 한 가지의 런치패드만으로 UART 통신을 하시는 분들이라면 설정을 통해 TeraTerm을 실행하자마자 설정했던 사항 그대로 프로그램을 바로 실행할 수 있습니다.


설정 → 저장하기를 선택합니다.



TERATERM.ini 파일에 덮어쓰기를 하시면 다음에 실행하실 때 현재 설정된 사항으로 프로그램을 바로 실행하실 수 있습니다.



300x250

[Tiva] Tiva C 런치패드에 프로그램 올리기

임베디드/TI 2014. 7. 21. 12:22

※이 과정을 진행하기 위해서는 다음과 같은 과정이 진행되어야 합니다.

1. CCS(Code Composer Studio) 가 설치되어야 합니다. (6.00 버전으로 진행)

2. Tiva C 런치패드를 디버그 모드로 한 후 USB로 연결 되어있어야 합니다.

3. 프로젝트르 불러들일 파일이 필요합니다.(여기서는 TivaWare를 불러오는 것으로 하겠습니다.)

4. ICDI 드라이버가 설치되어 있어야 합니다.


설치한 Code Composer Studio를 실행합니다.


실행한 후 메뉴에서 Project → Import CCS Projects... 를 선택합니다.



다음과 같은 메뉴가 등장하게 됩니다.

차후 자신이 만든 프로그램들이 실행될 수 있게 해주는 driverlib를 Project Explorer에 올려보도록 하겠습니다.

Browse... 를 클릭합니다.



자신이 TivaWare를 설치하였던 폴더를 연 후 driverlib 폴더를 클릭 후 확인 버튼을 누릅니다.



다음 화면과 같이 driverlib 프로젝트가 표시되면 아랫쪽에 Finish 버튼을 클릭합니다.



Project Explorer에 driverlib가 추가되어 있는 것을 확인하실 수 있습니다.

이번에는 우리들이 동작시키기를 원하는 프로젝트를 불러와 보도록 하겠습니다.



driverlib 폴더를 불러왔었을 때 처럼의 과정을 반복합니다.

이번에는 TivaWare 폴더 하위에 있는 examples → boards 폴더를 열어보면

보시는 바와 같이 Tiva 시리즈의 각 보드들의 예제들을 확인하실 수 있습니다.

해당 메뉴에서 자신의 런치패드에 해당하는 폴더를 엽니다.

(여기서는 TM4C123G 런치패드를 기준으로 하겠습니다.)



자신이 실행하기를 원하는 프로젝트의 폴더를 다음과 같이 선택하신 후 확인 버튼을 클릭합니다.



다음과 같이 자신이 실행하고자 하는 프로젝트가 확인 되면 Finish 버튼을 클릭합니다.



불러들인 프로젝트에 마우스 오른쪽 버튼을 클릭한 후 Build Project를 실행합니다.



클릭하게 되면 CCS가 해당 프로젝트를 Build 하는 과정을 확인하실 수 있습니다.



Build가 완료되면 Debug 버튼을 눌러 런치패드에 프로그램을 구동해봅니다.



CCS가 디버그 모드에 진입함과 동시에 런치패드에 프로그램을 설치하게 됩니다.



디버그 준비가 완료되면 메뉴에서 화살표 버튼을 클릭하면 곧바로 프로그램이 동작함을 확인하실 수 있습니다.



300x250