MCU๋กœ EEPROM์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ณผ์ •์„ ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค. MCU๋Š” ST์˜ STM32F103์„ ์‚ฌ์šฉํ•˜์˜€๊ณ , EEPROM์€ I2C I/F์ธ MICROCHIP์˜ 24LC256์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ์šฉ๋Ÿ‰์ด 256k-bit์ธ ๋…€์„์ด๋‹ค.

 

 

 

 

1. I2C๋ž€?

I2C ํฌ์ŠคํŒ…์œผ๋กœ ๊ฐ€๊ธฐ (๋Š” ๋‹ค์Œ์—..)

 

1.1. 24LC256

์‚ฌ์šฉํ•œ 24LC256์€ SOIC 8ํ•€ ํŒจํ‚ค์ง€์ธ ๋…€์„์œผ๋กœ ํ•€๋งต์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

SOIC8 ํŒจํ‚ค์ง€
ํ•€ ๊ธฐ๋Šฅ ํ…Œ์ด๋ธ”

A0,1,2๊ฐ€ ๊ฐ€๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋””๋ฐ”์ด์Šค์˜ ์–ด๋“œ๋ ˆ์Šค ํ•€๋“ค์ด๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋ชจ๋‘ 0์œผ๋กœ ๋งŒ๋“ค์–ด์ค„ ๊ฒƒ์ด๋‹ค. 5, 6๋ฒˆ์ด I2Cํ•€์ด๋‹ค. WP๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. VCC๋กœ ํ’€์—… ์„ธํŒ…ํ•˜๋ฉด ์“ฐ๊ธฐ๋ฅผ ๋ชปํ•˜๊ณ  ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๊ธฐ์— ์ดˆ๊ธฐ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š”๋ฐ ํ’€์—…ํ•˜๋ฉด ๋ฉฉ๊ฝ์ด๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. GND๋กœ ๋ฌถ์–ด์ฃผ๋ฉด ๋ง˜๋Œ€๋กœ ์“ฐ๊ณ  ์ง€์šฐ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ธฐ๋„ ํ•˜๊ณ  ๋ณด์•ˆ์„ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด GPIO๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณ„๋„๋กœ ์ œ์–ดํ•ด ์ฃผ๋ฉด ๋˜๊ฒ ๋‹ค.

 

์ œ์–ด ๋ฐ”์ดํŠธ ํฌ๋ฉง

์œ„์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ I2C ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ ๋ฆฌ๊ธฐ ์ „์— ๋ณด๋‚ด์ค„ ๊ฒƒ์ด ์žˆ๋‹ค. 'S' ์Šคํƒ€ํŠธ ๋น„ํŠธ๊ฐ€ ๋‚ ์•„๊ฐ€๊ณ  ๋””๋ฐ”์ด์Šค ์–ด๋“œ๋ ˆ์Šค๊ฐ€ ๋‚ ์•„๊ฐ€๋Š”๋ฐ ์—ฌ๊ธฐ์„œ ์•ž์— ์žˆ๋Š” 1010 (A)๋Š” ๊ณ ์ •์ด๊ณ  ๋’ค์— A2, A1, A0 ์ด ์„ธ๋น„ํŠธ๋Š” ์œ ๋™์ ์ธ๋ฐ ์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด ๋ชจ๋‘ 0์œผ๋กœ ์„ธํŒ…ํ•ด ์ค„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋“œ๋ ˆ์Šค๋Š” 1byte์—์„œ ๋ชจ์ž๋ž€ 7bit๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. (1010 000x, 0xA0)

 

๋‹ค์Œ์€ Read, Write ๋น„ํŠธ์ธ๋ฐ, ์ด ๋น„ํŠธ๊ฐ€ 1์ด๋ฉด Read์ด๊ณ  0์ด๋ฉด Write์ธ ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ๊นŒ์ง€ ๋‚ ์•„๊ฐ€๋ฉด ack๊ฐ€ ํ•œ ๋น„ํŠธ ๋ณด์ผ ๊ฒƒ์ด๋‹ค.

 

