Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Адресация в AT24C256
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Xenom0rph
Вообщем подключил по I2C память AT24C256, и вот у меня встал вопрос, как получить доступ к определённой ячейки памяти, допустим к первой или последней или вообще к тысячной?
aaarrr
Ну, даташит теперь почитайте. Транзакция записи начинается с адреса.
Xenom0rph
Цитата(aaarrr @ Oct 2 2008, 15:17) *
Ну, даташит теперь почитайте. Транзакция записи начинается с адреса.


У меня только перевод даташита есть, сейчас оригинал скачаю.
Так вот там есть раздел Организация памяти и вот что написано:
Память размером 256 кбит внутренне разделена на 512 страниц по 64 байта в каждой. Для доступа к памяти по произвольному адрессу требуется 15-разрядное слово адреса.

Х.М. скачал таже фигня только в профиль. эх...
bloodden
Цитата(Xenom0rph @ Oct 2 2008, 14:54) *
У меня только перевод даташита есть, сейчас оригинал скачаю.
Так вот там есть раздел Организация памяти и вот что написано:
Память размером 256 кбит внутренне разделена на 512 страниц по 64 байта в каждой. Для доступа к памяти по произвольному адрессу требуется 15-разрядное слово адреса.

Х.М. скачал таже фигня только в профиль. эх...

Сначала стартуете транзакцию запись по определённому адресу, и тут же старт (без стопа перед ним) и чтение будет с этого адреса. Это ж во всех книгах/газетах/туалетной бумаге написано smile.gif
Xenom0rph
Цитата(bloodden @ Oct 2 2008, 16:12) *
Сначала стартуете транзакцию запись по определённому адресу, и тут же старт (без стопа перед ним) и чтение будет с этого адреса. Это ж во всех книгах/газетах/туалетной бумаге написано smile.gif

Чтот до меня не доходит, не злитесь я в этом деле делитант только месяц назад паяльник в руки взял))
вот вообщем мой код записи в память

void write_byte_eeprom (unsigned int address, unsigned char data)
{
unsigned char sSREG;
sSREG=SREG
#asm(”cli”)
i2c_start(EEPROM_BUS_ADDRESS);
i2c_write((unsigned char)address>>8);
i2c_write((unsigned char)address);
i2cwrite(data)
i2c_stop()
SREG = sSREG;
delay_ms(11)
}

так вот делал я по примерам, и вот как там вызывалась функция
write_byte_eeprom(0xaa,0×55)
Вот всё работает, а стоит поменб переменную address, и не пишеться, тыкал пальцем в небо проверял, разные аддреса то пишет то не пишет. Вот что нужно писать в эту переменную address
vik0
Цитата(Xenom0rph @ Oct 2 2008, 15:34) *
Вот что нужно писать в эту переменную address

Номер "ячейки памяти" в которую хотите произвести запись. В вашем случае от 0 до 32767 (0x0000 - 0x7FFF).
bodja74
2Xenom0rph

Ну если мне память не изменяет biggrin.gif ,тогда так.

Чтение
1 Старт
2 Адресс устройства +запись ($А1)
3 старший адресс ячейки
4 младший адресс ячейки
5 Рестарт
6 Адресс устройства + чтение ($А0)
7 Читаем ячейку,можно одну ,можно несколько (автоинкремент идет автоматом)
8 Стоп

Запись
1 Старт
2 Адресс устройства +запись ($А1)
3 старший адресс ячейки
4 младший адресс ячейки
5 Пишем ячейку ,можно одну ,можно страницу.
6 Стоп
7 Выдерживаем время записи (читаем даташит)

Вроде все.
rezident
Цитата(Xenom0rph @ Oct 2 2008, 18:34) *
так вот делал я по примерам, и вот как там вызывалась функция
write_byte_eeprom(0xaa,0Ч55)
Вот всё работает, а стоит поменб переменную address, и не пишеться, тыкал пальцем в небо проверял, разные аддреса то пишет то не пишет. Вот что нужно писать в эту переменную address
Первым байтом передается адрес самого устройства (Device address). Первые четыре бита (старший полубайт) уникальны для данного типа I2C-устройств (EEPROM) - 1010xxxx. Самый младший бит определяет тип операции 0- запись, 1 - чтение. А оставшиеся три бита являются аппаратным адресом EEPROM. У AT24C256 только два бита аппаратного адреса, поэтому bit3 (счет с нуля) всегда как 0 передается.
Далее при записи передается логический адрес первой из адресуемых ячеек памяти. Два байта. Сначала младшийстарший, а затем старшиймладший. Если после передачи адреса устройства не передавать весь логический адрес ячейки целиком, а сформировать лишь повторное старт-условие, то логическим адресом ячейки памяти будет тот, который был при предыдущем обращении к EEPROM. Правда инкрементированный на 1.
В общем в даташите все в картинках написано. И чего может быть непонятно? laughing.gif
Хотя... Самый важный нюанс состоит в том, что у EEPROM есть кольцевой буфер, для которого часть логического адреса автоинкрементируется при каждом последующем считанным или записанным байтом. Поэтому при записи нужно всегда делать выравнивание на границу этого буфера. Обращаю внимание, что инкрементируется не весь логический адрес, а только лишь часть его (6 младших разрядов адреса для 24C256).
Xenom0rph
Цитата(vik0 @ Oct 2 2008, 16:50) *
Номер "ячейки памяти" в которую хотите произвести запись. В вашем случае от 0 до 32767 (0x0000 - 0x7FFF).

