Xenom0rph 0 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба Вообщем подключил по I2C память AT24C256, и вот у меня встал вопрос, как получить доступ к определённой ячейки памяти, допустим к первой или последней или вообще к тысячной? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба Ну, даташит теперь почитайте. Транзакция записи начинается с адреса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenom0rph 0 2 октября, 2008 Опубликовано 2 октября, 2008 (изменено) · Жалоба Ну, даташит теперь почитайте. Транзакция записи начинается с адреса. У меня только перевод даташита есть, сейчас оригинал скачаю. Так вот там есть раздел Организация памяти и вот что написано: Память размером 256 кбит внутренне разделена на 512 страниц по 64 байта в каждой. Для доступа к памяти по произвольному адрессу требуется 15-разрядное слово адреса. Х.М. скачал таже фигня только в профиль. эх... Изменено 2 октября, 2008 пользователем Xenom0rph Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bloodden 0 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба У меня только перевод даташита есть, сейчас оригинал скачаю. Так вот там есть раздел Организация памяти и вот что написано: Память размером 256 кбит внутренне разделена на 512 страниц по 64 байта в каждой. Для доступа к памяти по произвольному адрессу требуется 15-разрядное слово адреса. Х.М. скачал таже фигня только в профиль. эх... Сначала стартуете транзакцию запись по определённому адресу, и тут же старт (без стопа перед ним) и чтение будет с этого адреса. Это ж во всех книгах/газетах/туалетной бумаге написано :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenom0rph 0 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба Сначала стартуете транзакцию запись по определённому адресу, и тут же старт (без стопа перед ним) и чтение будет с этого адреса. Это ж во всех книгах/газетах/туалетной бумаге написано :) Чтот до меня не доходит, не злитесь я в этом деле делитант только месяц назад паяльник в руки взял)) вот вообщем мой код записи в память 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 0 2 октября, 2008 Опубликовано 2 октября, 2008 (изменено) · Жалоба Вот что нужно писать в эту переменную address Номер "ячейки памяти" в которую хотите произвести запись. В вашем случае от 0 до 32767 (0x0000 - 0x7FFF). Изменено 2 октября, 2008 пользователем vik0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bodja74 0 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба 2Xenom0rph Ну если мне память не изменяет ,тогда так. Чтение 1 Старт 2 Адресс устройства +запись ($А1) 3 старший адресс ячейки 4 младший адресс ячейки 5 Рестарт 6 Адресс устройства + чтение ($А0) 7 Читаем ячейку,можно одну ,можно несколько (автоинкремент идет автоматом) 8 Стоп Запись 1 Старт 2 Адресс устройства +запись ($А1) 3 старший адресс ячейки 4 младший адресс ячейки 5 Пишем ячейку ,можно одну ,можно страницу. 6 Стоп 7 Выдерживаем время записи (читаем даташит) Вроде все. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 2 октября, 2008 Опубликовано 2 октября, 2008 (изменено) · Жалоба так вот делал я по примерам, и вот как там вызывалась функция write_byte_eeprom(0xaa,0Ч55) Вот всё работает, а стоит поменб переменную address, и не пишеться, тыкал пальцем в небо проверял, разные аддреса то пишет то не пишет. Вот что нужно писать в эту переменную address Первым байтом передается адрес самого устройства (Device address). Первые четыре бита (старший полубайт) уникальны для данного типа I2C-устройств (EEPROM) - 1010xxxx. Самый младший бит определяет тип операции 0- запись, 1 - чтение. А оставшиеся три бита являются аппаратным адресом EEPROM. У AT24C256 только два бита аппаратного адреса, поэтому bit3 (счет с нуля) всегда как 0 передается. Далее при записи передается логический адрес первой из адресуемых ячеек памяти. Два байта. Сначала младшийстарший, а затем старшиймладший. Если после передачи адреса устройства не передавать весь логический адрес ячейки целиком, а сформировать лишь повторное старт-условие, то логическим адресом ячейки памяти будет тот, который был при предыдущем обращении к EEPROM. Правда инкрементированный на 1. В общем в даташите все в картинках написано. И чего может быть непонятно? :laughing: Хотя... Самый важный нюанс состоит в том, что у EEPROM есть кольцевой буфер, для которого часть логического адреса автоинкрементируется при каждом последующем считанным или записанным байтом. Поэтому при записи нужно всегда делать выравнивание на границу этого буфера. Обращаю внимание, что инкрементируется не весь логический адрес, а только лишь часть его (6 младших разрядов адреса для 24C256). Изменено 2 октября, 2008 пользователем rezident Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenom0rph 0 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба Номер "ячейки памяти" в которую хотите произвести запись. В вашем случае от 0 до 32767 (0x0000 - 0x7FFF). Так самое интересное что допустим пишу 0xA9 не пишет и не читает, пишу 0xAB читает, и вот непонятно как это всё организовать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vik0 0 2 октября, 2008 Опубликовано 2 октября, 2008 (изменено) · Жалоба Далее при записи передается логический адрес первой из адресуемых ячеек памяти. Два байта. Сначала младший, а затем старший. Хм... А не наоборот? Изменено 2 октября, 2008 пользователем vik0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба Хм... А не наоборот? Да, конечно же наоборот. Я опечатался. Извините. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenom0rph 0 2 октября, 2008 Опубликовано 2 октября, 2008 (изменено) · Жалоба Вообщем господа спасибо вам за советы, правда всё что здесь было написано уже было изученно, ну да ладно... 2vik0 и правда в моем случае все просто, это от 0 и до 32767, низнаю что завставило это чудо инженерской мысли заработать, но теперь оно и пишет и читает в произвольную ячейку просто по числу. Вот. Спасибо, всем удачи ;) Изменено 2 октября, 2008 пользователем Xenom0rph Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
UniBomb 0 14 октября, 2008 Опубликовано 14 октября, 2008 · Жалоба Дабы не создавать новую тему, подниму эту... ситуация: на шине 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 0 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба И кстате, каким напряжением их питать? В даташите написано, что напряжение долно быть 1.8 ... 3.6 Вольт, в интернете на каждом шагу что до 5.5 вольт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vik0 0 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба И кстате, каким напряжением их питать? В даташите написано, что напряжение долно быть 1.8 ... 3.6 Вольт, в интернете на каждом шагу что до 5.5 вольт. Есть два варианта этой микросхемы. Одна на диапазон 1.8-3.6В, вторая - 2.7-5.5В. Отличаются цифрами в конце part number-а (....-1.8 и ....-2.7 соответственно). И, кстати, об этом написано в даташите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться