Ищу проекты c EEPROM at24cXX

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт дек 05, 2006 23:17:02
Откуда: Краснодарский край

Сообщение diehard »

AlexBoss писал(а): To diehard
i2c_write(Bank); // Выбор банка в устройстве
i2c_write(ExtEEAdr); // Выбор адреса для работы в банке
Первая команда - передача старшего байта адреса ячейки, а вторая - младшего и ничего более.
А 24cXX.jpg к EEPROM 24cXX не имеет ни какого отношения, т.к. ни какой Protection Bit Memory Area там нет, да и страницы по 32 байта противоречат даже Вашему коду.

http://www.alldatasheet.com/datasheet-p ... 24C64.html Рисунок 14 страница 18

http://www.atmel.com/dyn/resources/prod ... oc3350.pdf На странице 3 как раз о тех самых банках (pages):
AT24C64B, 64K SERIAL EEPROM: The 64K is internally organized as 256 pages of 32 bytes each.

Код можно проверить в протеусе, если есть сомнения в работоспособности.
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 114
Зарегистрирован: Чт ноя 01, 2007 12:42:39
Откуда: Москоу

Сообщение Radio_Master »

Так,ну с объемами разобрались,спасибо.
Что косается записи чтения просто ужас,голова уже трещит не чего не могу сооброзить,может ли кто дать отрывок кода, считывающий/записывающий, точно работающий на AT24с16.
Зараннее огромное спасибо!
С уважением,
Radio_Master.
Контактная информация:
Реклама
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт дек 05, 2006 23:17:02
Откуда: Краснодарский край

Сообщение diehard »

Это что, прикол?
Я же выложил _рабочий_ исходник.

Из поста выше:
Вот тебе исходник для 24с64. В нем используется несколько банков. все заполняются. Исходник подробно откомментировал.
// Заполнение 0x1F банков 24c64 символами с 0x00 до 0xff

Прогони в симуляторе и посмотри. Протуес на что тебе в руки дан? :shock:
Встал на лапы
Аватара пользователя
Сообщения: 114
Зарегистрирован: Чт ноя 01, 2007 12:42:39
Откуда: Москоу

Сообщение Radio_Master »

diehard писал(а):Это что, прикол?
Я же выложил _рабочий_ исходник.

Из поста выше:
Вот тебе исхо...
Спасибо,буду разбираться дальше :))
С уважением,
Radio_Master.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Аватара пользователя
Сообщения: 429
Зарегистрирован: Вс июн 29, 2008 13:53:03

Сообщение Илья79 »

У меня CVAVR ругается на return data;

void eeprom_read(unsigned char address)
{
unsigned char data;
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(address);
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | 1);
data=i2c_read(0);
i2c_stop();
return data;
}
в чем ошибка?
Контактная информация:
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 429
Зарегистрирован: Вс июн 29, 2008 13:53:03

Сообщение Илья79 »

нашел проблему вот так надо:
unsigned char eeprom_read(unsigned char address) {
unsigned char data;
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(address);
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | 1);
data=i2c_read(0);
i2c_stop();
return data;
}
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 114
Зарегистрирован: Чт ноя 01, 2007 12:42:39
Откуда: Москоу

Сообщение Radio_Master »

не получается так записать несколько банков:

// Заполнение 0x1F банков 24c64 символами с 0x00 до 0xff
for(ExtEEAdr=0;ExtEEAdr<256;ExtEEAdr++)
{
for(Bank=0;Bank<=0x1F;Bank++)
{
i2c_start();
i2c_write(0b10100000); // Выбор устройства EEProm
i2c_write(Bank); // Выбор банка в устройстве
i2c_write(ExtEEAdr); // по этой строчке записывается байт Bank
i2c_write(ExtEEAdr); // а эта строка вообще игнорируется
i2c_stop();
delay_ms(10);
}
}

Так как же быть?
С уважением,
Radio_Master.
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 114
Зарегистрирован: Чт ноя 01, 2007 12:42:39
Откуда: Москоу

Сообщение Radio_Master »

