본문 바로가기
Stm32/개인 학습

HAL 라이브러리 I2C 함수 정리

by [Akashic Records] 개발의선지자 2024. 7. 7.

해당 글은 개인 공부 정리를 위해 작성되었습니다.

STM32 HAL 라이브러리 I2C 관련 함수들과 해당 함수 매개변수들에 대해 정리하고 한다.

 

I2C 관련 함수들은 cpp.hotexample\ 발췌하였습니다.

Blocking(Polling) , 인터럽트, DMA 모드 각각 존재한다.

 

※ Blocking Mode

Polling Mode

1. Master 장치 데이터 송신 

HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, 

uint8_t *pData, uint16_t Size, uint32_t Timeout)

  • hi2c 포인터 : I2C_HandleTypeDef를 가리키는 hi2c 포인터 
  • DevAddress : 타겟 장치 어드레스(7bit)
  • pData : 데이터 버퍼를 가리키는 포인터
  • Size : 보낸 데이터 크기
  • Timeout : 타임아웃 시간(해당 작업이 수행되지 않아 자동적으로 종료하는 시간)
  • 리턴값 : i2c status

 

2. Master 장치 데이터 수신

HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

  • hi2c 포인터 : I2C_HandleTypeDef를 가리키는 hi2c 포인터 
  • DevAddress : 타겟 장치 어드레스(7bit)
  • pData : 데이터 버퍼를 가리키는 포인터
  • Size : 받은 데이터 크기
  • Timeout : 타임아웃 시간(해당 작업이 수행되지 않아 자동적으로 종료하는 시간)
  • 리턴값 : i2c status

3.  Slave 장치 데이터 송신 

HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)

  • hi2c 포인터 : I2C_HandleTypeDef를 가리키는 hi2c 포인터 
  • DevAddress : 타겟 장치 어드레스(7bit)
  • pData : 데이터 버퍼를 가리키는 포인터
  • Size : 보낸 데이터 크기
  • Timeout : 타임아웃 시간(해당 작업이 수행되지 않아 자동적으로 종료하는 시간)
  • 리턴값 : i2c status

4.  Slave 장치 데이터 수신

HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout) 

  • hi2c 포인터 : I2C_HandleTypeDef를 가리키는 hi2c 포인터 
  • DevAddress : 타겟 장치 어드레스(7bit)
  • pData : 데이터 버퍼를 가리키는 포인터
  • Size : 받은 데이터 크기
  • Timeout : 타임아웃 시간(해당 작업이 수행되지 않아 자동적으로 종료하는 시간)
  • 리턴값 : i2c status

5. 특정 메모리 번지에 데이터 쓰기 

HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

  • hi2c 포인터 : I2C_HandleTypeDef를 가리키는 hi2c 포인터 
  • DevAddress : 타겟 장치 어드레스(7bit)
  • MemAddress : 데이터를 쓰고자 하는 내부 메모리 주소(주로 레지스터 주소)
  • MemAddSize : 데이터를 쓰고자 하는 내부 메모리 주소 사이즈
  • pData : 데이터 버퍼를 가리키는 포인터
  • Size : 쓴 데이터 크기
  • Timeout : 타임아웃 시간(해당 작업이 수행되지 않아 자동적으로 종료하는 시간)
  • 리턴값 : i2c status

6. 특정 메모리 번지에 데이터 읽기

HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

 

  • hi2c 포인터 : I2C_HandleTypeDef를 가리키는 hi2c 포인터 
  • DevAddress : 타겟 장치 어드레스(7bit)
  • MemAddress : 데이터 읽고자 하는 내부 메모리 주소(주로 레지스터 주소)
  • MemAddSize : 데이터 읽고자 하는 내부 메모리 주소 사이즈
  • pData : 데이터 버퍼를 가리키는 포인터
  • Size : 읽은 데이터 크기
  • Timeout : 타임아웃 시간(해당 작업이 수행되지 않아 자동적으로 종료하는 시간)
  • 리턴값 : i2c status

※ Non-Blocking Mode

Interrupt Mode

