STM32F103 I2C 튜토리얼
오늘도 CUBEMX로 기초 설정하고 진행해보고자 한다.
![](https://i0.wp.com/dkeemin.com/wp-content/uploads/2019/01/image-21.png?fit=640%2C361&ssl=1)
프로젝트 열자
![](https://i0.wp.com/dkeemin.com/wp-content/uploads/2019/01/image-22.png?fit=640%2C373&ssl=1)
F103을 입력하고 보드를 더블클릭하자
![](http://dkeemin.com/wp-content/uploads/2019/01/image-23.png)
yes 버튼 눌러야 기초 설정 다된다.
![](https://i1.wp.com/dkeemin.com/wp-content/uploads/2019/01/image-24.png?fit=640%2C361&ssl=1)
먼저 PB8, PB9를 눌러서 각각 i2c 설정을 해주자. 기본 설정이 PB8, PB9번핀이 아니라서 나중에 뉴클레오 보드에 눌러놓고 안돌아가서 샷건칠 수 있다.
![/media/uploads/aalokbhat/st-nucleo-f103rb-arduino_2.png](https://os.mbed.com/media/uploads/aalokbhat/st-nucleo-f103rb-arduino_2.png)
뉴클레오 보드에 있는 FEMALE 커넥터에 물리고 싶다면 꼭 확인해봐야 할 사안이다.
![](https://i1.wp.com/dkeemin.com/wp-content/uploads/2019/01/image-25.png?fit=640%2C401&ssl=1)
이제 좌측 패널에서 i2c를 설정해주면 주황색이 초록색으로 바뀌는 것을 알 수 있다.
그다음 뭐 별거 없다. 저거 톱니바퀴 누르면 아래와 같이 창이 뜬다.
![](http://dkeemin.com/wp-content/uploads/2019/01/image-26.png)
![](http://dkeemin.com/wp-content/uploads/2019/01/image-27.png)
창이 켜지면 더 만질 것이 없다. 왜냐면 기초 설정도 필요 없기 때문이다. 그래서 그냥 보낸다고 하면 아래 함수 하나만 쓰면 된다.
HAL_I2C_Master_Transmit
이 함수는 데이터를 보낼 때 쓰는 놈이다. 디스크립션은 아래와 같다.
![](https://i0.wp.com/dkeemin.com/wp-content/uploads/2019/01/image-28.png?fit=640%2C295&ssl=1)
데이터를 송신한다면 위의 설명을 참고하면 된다.
- I2C_HandleTypeDef * hi2c : i2c의 핸들러의 주소를 넘겨주는 인자이다. 위에서 설정한대로라면 i2c1을 사용하므로 &hi2c1을 사용하면 될 것이다.
- uint16_t DevAddress : 두번째로 넘겨줄 인자는 i2c의 주소를 넘겨주는 방식이다. i2c의 주소는 보통 7비트로 되어 있는데 이것을 <<1시킨 값을 넣어줘야 한다. 왜냐하면 i2c의 주소 7비트 + R/W bit로 총 8비트로 구동하기 때문이다. 이 함수에서는 자동으로 <<1 쉬프트 시켜주지 않으므로 쉬프트 된 결과를 넣어줘야한다.
- uint8_t * pData : 넘겨줄 데이터의 주소를 넘겨줘야한다. 1개의 데이터라고 하면 보통 &연산자로 넘겨줄거고, 배열이라면 그냥 배열의 이름을 넣어주면 되겠다.
- uint16_t Size : 이건 뭐 데이터 길이 넣어주면 된다.
- uint32_t Timeout : 타임아웃 길이 정하는건데..뭐 대충 정해도 된다.
데이터를 보내보기
일단 mpu6050에게 데이터를 보내고 싶으면 주소를 알아야한다. 스펙시트를 보자.
![](https://i0.wp.com/dkeemin.com/wp-content/uploads/2019/01/image-29.png?fit=640%2C30&ssl=1)
AD0이 0이라고 가정하면 주소는 1101000, 0x68이다. 근데 위 함수를 사용하려면 <<1 쉬프트를 해야하니까 주소는 최종적으로 아래과 같다.
0x68<<1 = 0xd0
![](http://dkeemin.com/wp-content/uploads/2019/01/image-30.png)
구해졌으면 코드를 작성해보자.
![](http://dkeemin.com/wp-content/uploads/2019/01/image-31.png)
일단 데이터는 자신이 접속하고자 하는 주소와, 데이터를 넣어주면 되겠다.
data에 뭘 넣을지는 레지스터 맵을 보면된다.
![](http://dkeemin.com/wp-content/uploads/2019/01/image-32-845x30.png)
그 다음에 위 처럼 코드를 작성하고 하단에 led가 켜지는 코드를 집어넣어보자.
LED가 켜진다면 I2C 통신은 잘 되는 것이라고 볼 수 있다. 만약에 안켜진다면 while문에 머물고 있는 것이니, 주소가 틀렸을 가능성이 있다.
while(HAL_I2C_Master_Transmit(&hi2c1, addr, &data, 1, 100000)!=HAL_OK)
데이터에 뭘 넣냐는 사용자마다 다르고, 기술하려면 내용이 너무 길어질 듯 해서 여기까지만 작성하겠다.