본문 바로가기
임베디드.일렉트로닉스/EFM8

EFM8 SB1에서 I2C 구현

by 리치굿맨 2015. 5. 1.


 

개요

 

EFM8 SB1 에서 I2C 구현하여 하여 다른 MCU나 기기와의 I2C 통신가능 상태 달성하는 방법 정리.

 

설정의 요점.

1. SMBus (I2C) 사용가능하게 하고,

2. SMBus (I2C) 의 클럭소스로 사용할 타이머 설정. - I2C 슬레이브로 사용할 때는 하지 않아도 됨.

3. SMBus (I2C) 의 핀 지정.

4. SMBus (I2C) 발생 인트럽트 처리부.

 

사전 지식. 

- 본 글의 내용은 아래 사항들을 알고있는 상태에서 봐야 쉽게 이해됨.

1. I2C 는 2선(SCL-클럭, SDA-데이터) 시리얼 통신버스이며, 마스터와 슬레이브간의 통신이다.

2. EFM8 SB1 의 I2C 기본정보. 보기 -> http://igotit.tistory.com/291

3. SI Labs 사의 Simplicity Studio 에서 프로젝트 생성하고 Configurator  기본사용법 알고 있어야 한다. 

보기 -> http://igotit.tistory.com/230


 


 

 

I2C (SMBUS) 사용 가능하게 설정.

 

 

아래 3가지가 상세히 설명된다.

1. SMBus (I2C) 사용가능하게 하고,

2. SMBus (I2C) 의 클럭소스로 사용할 타이머 설정.

3. SMBus (I2C) 의 핀 지정.

 

프로젝트 configurator 에서 peripheral 에서 SMBus0 을 선택한다.아래 붉박.

아래 그림 파박에 에러표시가 있는데 클럭이 유효하지 않음을 알려주고 있다. 오른쪽 속성창의 주파수 0Hz 가 잘못되어있음을 알려주는것이다.

EFM8의 SMBus 는 Clock 소스로 타이머를 이용하게 되어있는데 우리는 아직 이것을 설정하지 않았기 때문에 오류를 보게 된 것이다.

 

 

SMBus Clock Source 선택.

SMBus Clock Source 란 I2C Master 로 기능하게 할때 I2C SCL 발생용으로 사용할 소스를 선택하는 부분이다.

 

I2C Slave  로만 기능하게 하는 경우에는 SMBus Clock  설정하지 않아도 되고 아래 설명의 Timer 설정하지 않아도 된다.

아래 설명은 I2C Master  로 사용하는 경우엔 필수로 설정해줘야 한다.

 

아래 속성창에서 SMBus Clock Source 가 기본 Timer 0 overflow 로 기본 지정되어있는데 이는 다른 것으로도 변경가능하다. 클릭해보면 선택가능한 타이머를 보여준다.  

 

우리는 Timer 0을 클럭 소스로 이용하기로 하자.

그리고 Enable SMBus 를 Enable 로 설정한다. 결론적으로 아래 처럼 설정되면 된다.

 

 

Timer0 설정.

SMBus 의 클럭 소스로 Timer0 Overflow를 선택하였으므로, EFM8 에서 Timer0 을 사용가능하게 하고 설정 해줘야 한다.

타이머0 설정기준 : 우리의 SMBus 에서 의도하는 SMBus Clock Frequency는 사용되는 클럭 소스의 1/3 로 된다. 따라서 Timer0 overflow frequency 를 의도하는 SMBus Clock Frequency 의 3배의 주파수가 되게 하면 된다. SMBus 클럭이 50kHz 라면 Timer0 overflow frequency 는 150kHz 로 설정하면 된다.

최종적인 TImer0 의 설정은 아래 그림과 같다.

아래 그림 왼쪽편 TIMER Setup 탭에서 Mode2 선택, Timer0 의 클럭소스 지정했고,

그림의 오른쪽 TIMER 0/1 탭에서 Target Overflow Frequency 를 150000Hz 로 지정하고있다.  이 값은 희망하는 값일뿐 실제 정확한 Timer0 overflow frequency 는 파박에 보이듯이 147.059kHz 가 된다.

 

 

위와 같이 Timer0 을 사용가능하게 하고 다시 SMBus 속성창을 보면 아래 파박처럼 클럭소스는 147.059 kHz 로 되어있고 이 값을 1/3 에 해당하는 49.019 kHz 가 SMBus Clock Frequency 로 설정되어있음을 확인할 수 있다.

 

 

SMBus 핀지정.

SMBus 의 SCL, SDA 핀으로 사용할 MCU핀 지정하자. Configurator  의 Peripheral Mapping 에서 SMBus 0 의 Clock/Data 를 체크하면 핀 지정이 이뤄진다. 크로스바 우선 순위에 의하여 핀 지정은 기본  P0.0, P0.1 에 할당되게된다.

 

 

SMBus 용 핀을 기본 설정된 것을 사용하지 않고 다른 핀으로  변경하기 위해서는 현재 지정된Port I/O 에서 보이는 SDA가 할당된 핀을 마우스 클릭하여 핀의 속성중 Skip 를 Skipped 선택하면 한칸식 이동되게된다(이 방법 설명상세 보기 -> http://igotit.tistory.com/228 의 단계3에 그림과 함께 설명있음. ). 이 과정을 반복하여 원하는 핀에 SDA, SCL 핀이 할당되게 하면된다.

본 예에서는 P1.2, P1.3 에 할당하였다. 아래 그림이 최종 핀 배치된 모습.

 

 

 

 


 

 

 

인터럽트 설정.

 

SMBus 통신처리시 인트럽트 처리부가 요구된다.

아래 configurator 에서 interrupts 선택하고  오른쪽 속성창에서 Enable SMBus (SMB0) Interrupt 를 Enable 로 선택.

 

 

위 설정후 빌드해보면 interrupts.c 파일내에 아래 처럼 인트럽트 처리 함수가 들어와있다.

 

우리는 이 함수 속에 코드를 추가해야한다.

EFM8 관련으로 제조사에서 배포된 문서에서는 I2C통신처리를 위한 설명있는 문서없다. Simplicity Studio와 함께 배포되는 i2c 관련 example 코드 뒤져서 이해하고 코딩하는 방법이 있고, SILab  에서 제공하는 기타 문서중에 아래 pdf  파일을 보면 이해에 도움이 된다.

 

AN141 : SMBus Communication for Small Form Factor Device Families 

 

an141-SMBus.pdf

 

 

 

 

 

 

 

 

 본 글이 포함된 상위 정리장소 

 

1. MCU  http://igotit.tistory.com/244

2. Connectivity : http://igotit.tistory.com/280 

 

///292.

댓글0


.    
현물 |선물 인버스 |선물 USDT     현물 | 선물 USDT |봇제작툴/카피트레이딩     현물 |선물 인버스 |선물 USDT     .