ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
517792 Топик полностью
бомж (24.05.2014 22:30 - 22:32, просмотров: 196) ответил бомж на Вот нашёл 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