[STM32] I2C EEPROM HAL_I2C_Mem_Write not write 오류

이채윤·2022년 4월 29일
0

임베디드

목록 보기
23/70

[문제 상황]

  • HAL_I2C_Mem_Write()함수를 사용하여 EEPROM에 값을 적으려고 했다. 리턴값도 HAL_OK로 제대로 출력되는 모습을 확인할 수 있었다.
  • 읽어오는 것은 제대로 읽어오지만 적어줄때 무슨 문제가 있는건지 적은 값이 들어가지 않는다.
  • Delay문제일까 싶어서 HAL_I2C_Mem_Write()함수의 앞과 뒤로 HAL_Delay(1000); 만큼의 딜레이를 줘도 마찬가지인 상황이다.

[해결]

  • 결론부터 말하자면 WP 문제였다.
  • 나는 현재 EEPROM으로 24LC08B-I/OT을 사용중이다.
  • 위 사진은 해당 Datasheet를 읽었을때 WP에 관해 설명하는 내용이다.
  • 핀이 Vss(-)에 연결되어있으면 쓰기 보호가 비활성화 된다 (쓸 수 있다)
  • 핀이 Vcc(+)인 경우 전체 array(000~3FF)를 쓰는 것을 보호한다 (쓸 수 없다)
  • 해당 문제를 해결해주기 위해서 위처럼 WP의 GPIO 출력 0으로 맞춰주었다.

uint8_t readBuffer[16];
uint8_t writteBuffer[16] = {0x05, 0x06, 0x07, 0x08, 0x09, 0x05, 0x06, 0x07, 0x08, 0x09, 0x05, 0x06, 0x07, 0x08, 0x09, 0x05};

HAL_StatusTypeDef rets = HAL_I2C_Mem_Write(&hi2c2, AT24C256C_addr, 0x00, 1, writteBuffer, 16, 1000);
HAL_Delay(1000);
HAL_StatusTypeDef ret = HAL_I2C_Mem_Read(&hi2c2, AT24C256C_addr, 0x00, 1, readBuffer, 16, 1000);
if (ret == HAL_OK) {
printf("success!! \n");
}else {
printf(" ret=%d, %ld : Fail !!!\n", ret, hi2c2.ErrorCode );
}
printf("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X \n",
readBuffer[0], readBuffer[1], readBuffer[2], readBuffer[3], readBuffer[4],
readBuffer[5], readBuffer[6], readBuffer[7], readBuffer[8], readBuffer[9],
readBuffer[10], readBuffer[11], readBuffer[12], readBuffer[13], readBuffer[14],
readBuffer[15]);
HAL_Delay(1000);

위처럼 코드를 작성하고나면 아래처럼 정상적으로 출력되는 모습을 확인할 수 있다.

[WP란?]

  • EEPROM이나 ROM계열은 WP 핀이 있어서 '1' , '0' 값에 따라서 Write 할 수 있게 하거나 못하게 하거나 합니다.
  • 혹시라도 노이즈나 원치 않은 상황에서 Write가 될 수 있는것을 방지하기 위해서 사용합니다.
  • Write를 보호한다고 해서 Write Protect 를 줄여서 WP로 이야기 합니다.

[교훈]

  • 앞으로 데이터시트를 꼼꼼히 읽어보자..

0개의 댓글