위 Blocking 함수 이름 + _IT  : Timeout 파라미터 빼고는 나머지 파라미터는 동일

DMA Mode

위 Blocking 함수 이름 + _DMA  : Timeout 파라미터 빼고는 나머지 파라미터는 동일

 

7. I2C  전송 상태 반환

HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c)

  • hi2c 포인터 : I2C_HandleTypeDef를 가리키는 hi2c 포인터
  • 리턴값 : i2c state

i2c 전송 상태( I2C_HandleTypeDef)
HAL_I2C_STATE_RESET             = 0x00U,   /*!< Peripheral is not yet Initialized         */
HAL_I2C_STATE_READY             = 0x20U,   /*!< Peripheral Initialized and ready for use  */
HAL_I2C_STATE_BUSY              = 0x24U,   /*!< An internal process is ongoing            */
HAL_I2C_STATE_BUSY_TX           = 0x21U,   /*!< Data Transmission process is ongoing      */
HAL_I2C_STATE_BUSY_RX           = 0x22U,   /*!< Data Reception process is ongoing         */
HAL_I2C_STATE_LISTEN            = 0x28U,   /*!< Address Listen Mode is ongoing            */
HAL_I2C_STATE_BUSY_TX_LISTEN    = 0x29U,   /*!< Address Listen Mode and Data Transmission
                                                 process is ongoing                         */
HAL_I2C_STATE_BUSY_RX_LISTEN    = 0x2AU,   /*!< Address Listen Mode and Data Reception
                                                 process is ongoing                         */
HAL_I2C_STATE_ABORT             = 0x60U,   /*!< Abort user request ongoing                */
HAL_I2C_STATE_TIMEOUT           = 0xA0U,   /*!< Timeout state                             */
HAL_I2C_STATE_ERROR             = 0xE0U    /*!< Error                                     */


8. I2C 모드 반환

HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c)

 

  • hi2c 포인터 : I2C_HandleTypeDef를 가리키는 hi2c 포인터
  • 리턴값 : i2c Mode(Master 또는 Slave 또는 no mode)

I2C 모드(HAL_I2C_ModeTypeDef)

HAL_I2C_MODE_NONE               = 0x00U,   /*!< No I2C communication on going             */
HAL_I2C_MODE_MASTER             = 0x10U,   /*!< I2C communication is in Master Mode       */
HAL_I2C_MODE_SLAVE              = 0x20U,   /*!< I2C communication is in Slave Mode        */
HAL_I2C_MODE_MEM                = 0x40U    /*!< I2C communication is in Memory Mode       */

9. I2C 에러 상태 반환

uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c)

  • hi2c 포인터 : I2C_HandleTypeDef를 가리키는 hi2c 포인터
  • 리턴값 : i2c error Code

에러 코드(Error Code)

#define HAL_I2C_ERROR_NONE              0x00000000U    /*!< No error              */
#define HAL_I2C_ERROR_BERR              0x00000001U    /*!< BERR error            */
#define HAL_I2C_ERROR_ARLO              0x00000002U    /*!< ARLO error            */
#define HAL_I2C_ERROR_AF                0x00000004U    /*!< AF error              */
#define HAL_I2C_ERROR_OVR               0x00000008U    /*!< OVR error             */
#define HAL_I2C_ERROR_DMA               0x00000010U    /*!< DMA transfer error    */
#define HAL_I2C_ERROR_TIMEOUT           0x00000020U    /*!< Timeout Error         */
#define HAL_I2C_ERROR_SIZE              0x00000040U    /*!< Size Management error */
#define HAL_I2C_ERROR_DMA_PARAM         0x00000080U    /*!< DMA Parameter Error   */
#define HAL_I2C_WRONG_START             0x00000200U    /*!< Wrong start Error     */

 

'Stm32 > 개인 학습' 카테고리의 다른 글

Timer[4] Input capture  (0) 2024.07.14
HAL 라이브러리 SPI 함수 정리  (0) 2024.07.07
ADC란?(PCM)[1]  (0) 2024.07.05
Timer[3] - PWM  (0) 2024.06.19
Timer[2] - 타이머 인터럽트  (0) 2024.06.13