бомж (24.05.2014 22:30 - 22:32, просмотров: 197) ответил бомж на Вот нашёл CAT24M01 на 1 мегабит, M24M02-DR на 2 мегабита. Применял кто-нибудь такие? Какие подводные камни с ними могут быть?
Может кому пригодится - функции чтения и записи в EEPROM CAT24M01.
/*********************************************************************************************************************
Функции чтения и записи в EEPROM типа E24C64 или CAT24M01
*********************************************************************************************************************/
#define EEPROM_CAT24M01 1
#define EEPROM_BUS_ADDRESS 0xA0
#if EEPROM_CAT24M01
#define PAGE 256
#else
#define PAGE 32
#endif
unsigned char tmp_buffer[PAGE];
void EEPROM_read (unsigned char *pd, unsigned long adr, unsigned int size){
unsigned char bus_address;
#if EEPROM_CAT24M01
if (adr & 0x10000)
bus_address = EEPROM_BUS_ADDRESS | 0x2;
else
bus_address = EEPROM_BUS_ADDRESS;
#else
bus_address = EEPROM_BUS_ADDRESS;
#endif
i2c_start ();
i2c_write (bus_address);
i2c_write (adr >> 8);
i2c_write (adr & 0x00FF);
i2c_stop ();
i2c_start ();
i2c_write (bus_address | 1);
while (--size > 0){
*pd = i2c_read (1); // with ACK
pd++;
}
*pd=i2c_read (0); // without ACK
i2c_stop ();
}
void EEPROM_write (unsigned long adr, unsigned char *ps, unsigned int size){
unsigned int i;
unsigned char bus_address; // физический адрес микросхемы, зависит от бита адреса А16
unsigned char adr_on_page; // адрес внутри текущей страницы, куда пишем наши данные
unsigned long page_begin_adr; // адрес начала текущей страницы
#if EEPROM_CAT24M01
if (adr & 0x10000)
bus_address = EEPROM_BUS_ADDRESS | 0x2;
else
bus_address = EEPROM_BUS_ADDRESS;
#else
bus_address = EEPROM_BUS_ADDRESS;
#endif
page_begin_adr = adr / PAGE; // номер страницы
page_begin_adr *= PAGE; // начальный адрес страницы
adr_on_page = adr % PAGE; // начало записи на текущей странице
while (1){
EEPROM_read (tmp_buffer, page_begin_adr, PAGE); // заполняем буффер данными с текущей страницы
for (i = adr_on_page; i < PAGE; i++){
tmp_buffer[i] = *ps; // меняем нужные нам данные в буфере текущей страницы
ps++;
size--;
if (size == 0) break; // выходим из цикла for
}
i2c_start (); // START
i2c_write (bus_address); // address of EEPROM
i2c_write (page_begin_adr >> 8); // MSB destination address
i2c_write (page_begin_adr & 0x00FF); // LSB destination address
for (i = 0; i < PAGE; i++) // сохраняем текущую страницу в еепроме
i2c_write (tmp_buffer[i]);
i2c_stop ();
#if EEPROM_CAT24M01
delay_ms (6);
#else
delay_ms (10);
#endif
if (size == 0) return;
page_begin_adr += PAGE;
adr_on_page = 0;
}
}
/***************************************** EOF ******************************************************/
memento mori