์ œ์–ด ๋ฐ”์ดํŠธ ๋‹ค์Œ์œผ๋กœ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฝ๊ณ  ์“ธ ์–ด๋“œ๋ ˆ์Šค์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ”์ดํŠธ๋ฅผ ์ค˜์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

์–ด๋“œ๋ ˆ์Šค ๋น„ํŠธ

1๋ฐ”์ดํŠธ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด A7~0๊นŒ์ง€๋งŒ ์‚ฌ์šฉ๋˜๊ณ , 2๋ฐ”์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด A14~A0๊นŒ์ง€ ์‚ฌ์šฉ๋œ๋‹ค. ํ’€๋กœ ์‚ฌ์šฉํ•˜๋ฉด 2์˜ 15์Šนํ•˜๋ฉด 32k์— ๋ฐ์ดํ„ฐ 8๋น„ํŠธ๋ฅผ ๊ณฑํ•˜๋ฉด 256k๊ฐ€ ๋œ๋‹ค.

 

 

2. ์“ฐ๊ธฐ/์†ก์‹ 

์šฐ์„ ์ ์œผ๋กœ ํ•ด์ค„๊ฒŒ ์žˆ๋‹ค. 

void eeprom_initialize(I2C_HandleTypeDef *I2C_Handler)
{
	eeprom_hi2c = I2C_Handler;
}

EEPROM ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ค„ ๊ฒƒ์ด๋‹ค. ์™œ? ๊ทธ๋ƒฅ.. I2C๊ฐ€ ์—ฌ๊ธฐ์ €๊ธฐ์„œ ์“ธ ์ˆ˜ ์žˆ์œผ๋‹ˆ, ๊ฐ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ถ„๋ฅ˜ ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

 

'I2C_HandleTypeDef' ๋ผ๋Š” ๊ตฌ์กฐ์ฒด์˜ ๋ณ„๋ช…์„ 'I2C_Handler' ๋ผ๊ณ  ์ •ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ 'eeprom_hi2c'์— ๋„ฃ๊ฒ ๋‹ค.

 

 

2.1. ์“ฐ๊ธฐ (๋ฉ”๋ชจ๋ฆฌ์šฉ)

์“ฐ๊ธฐ ๋ฐฉ๋ฒ•์€ ์ธํ„ฐ๋ŸฝํŠธ๋ฐฉ์‹๊ณผ ํด๋ง ๋ฐฉ์‹๋„ ์žˆ๋Š”๋ฐ, MEM ์ด๋ผ๋Š” ๋ฉ”๋ชจ๋ฆฌ์šฉ์ด ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ๋Š” ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค.

 

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)

 

  • I2C_HandleTypeDef *hi2c : HAL Library I2C์˜ ๊ตฌ์กฐ์ฒด์ด๋‹ค?
  • uint16_t DevAddress : ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ณ  ์‹ถ์€ ๋””๋ฐ”์ด์Šค ์ฃผ์†Œ ๊ฐ’
  • uint16_t MemAddress : ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์‹ถ์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ฐ’
  • uint16_t MemAddSize : ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ 1byte์ธ๊ฐ€, 2byte์ธ๊ฐ€๋ฅผ 1byte๋ฉด '1', 2byte๋ฉด '2'
  • uint8_t *pData : ์“ฐ๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ
  • uint16_t Size : ๋ฐ์ดํ„ฐ์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ 1byte๋ฉด '1'
  • uint32_t Timeout : x ms ๋™์•ˆ ๋Œ€๊พธ๊ฐ€ ์—†์œผ๋ฉด error

 

์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ดค๋‹ค. ํ†ต์‹ ์ด ์ž˜๋˜๋ฉด printf๋Š” ๋ฌด์‹œํ•˜๊ณ  ๋„˜์–ด๊ฐˆ ๊ฒƒ์ด๊ณ , ํ†ต์‹ ์ด ์ž˜ ์•ˆ๋˜๋ฉด 'eeprom i2c write error' ๋ฉ”์„ธ์ง€๊ฐ€ ์ฝ˜์†”์— ๋ฟŒ๋ ค์งˆ ๊ฒƒ์ด๋‹ค.

