[stm32] restart를 사용한 I2C 통신

이채윤·2022년 6월 10일
0

임베디드

목록 보기
53/70

[관련 HAL 함수 소개]

  • Master I2C 모드에서 인터럽트와 함께 non-blocking mode에서 데이터 양을 순차적으로 전송
  • 해당 인터페이스는 통신 전송중에 방향이 바뀔때 repeated start를 사용할 수 있다.

  • I2C handl의 상태를 리턴한다.

  • 통신 전송중에 방향이 바뀔때 repeated start를 사용할 수 있다.

[진행 과정]

  • I2C 인터럽트 설정을 해준다.

  • HAL_I2C_Master_Sequential_Transmit_IT() 함수를 이용하여 값을 보낸다. (I2C_FIRST_FRAME 옵션은 처음 일반 IT처럼 시작하지만, 마지막에 STOP이 아닌 상태로 된다.)
  • 일정 시간의 Delay를 준다.

  • HAL_I2C_Master_Sequential_Receive_IT() 함수를 이용하여 값을 받아온다. (I2C_LAST_FRAME 옵션은 중간에 Restart 상태로 시작하고, 마지막에 STOP 상태로 된다.)

  • 위 사진처럼 결과로 0X04를 읽어오는 모습을 확인할 수 있다.

[코드]

uint8_t snd_soc_TCC_read(uint16_t i2cAddress, uint8_t *tccData, int addressSize)
{
HAL_StatusTypeDef ret = HAL_I2C_Master_Sequential_Transmit_IT(&hi2c2, i2cAddress, tccData, addressSize, I2C_FIRST_FRAME);
HAL_Delay(100);
while (HAL_I2C_GetState(&hi2c2) != HAL_I2C_STATE_READY)
{
}
uint8_t i2cReadBuffer[16] = {0,};
HAL_StatusTypeDef rets = HAL_I2C_Master_Sequential_Receive_IT(&hi2c2, i2cAddress+1, i2cReadBuffer, 1, I2C_LAST_FRAME);
HAL_Delay(100);
while (HAL_I2C_GetState(&hi2c2) != HAL_I2C_STATE_READY)
{
}
if (rets == HAL_OK)
{
printf("TCC7604 HAL_OK !! receive --> %X\n", i2cReadBuffer[0]);
}else {
if (rets == HAL_BUSY) printf(" TCC7604 BUSY !!!  \n");
if (rets == HAL_ERROR) printf(" TCC7604 ERROR !!!  \n");
if (rets == HAL_TIMEOUT) printf(" TCC7604 TIMEOUT !!!  \n");
}
}

0개의 댓글