Это что,поясните,что зачем?
Вложения
Безымянный.jpg
(14.1 КБ) 1288 скачиваний
С уважением,
Radio_Master.
Контактная информация:
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт дек 05, 2006 23:17:02
Откуда: Краснодарский край

Сообщение diehard »

Картинка про страничную запись. Под ней есть что почитать. Очень занятно и поучительно.

К обоим вопросам один важный ответ из даташита:
During the erase/write cycle the EEPROM will not respond to a new command byte until the internal write procedure is completed. At the end of active programming the chip returns to the standby mode and the last entered EEPROM byte remains addressed by the address counter. To determine the end of the internal erase/write cycle acknowledge polling can be initiated by the master by sending a START condition followed by a command byte CSR or CSW (read with b0 = 1 or write with b0 = 0). If the internal erase/write cycle is not completed, the device will not acknowledge the transmission. If the internal erase/write cycle is сompleted, the device acknowledges the received command byte and the protocol activities can continue.
Встал на лапы
Аватара пользователя
Сообщения: 114
Зарегистрирован: Чт ноя 01, 2007 12:42:39
Откуда: Москоу

Сообщение Radio_Master »

Чего то я не особо понял смысл,поясните плз.
С уважением,
Radio_Master.
Контактная информация:
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт дек 05, 2006 23:17:02
Откуда: Краснодарский край

Сообщение diehard »

Переводчик тебе в помощь.
Встал на лапы
Аватара пользователя
Сообщения: 114
Зарегистрирован: Чт ноя 01, 2007 12:42:39
Откуда: Москоу

Сообщение Radio_Master »

Урра... :))) ...с записью я разлбрался, в at24c16 8 блоков по 256 байтов, блок выбирается в байте адресации микросхемы,сразу после старта который:
i2c_start();
i2c_write(0xA0); // Запись первого блока(A2-второго,А4-третьего и т.д.)

Разбираюсь с чтением... :idea:
С уважением,
Radio_Master.
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 114
Зарегистрирован: Чт ноя 01, 2007 12:42:39
Откуда: Москоу

Сообщение Radio_Master »

Все,всем спасибо,во всем разобрался 8)
С уважением,
Radio_Master.
Контактная информация:
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт дек 05, 2006 23:17:02
Откуда: Краснодарский край

Сообщение diehard »

Radio_Master писал(а):Урра... ...с записью я разлбрался, в at24c16 8 блоков по 256 байтов, блок выбирается в байте адресации микросхемы,сразу после старта который:
i2c_start();
i2c_write(0xA0); // Запись первого блока(A2-второго,А4-третьего и т.д.)
Смотрим выше:
DieHard писал(а):for(ExtEEAdr=0;ExtEEAdr<256;ExtEEAdr++)
{
for(Bank=0;Bank<=0x1F;Bank++)
{
i2c_start();
i2c_write(0b10100000); // Выбор устройства EEProm
i2c_write(0b10100000); НИЧЕМ НЕ ОТЛИЧАЕТСЯ ОТ i2c_write(0xA0);

Хотя, если тебе так проще, пользуйся хексом. Мне проще и понятнее работать с бином :)))
Встал на лапы
Аватара пользователя
Сообщения: 114
Зарегистрирован: Чт ноя 01, 2007 12:42:39
Откуда: Москоу

Сообщение Radio_Master »

diehard писал(а):
Radio_Master писал(а):Урра... ...с записью я разлбрался, в at24c16 8 блоков по 256 байтов, блок выбирается в байте адресации микросхемы,сразу после старта который:
i2c_start();
i2c_write(0xA0); // Запись первого блока(A2-второго,А4-третьего и т.д.)
Смотрим выше:
DieHard писал(а):for(ExtEEAdr=0;ExtEEAdr<256;ExtEEAdr++)
{
for(Bank=0;Bank<=0x1F;Bank++)
{
i2c_start();
i2c_write(0b10100000); // Выбор устройства EEProm
i2c_write(0b10100000); НИЧЕМ НЕ ОТЛИЧАЕТСЯ ОТ i2c_write(0xA0);

Хотя, если тебе так проще, пользуйся хексом. Мне проще и понятнее работать с бином :)))
то что это одно и тоже это ПОНЯТНО!там не было указано что адресс блока выбирается как адрес устройства!!!А в данном случае проще работать с хексом,т.к. первый символ A а второй меняется(так удобней записывать и быстрее заметно к какому блоку идет адресация)
С уважением,
Radio_Master.
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 114
Зарегистрирован: Чт ноя 01, 2007 12:42:39
Откуда: Москоу