void eeprom_write(U16 address,U08 byte)
{
	if (HAL_I2C_Mem_Write(eeprom_hi2c, EEPROM_ADDR, address, 2, &byte, 1, 10) != HAL_OK)
		{
			printf("eeprom i2c write Error!\r\n");
		}
}

์—ฌ๊ธฐ์„œ EEPROM_ADDR์€ '0xA0' ์ด๋‹ค. 'address'์—๋Š” ์•„๋ฌด ๊ฐ’์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ณ  ์‹ถ์€ ์ฃผ์†Œ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

2.2 ์ฝ๊ธฐ (๋ฉ”๋ชจ๋ฆฌ์šฉ)

์ฝ๊ธฐ ๋ฐฉ๋ฒ•๋„ ์“ฐ๊ธฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ธํ„ฐ๋ŸฝํŠธ๋ฐฉ์‹๊ณผ ํด๋ง๋ฐฉ์‹์ด ์žˆ๋‹ค.์—ฌ๊ธฐ์„œ๋Š” MEM ๋ฉค๋ฉค๋ฉ”~๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค.

 

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)

 

  • I2C_HandleTypeDef *hi2c : HAL Library I2C์˜ ๊ตฌ์กฐ์ฒด์ด๋‹ค?
  • uint16_t DevAddress : ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์‹ถ์€ ๋””๋ฐ”์ด์Šค ์ฃผ์†Œ ๊ฐ’
  • uint16_t MemAddress : ์ฝ๊ณ  ์‹ถ์€ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ฐ’
  • uint16_t MemAddSize : ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ 1byte์ธ๊ฐ€, 2byte์ธ๊ฐ€๋ฅผ 1byte๋ฉด '1', 2byte๋ฉด '2'
  • uint8_t *pData : ์ฝ๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ
  • uint16_t Size : ๋ฐ์ดํ„ฐ์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ 1byte๋ฉด '1'
  • uint32_t Timeout : x ms ๋™์•ˆ ๋Œ€๊พธ๊ฐ€ ์—†์œผ๋ฉด error

 

์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ๊ธฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ดค๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”๋ฐ ์‹คํŒจํ•˜๋ฉด ์ฝ˜์†”์ฐฝ์— printf์— ์žˆ๋Š” ๋‚ด์šฉ๋“ค์ด ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค. Error!!!!

unsigned char eeprom_read(U16 address)
{
	U08 data;
	
	if (HAL_I2C_Mem_Read(eeprom_hi2c, EEPROM_ADDR, address, 2, &data, 1, 10) != HAL_OK)
		{
			printf("eeprom i2c read Error!\r\n");
		}	
	return data;
}

 

์—ฌ๊ธฐ๊นŒ์ง€..

 

๋ณผ๋งŒํ•œ์ฑ…

 
์œ„ i2c eeprom ๋ชจ๋“ˆ๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋ชจ๋“ˆ์„ ํ˜น์‹œ๋‚˜ ๊ตฌ๋งคํ• ๊นŒ ์‹ถ๋‹ค๋ฉด ์•„๋ž˜ ๋งํฌ์—์„œ ๊ตฌ๋งคํ•  ์ˆ˜๋„ ์žˆ์Œ.

 

DM2247 ์•„๋‘์ด๋…ธ AT24C08 EEPROM I2C ๋ชจ๋“ˆAT24C02 IIC I2C ์ง๋ ฌ ์ธํ„ฐํŽ˜์ด์Šค ํฌํŠธ EEPROM ๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ ๋ชจ๋“ˆ DIY ์šฉ ์ „์ž ์Šค๋งˆํŠธ ์นด 3.3-5V Arduino, ํ•œ๊ฐœ์˜ต์…˜0
๋ฐ˜์‘ํ˜•
  • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
  • ๋„ค์ด๋ฒ„ ๋ฐด๋“œ์— ๊ณต์œ ํ•˜๊ธฐ
  • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
  • ์นด์นด์˜ค์Šคํ† ๋ฆฌ ๊ณต์œ ํ•˜๊ธฐ

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."