본문 바로가기
MCU/STM32

[MPU6050] STM32 HAL I2C설정, I2C함수

by mokhwasomssi 2021. 2. 20.

저는 STM32F103RBT6-nucleo board 를 사용했습니다.

cube mx 사용해서 i2c설정과 핀설정 완료

-hal i2c 설정

(main.c)

I2C_HandleTypeDef hi2c2; //구조체 변수 hi2c2로 선언

static void MX_I2C2_Init(void)

{

hi2c2.Instance = I2C2;

hi2c2.Init.ClockSpeed = 100000;

hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2;

hi2c2.Init.OwnAddress1 = 0;

hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;

hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;

hi2c2.Init.OwnAddress2 = 0;

hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;

hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

if (HAL_I2C_Init(&hi2c2)​ != HAL_OK)

{

Error_Handler();

}

HAL_I2C_MspInit(&hi2c2);

}

int main()

{

MX_I2C2_Init();

}

-hal i2c 핀설정

(stm32f1xx_hal_msp.c)

void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};

if(hi2c->Instance==I2C2)

{

__HAL_RCC_GPIOB_CLK_ENABLE();

GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;

GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; //오픈 드레인 모드

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

__HAL_RCC_I2C2_CLK_ENABLE();

}

}

-hal i2c 함수 (stm32f1xx_hal_i2c.c 에 정의 되어있음)

 

기본적으로 3개의 함수를 사용합니다.

HAL_I2C_IsDeviceReady

HAL_I2C_Master_Transmit

HAL_I2C_Master_Receive

HAL_StatusTypeDef HAL_I2C_IsDeviceReady ( I2C_HandleTypeDef* hi2c,

uint16_t DevAddress,

uint32_t Trials,

uint32_t Timeout

)

타겟 디바이스가 통신 준비가 되어있는지 체크

Parameters

hi2c : I2C_HandleTypeDef에 접근하는 포인터

DevAddress : 슬레이브 디바이스의 주소. 디바이스의 7bit 주소는 왼쪽으로 한칸 쉬프트 되어야 한다.

Trials : 시도 횟수

Timeout : 시간 초과 기간. i2c 처리 시간이 이 값보다 크면 i2c 제대로 작동 되고 있다고 생각하지 않음.

return values : HAL status

HAL_StatusTypeDef HAL_I2C_Master_Transmit ( I2C_HandleTypeDef* hi2c,

uint16_t DevAddress,

uint8_t* pData,

uint16_t Size,

uint32_t Timeout

)

마스터 모드에서 데이터를 전송

Parameters

hi2c : I2C_HandleTypeDef에 접근하는 포인터

DevAddress : 슬레이브 디바이스의 주소. 디바이스의 7bit 주소는 왼쪽으로 한칸 쉬프트 되어야 한다.

pData : 데이터 버퍼에 접근하는 포인터

Size : 보낼 데이터의 크기

Timeout : 시간 초과 기간. i2c 처리 시간이 이 값보다 크면 i2c 제대로 작동 되고 있다고 생각하지 않음.

return values : HAL status

HAL_StatusTypeDef HAL_I2C_Master_Receive ( I2C_HandleTypeDef* hi2c,

uint16_t DevAddress,

uint8_t* pData,

uint16_t Size,

uint32_t Timeout

)

마스터 모드에서 데이터를 받기

Parameters

hi2c : I2C_HandleTypeDef에 접근하는 포인터

DevAddress : 슬레이브 디바이스의 주소. 디바이스의 7bit 주소는 왼쪽으로 한칸 쉬프트 되어야 한다.

pData : 데이터 버퍼에 접근하는 포인터

Size : 보낼 데이터의 크기

Timeout : 시간 초과 기간. i2c 처리 시간이 이 값보다 크면 i2c 제대로 작동 되고 있다고 생각하지 않음.

return values : HAL status