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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
diehard
Встал на лапы
Сообщения: 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.

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

Сообщение Radio_Master »

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

Сообщение diehard »

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

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

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

Сообщение Radio_Master »

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

Из поста выше:
Вот тебе исхо...

Спасибо,буду разбираться дальше :))
С уважением,
Radio_Master.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Илья79
Мучитель микросхем
Сообщения: 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;
}
в чем ошибка?
Реклама
Аватара пользователя
Илья79
Мучитель микросхем
Сообщения: 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;
}
Реклама
Аватара пользователя
Radio_Master
Встал на лапы
Сообщения: 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.
Аватара пользователя
Radio_Master
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 01, 2007 12:42:39
Откуда: Москоу
Контактная информация:

Сообщение Radio_Master »

Это что,поясните,что зачем?
Вложения
Безымянный.jpg
(14.1 КБ) 1287 скачиваний
С уважением,
Radio_Master.
diehard
Встал на лапы
Сообщения: 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.
Аватара пользователя
Radio_Master
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 01, 2007 12:42:39
Откуда: Москоу
Контактная информация:

Сообщение Radio_Master »

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

Сообщение diehard »

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

Сообщение Radio_Master »

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

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

Сообщение Radio_Master »

Все,всем спасибо,во всем разобрался 8)
С уважением,
Radio_Master.
diehard
Встал на лапы
Сообщения: 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);

Хотя, если тебе так проще, пользуйся хексом. Мне проще и понятнее работать с бином :)))
Аватара пользователя
Radio_Master
Встал на лапы
Сообщения: 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.
Аватара пользователя
Radio_Master
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 01, 2007 12:42:39
Откуда: Москоу
Контактная информация:

Сообщение Radio_Master »

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

Сообщение diehard »

Преклоняюсь перед настоящим профессионалом, ибо всю жизнь пользуюсь калькулятором Windows в инженерном режиме (раньше в DN), так как перевeсти из одной системы исчисления в другую в уме не могу. Да и не стремлюсь к этому :)))
KeeLoq
Родился
Сообщения: 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? :)
BerZerK-ku
Мучитель микросхем
Сообщения: 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;
}

KeeLoq
Родился
Сообщения: 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;
}

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

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