Так самое интересное что допустим пишу 0xA9 не пишет и не читает, пишу 0xAB читает, и вот непонятно как это всё организовать?
vik0
Цитата(rezident @ Oct 2 2008, 15:54) *
Далее при записи передается логический адрес первой из адресуемых ячеек памяти. Два байта. Сначала младший, а затем старший.

Хм... А не наоборот?
rezident
Цитата(vik0 @ Oct 2 2008, 19:00) *
Хм... А не наоборот?

Да, конечно же наоборот. Я опечатался. Извините.
Xenom0rph
Вообщем господа спасибо вам за советы, правда всё что здесь было написано уже было изученно, ну да ладно...

2vik0 и правда в моем случае все просто, это от 0 и до 32767, низнаю что завставило это чудо инженерской мысли заработать, но теперь оно и пишет и читает в произвольную ячейку просто по числу. Вот. Спасибо, всем удачи wink.gif
UniBomb
Дабы не создавать новую тему, подниму эту...

ситуация: на шине TWI висят датчик температуры и сабжевая микросхема памяти. Обе линии подтянуты к плюсу через резистор 6,8ком, частота шины 400кГц. Длина линии TWI сантиметров 5. Функции для работы с TWI самописны.

проблема: Неверно считываются или записываются некоторые байты данных. Т.е. если записать массив из 90 байт, то некоторые из них толи неправильно записываются, толи неправильно считываются. Причём как правило дни и теже. Пробовал менять частоту шины (с увеличением частоты количество "неправильных" байт увеличивается"), пробовал записывать по другим адресам. Всё равно количество неверных байт остаётся одинаковым. Если записывать часть массива, но ситуация становится полностью хаотичной - информация то записывается/считывается правильно, то нет.

Процесс общения с AT24C256 происходит так:

Код
unsigned char ReadByteFromExtEEPROM(int address)
{
temp.tin = address;
unsigned char eep_value = 0;
twi_start();
twi_write_address(0b10100010,'w');
twi_write_byte(temp.tuc[1]);
twi_write_byte(temp.tuc[0]);
twi_start();
twi_write_address(0b10100010,'r');
twi_read_byte(&eep_value, 0);
twi_stop();
return eep_value;
}
//---------------------------------------------------------------------------
void WriteByteIntoExtEEPROM(int address, unsigned char value)
{
temp.tin = address;
twi_start();
twi_write_address(0b10100010,'w');
twi_write_byte(temp.tuc[1]);
twi_write_byte(temp.tuc[0]);
twi_write_byte(value);
twi_stop();

_delay_loop_2(0xFFFF);
_delay_loop_2(0xFFFF);
// _delay_loop_2(0xFFFF);
// _delay_loop_2(0xFFFF);
// _delay_loop_2(0xFFFF);  
}


В общем вот... Что я не так делаю?
UniBomb
И кстате, каким напряжением их питать? В даташите написано, что напряжение долно быть 1.8 ... 3.6 Вольт, в интернете на каждом шагу что до 5.5 вольт.
vik0
Цитата(UniBomb @ Oct 15 2008, 13:17) *
И кстате, каким напряжением их питать? В даташите написано, что напряжение долно быть 1.8 ... 3.6 Вольт, в интернете на каждом шагу что до 5.5 вольт.

Есть два варианта этой микросхемы. Одна на диапазон 1.8-3.6В, вторая - 2.7-5.5В. Отличаются цифрами в конце part number-а (....-1.8 и ....-2.7 соответственно). И, кстати, об этом написано в даташите.
UniBomb
Цитата(vik0 @ Oct 15 2008, 15:14) *
Есть два варианта этой микросхемы. Одна на диапазон 1.8-3.6В, вторая - 2.7-5.5В. Отличаются цифрами в конце part number-а (....-1.8 и ....-2.7 соответственно). И, кстати, об этом написано в даташите.


Да, прошу прощения - у меня была старая версия даташита...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.