i2c_write(Bank); // Выбор банка в устройстве i2c_write(ExtEEAdr); // Выбор адреса для работы в банке
Первая команда - передача старшего байта адреса ячейки, а вторая - младшего и ничего более. А 24cXX.jpg к EEPROM 24cXX не имеет ни какого отношения, т.к. ни какой Protection Bit Memory Area там нет, да и страницы по 32 байта противоречат даже Вашему коду.
Так,ну с объемами разобрались,спасибо.
Что косается записи чтения просто ужас,голова уже трещит не чего не могу сооброзить,может ли кто дать отрывок кода, считывающий/записывающий, точно работающий на AT24с16.
Зараннее огромное спасибо!
Из поста выше:
Вот тебе исходник для 24с64. В нем используется несколько банков. все заполняются. Исходник подробно откомментировал.
// Заполнение 0x1F банков 24c64 символами с 0x00 до 0xff
Прогони в симуляторе и посмотри. Протуес на что тебе в руки дан?
// Заполнение 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);
}
}
Картинка про страничную запись. Под ней есть что почитать. Очень занятно и поучительно.
К обоим вопросам один важный ответ из даташита:
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.
Урра... ...с записью я разлбрался, в at24c16 8 блоков по 256 байтов, блок выбирается в байте адресации микросхемы,сразу после старта который:
i2c_start();
i2c_write(0xA0); // Запись первого блока(A2-второго,А4-третьего и т.д.)
Урра... ...с записью я разлбрался, в 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);
Хотя, если тебе так проще, пользуйся хексом. Мне проще и понятнее работать с бином
Урра... ...с записью я разлбрался, в 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 а второй меняется(так удобней записывать и быстрее заметно к какому блоку идет адресация)
И еще: diehard,наиболее удобно записывать цифры в 16-тиричной СС,ведь легче и понятнее 2 символа чем 8! А вот удобно вам это или нет зависит от опыта,ибо у меня при виде шеснадцатиричного числа мысленно сразу и мнгновенно рисуется двоично число!а это гораздо быстрее чем щитать 1 и 0!
Преклоняюсь перед настоящим профессионалом, ибо всю жизнь пользуюсь калькулятором Windows в инженерном режиме (раньше в DN), так как перевeсти из одной системы исчисления в другую в уме не могу. Да и не стремлюсь к этому
Здравствуйте!
Недавно начал играть с i2c eeprom. Взял простенький пример в хелпе cvavr для 24с02 с одним байтом адресации. Вообщем прочитал, записал и... захотел уже читать-писать 24с64/24с512, но наткнулся на то, что для адресации им нужно уже 2 байта. Пример от cvavr это не поддерживает, в функции чтения-записи в качестве адреса данных передаются char`ы. В даташите на eeprom вычитал, что при указании адреса данных(в случае с двумя байтами) второй байт передается сразу же после первого. Не долго думая, взял пример из cvavr и сделал следующее(на примере ф-ии чтения eeprom):
где:
address1 - первая часть адреса
address2 - вторая часть адреса
например, адрес такой: 0x68ef
тогда в address1 я передаю 68, а в address2 - ef
... жирным выделены мои изменения, т.е. я тупо взял и сразу же передал второй байт(address2) адреса данных. Решил проверить - успешно прочитал и записал 24с64 в начале, в середине и в конце, на других eeprom, меньших размером, не проверял. Недостаток заключается в том, что в функцию приходится передавать два байта РАЗДЕЛЬНО, а хотелось бы сразу, типом int (16 бит). В этом и заключается мой вопрос: как можно сделать так, чтобы передавать функции адрес в виде int, а внутри её разделить этот int на две части, одну половину присвоить address1, а вторую - address2?
В этом и заключается мой вопрос: как можно сделать так, чтобы передавать функции адрес в виде 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; }
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения