저는 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