STM32F103 I2C 튜토리얼
오늘도 CUBEMX로 기초 설정하고 진행해보고자 한다.
프로젝트 열자
F103을 입력하고 보드를 더블클릭하자
yes 버튼 눌러야 기초 설정 다된다.
먼저 PB8, PB9를 눌러서 각각 i2c 설정을 해주자. 기본 설정이 PB8, PB9번핀이 아니라서 나중에 뉴클레오 보드에 눌러놓고 안돌아가서 샷건칠 수 있다.
뉴클레오 보드에 있는 FEMALE 커넥터에 물리고 싶다면 꼭 확인해봐야 할 사안이다.
이제 좌측 패널에서 i2c를 설정해주면 주황색이 초록색으로 바뀌는 것을 알 수 있다.
그다음 뭐 별거 없다. 저거 톱니바퀴 누르면 아래와 같이 창이 뜬다.
창이 켜지면 더 만질 것이 없다. 왜냐면 기초 설정도 필요 없기 때문이다. 그래서 그냥 보낸다고 하면 아래 함수 하나만 쓰면 된다.
HAL_I2C_Master_Transmit
이 함수는 데이터를 보낼 때 쓰는 놈이다. 디스크립션은 아래와 같다.
데이터를 송신한다면 위의 설명을 참고하면 된다.
- 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에게 데이터를 보내고 싶으면 주소를 알아야한다. 스펙시트를 보자.
AD0이 0이라고 가정하면 주소는 1101000, 0x68이다. 근데 위 함수를 사용하려면 <<1 쉬프트를 해야하니까 주소는 최종적으로 아래과 같다.
0x68<<1 = 0xd0
구해졌으면 코드를 작성해보자.
일단 데이터는 자신이 접속하고자 하는 주소와, 데이터를 넣어주면 되겠다.
data에 뭘 넣을지는 레지스터 맵을 보면된다.
그 다음에 위 처럼 코드를 작성하고 하단에 led가 켜지는 코드를 집어넣어보자.
LED가 켜진다면 I2C 통신은 잘 되는 것이라고 볼 수 있다. 만약에 안켜진다면 while문에 머물고 있는 것이니, 주소가 틀렸을 가능성이 있다.
while(HAL_I2C_Master_Transmit(&hi2c1, addr, &data, 1, 100000)!=HAL_OK)
데이터에 뭘 넣냐는 사용자마다 다르고, 기술하려면 내용이 너무 길어질 듯 해서 여기까지만 작성하겠다.