Тема: Організація пам'яті EEPROM AT24C512
Всім привіт.
Допоможіть будь ласка розібратись як організована пам'ять в EEPROM AT24C512. Я зовсім заплутався. В мене повний ступор.
Дивлюсь в datasheet і в 5 розділі "Memory Organization" написано: AT24C512C, 512-Kbit Serial EEPROM: The 512K is internally organized as 512 pages of 128 bytes each.
Добре, це я розумію так: що eeprom має 512 сторінок по 128 байтів. Запис в пам'ять має бути в межах однієї сторінки? Так? Або інакше, я можу за один раз записати не більше 128 байтів? Чи як? Адресація наскрізна? Ну а якщо більш ніж 128 байт відправити на запис, що відбудеться? Що втратиться? Те що за межами 128 байтів чи перші 128 байт?
Знайшов бібліотеку для eeprom. Спробував - працює. Записав спочатку з 0 адреси 14 байтів, потім з 16 адреси ще 18 байтів і те і те читається. Значить можна в межах однієї сторінки не за раз писати дані? Одного разу один шматочок даних, іншого разу інший шматочок даних? Так? Бо думав що коли пишеш в сторінку, то вона повністю перезаписується і попередні данні втрачаються. Ні?
Ще плутаюсь в термінології. В бібліотеці в файлі eeprom24xxConfig.h
#ifndef _24XXCONFIG_H
#define _24XXCONFIG_H
#define _EEPROM_SIZE_KBIT 128
#define _EEPROM24XX_I2C hi2c1
#define _EEPROM24XX_ADDRESS 0x50<<1
#define _EEPROM_FREERTOS_IS_ENABLE 0
#endif
Є визначення _EEPROM_SIZE_KBIT як 128. Це правильно для AT24C512? Чи треба вказати таки 512?
Бо крізь по прайсам в магазах мікросхема AT24C512 вказано що вона має пам'яті 512 кілобіт з організацією 64k x 8. Це як? Скільки сторінок по скільки байт? Тоді виходить потрібно _EEPROM_SIZE_KBIT вказати як 64? Я вже нічого не розумію.
Далі в цій бібліотеці в файлі eeprom24xx.c є перевірка розміру записуваних даних:
bool EEPROM24XX_Save(uint16_t Address, void *data, size_t size_of_data)
{
#if ((_EEPROM_SIZE_KBIT==1) || (_EEPROM_SIZE_KBIT==2))
if(size_of_data > 8)
{
return false;
}
#endif
#if ((_EEPROM_SIZE_KBIT==4) || (_EEPROM_SIZE_KBIT==8) || (_EEPROM_SIZE_KBIT==16))
if(size_of_data > 16)
{
return false;
}
#endif
#if ((_EEPROM_SIZE_KBIT==32) || (_EEPROM_SIZE_KBIT==64) || (_EEPROM_SIZE_KBIT==128))
if(size_of_data > 32)
{
return false;
}
#endif
#if ((_EEPROM_SIZE_KBIT==1) || (_EEPROM_SIZE_KBIT==2))
if(HAL_I2C_Mem_Write(&_EEPROM24XX_I2C, _EEPROM24XX_ADDRESS, Address, I2C_MEMADD_SIZE_8BIT, (uint8_t*) data, size_of_data, 100) == HAL_OK)
#else
if(HAL_I2C_Mem_Write(&_EEPROM24XX_I2C, _EEPROM24XX_ADDRESS, Address, I2C_MEMADD_SIZE_16BIT, (uint8_t*) data, size_of_data, 100) == HAL_OK)
#endif
{
#if (_EEPROM_FREERTOS_IS_ENABLE==1)
osDelay(7);
#else
HAL_Delay(7);
#endif
return true;
}
else
{
return false;
}
}
Максимум тут _EEPROM_SIZE_KBIT==128. І тоді розмір даних не має перевищувати 32 байт. Чому так? Якщо в 24C512 сторінка 128 байт, чому не можна більш ніж 32?
То таки в 24C512 розмір _EEPROM_SIZE_KBIT = 512, чи таки 64? Як 512 то потрібно модифікувати бібліотеку. Так?
Каша в голові. Не можу зрозуміти. Направте в потрібне русло.