[STM32] I2C 함수 사용법

Eugene CHOI·2021년 10월 15일
1

STM32

목록 보기
8/8
post-thumbnail

1. Transmit

상태 코드는 cpp.hotexample을 참조하였습니다.

1-1. HAL_StatusTypeDef

HAL_I2C 함수들의 반환 자료형인 StatusTypeDef의 정의는 다음과 같습니다.

typedef enum{
  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                                     */

}HAL_I2C_StateTypeDef;

1-2. HAL_I2C_Master_Transmit

특정 I2C Slave에 바이트 데이터를 보내는 함수입니다.

HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
  • hi2c: I2C 핸들의 주소
  • DevAddress: I2C Slave의 8bit 주소
  • pData: 버퍼 배열의 주소
  • Size: 전송할 데이터의 바이트 수
  • Timeout: 최대 지연 시간 [ms]

1-2-1. Example

다음은 7bit address가 0x27인 장치에 3byte를 전송하는 코드입니다.

#define SLAVE_ADDR 0x27 << 1
HAL_StatusTypeDef error;
uint8_t buffer[128] = {0x3F, 0xDD, 0x54};
error = HAL_I2C_Master_Transmit(&hi2c1, SLAVE_ADDR, buffer, 3, HAL_MAX_DELAY);
if (error != HAL_OK) while();

2. Repeated Start

I2C를 통하여 Repeated Start 명령을 주기 위해서는 다음과 같은 함수들을 이용합니다.
단순히 HAL_I2C_Master_Write와 HAL_I2C_Master_Read를 연달아 호출하는 것으로는 정상 작동 하지 않습니다.
하지만 다음과 같은 함수를 통하여 쉽게 사용할 수 있습니다.

2-1. HAL_I2C_Mem_Write

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 핸들의 주소
  • DevAddress : I2C Slave의 주소
  • MemAddress : I2C Slave에서 쓰기 할 레지스터의 주소
  • MemAddSize : 주소의 바이트 수(1byte->1, 2byte->2)
  • pData : 버퍼 배열의 주소
  • Size : 레지스터에 쓰기 할 바이트 수
  • Timeout : 최대 지연 시간 [ms]

2-1-1. Example

다음은 7bit address가 0x27인 장치의 0x0A 주소의 레지스터에 3byte를 쓰기 하는 코드입니다.

#define SLAVE_ADDR 0x27 << 1
#define REG_ADDR 0x0A
HAL_StatusTypeDef error;
uint8_t buffer[128] = {0x3F, 0xDD, 0x54};
error = HAL_I2C_Mem_Write(&hi2c1, SLAVE_ADDR, REG_ADDR, 1, buffer, 3, HAL_MAX_DELAY);
if (error != HAL_OK) while();

2-2. HAL_I2C_Mem_Read

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 핸들의 주소
  • DevAddress : I2C Slave의 주소
  • MemAddress : I2C Slave에서 읽을 레지스터의 주소
  • MemAddSize : 주소의 바이트 수(1byte->1, 2byte->2)
  • pData : 버퍼 배열의 주소
  • Size : 레지스터에서 읽어 올 바이트 수
  • Timeout : 최대 지연 시간 [ms]

2-2-1. Example

다음은 7bit address가 0x27인 장치의 0x0A 주소의 레지스터에서 3byte를 읽어 오는 코드입니다.

#define SLAVE_ADDR 0x27 << 1
#define REG_ADDR 0x0A
HAL_StatusTypeDef error;
uint8_t buffer[128] = {0,};
error = HAL_I2C_Mem_Read(&hi2c1, SLAVE_ADDR, REG_ADDR, 1, buffer, 3, HAL_MAX_DELAY);
if (error != HAL_OK) while();

3. Peripheral functions

3-1. HAL_I2C_GetState

현재 I2C Peripheral의 상태를 반환합니다.

HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c)

3-1-1. Example

#define SLAVE_ADDR 0x27 << 1
HAL_StatusTypeDef error;
uint8_t buffer[128] = {0x3F, 0xDD, 0x54};
error = HAL_I2C_Master_Transmit(&hi2c1, SLAVE_ADDR, buffer, 3, HAL_MAX_DELAY);
if (error != HAL_OK) while();

// I2C의 전송이 완료될 때까지 대기
while(HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);

3-2. HAL_I2C_GetMode

HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c)

3-4. HAL_I2C_GetError

정수 형태의 에러 코드를 반환하는 코드입니다.

uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c)

3-4-1. 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      */
profile
Hi, my name is Eugene CHOI the Automotive MCU FW developer.

0개의 댓글