상태 코드는 cpp.hotexample을 참조하였습니다.
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;
특정 I2C Slave에 바이트 데이터를 보내는 함수입니다.
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
다음은 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();
I2C를 통하여 Repeated Start 명령을 주기 위해서는 다음과 같은 함수들을 이용합니다.
단순히 HAL_I2C_Master_Write와 HAL_I2C_Master_Read를 연달아 호출하는 것으로는 정상 작동 하지 않습니다.
하지만 다음과 같은 함수를 통하여 쉽게 사용할 수 있습니다.
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)
다음은 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();
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)
다음은 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();
현재 I2C Peripheral의 상태를 반환합니다.
HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c)
#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);
HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c)
정수 형태의 에러 코드를 반환하는 코드입니다.
uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c)
정수 형태의 에러 코드는 다음과 같이 정의되어 있습니다.
#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 */