Сообщение Radio_Master »

И еще: diehard,наиболее удобно записывать цифры в 16-тиричной СС,ведь легче и понятнее 2 символа чем 8! А вот удобно вам это или нет зависит от опыта,ибо у меня при виде шеснадцатиричного числа мысленно сразу и мнгновенно рисуется двоично число!а это гораздо быстрее чем щитать 1 и 0!
С уважением,
Radio_Master.
Контактная информация:
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт дек 05, 2006 23:17:02
Откуда: Краснодарский край

Сообщение diehard »

Преклоняюсь перед настоящим профессионалом, ибо всю жизнь пользуюсь калькулятором Windows в инженерном режиме (раньше в DN), так как перевeсти из одной системы исчисления в другую в уме не могу. Да и не стремлюсь к этому :)))
Родился
Сообщения: 3
Зарегистрирован: Вс ноя 09, 2008 23:38:11

Сообщение KeeLoq »

Здравствуйте!
Недавно начал играть с i2c eeprom. Взял простенький пример в хелпе cvavr для 24с02 с одним байтом адресации. Вообщем прочитал, записал и... захотел уже читать-писать 24с64/24с512, но наткнулся на то, что для адресации им нужно уже 2 байта. Пример от cvavr это не поддерживает, в функции чтения-записи в качестве адреса данных передаются char`ы. В даташите на eeprom вычитал, что при указании адреса данных(в случае с двумя байтами) второй байт передается сразу же после первого. Не долго думая, взял пример из cvavr и сделал следующее(на примере ф-ии чтения eeprom):

/* read a byte from the EEPROM */
unsigned char eeprom_read(unsigned char address1, unsigned char address2) {
unsigned char data;
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(address1);
i2c_write(address2);
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | 1);
data=i2c_read(0);
i2c_stop();
return data;
}

где:
address1 - первая часть адреса
address2 - вторая часть адреса

например, адрес такой: 0x68ef
тогда в address1 я передаю 68, а в address2 - ef

... жирным выделены мои изменения, т.е. я тупо взял и сразу же передал второй байт(address2) адреса данных. Решил проверить - успешно прочитал и записал 24с64 в начале, в середине и в конце, на других eeprom, меньших размером, не проверял. Недостаток заключается в том, что в функцию приходится передавать два байта РАЗДЕЛЬНО, а хотелось бы сразу, типом int (16 бит). В этом и заключается мой вопрос: как можно сделать так, чтобы передавать функции адрес в виде int, а внутри её разделить этот int на две части, одну половину присвоить address1, а вторую - address2? :)
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

KeeLoq писал(а): В этом и заключается мой вопрос: как можно сделать так, чтобы передавать функции адрес в виде int, а внутри её разделить этот int на две части, одну половину присвоить address1, а вторую - address2? :)
Легко.

Код: Выделить всё

/* read a byte from the EEPROM */
unsigned char eeprom_read(int Address) {
unsigned char data;
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(Address>>8);
i2c_write(Address);
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | 1);
data=i2c_read(0);
i2c_stop();
return data;
}

Родился
Сообщения: 3
Зарегистрирован: Вс ноя 09, 2008 23:38:11

Сообщение KeeLoq »

BerZerK-ku, спасибо! работает :)

я сам делал так:

/* read a byte from the EEPROM */
unsigned char eeprom_read(int address) {
unsigned char data;
unsigned char address1=address;
unsigned char address2=( address>>8 );

i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(address1);
i2c_write(address2);

i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | 1);
data=i2c_read(0);
i2c_stop();
return data;
}

...и не работало :(
Ответить

Вернуться в «Периферия»