|
Адресация в AT24C256, Как адресуется эта память? |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Oct 2 2008, 11:54
|
Частый гость
 
Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646

|
Цитата(aaarrr @ Oct 2 2008, 15:17)  Ну, даташит теперь почитайте. Транзакция записи начинается с адреса. У меня только перевод даташита есть, сейчас оригинал скачаю. Так вот там есть раздел Организация памяти и вот что написано: Память размером 256 кбит внутренне разделена на 512 страниц по 64 байта в каждой. Для доступа к памяти по произвольному адрессу требуется 15-разрядное слово адреса. Х.М. скачал таже фигня только в профиль. эх...
Сообщение отредактировал Xenom0rph - Oct 2 2008, 11:59
|
|
|
|
|
Oct 2 2008, 12:34
|
Частый гость
 
Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646

|
Цитата(bloodden @ Oct 2 2008, 16:12)  Сначала стартуете транзакцию запись по определённому адресу, и тут же старт (без стопа перед ним) и чтение будет с этого адреса. Это ж во всех книгах/газетах/туалетной бумаге написано  Чтот до меня не доходит, не злитесь я в этом деле делитант только месяц назад паяльник в руки взял)) вот вообщем мой код записи в память 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
|
|
|
|
|
Oct 2 2008, 12:50
|
Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233

|
Цитата(Xenom0rph @ Oct 2 2008, 15:34)  Вот что нужно писать в эту переменную address Номер "ячейки памяти" в которую хотите произвести запись. В вашем случае от 0 до 32767 (0x0000 - 0x7FFF).
Сообщение отредактировал vik0 - Oct 2 2008, 12:51
|
|
|
|
|
Oct 2 2008, 12:53
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
2Xenom0rphНу если мне память не изменяет  ,тогда так. Чтение 1 Старт 2 Адресс устройства +запись ($А1) 3 старший адресс ячейки 4 младший адресс ячейки 5 Рестарт 6 Адресс устройства + чтение ($А0) 7 Читаем ячейку,можно одну ,можно несколько (автоинкремент идет автоматом) 8 Стоп Запись 1 Старт 2 Адресс устройства +запись ($А1) 3 старший адресс ячейки 4 младший адресс ячейки 5 Пишем ячейку ,можно одну ,можно страницу. 6 Стоп 7 Выдерживаем время записи (читаем даташит) Вроде все.
|
|
|
|
|
Oct 2 2008, 12:54
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(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. В общем в даташите все в картинках написано. И чего может быть непонятно? Хотя... Самый важный нюанс состоит в том, что у EEPROM есть кольцевой буфер, для которого часть логического адреса автоинкрементируется при каждом последующем считанным или записанным байтом. Поэтому при записи нужно всегда делать выравнивание на границу этого буфера. Обращаю внимание, что инкрементируется не весь логический адрес, а только лишь часть его (6 младших разрядов адреса для 24C256).
Сообщение отредактировал rezident - Oct 2 2008, 13:06
Эскизы прикрепленных изображений
|
|
|
|
|
Oct 2 2008, 12:54
|
Частый гость
 
Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646

|
Цитата(vik0 @ Oct 2 2008, 16:50)  Номер "ячейки памяти" в которую хотите произвести запись. В вашем случае от 0 до 32767 (0x0000 - 0x7FFF). Так самое интересное что допустим пишу 0xA9 не пишет и не читает, пишу 0xAB читает, и вот непонятно как это всё организовать?
|
|
|
|
|
Oct 2 2008, 13:00
|
Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233

|
Цитата(rezident @ Oct 2 2008, 15:54)  Далее при записи передается логический адрес первой из адресуемых ячеек памяти. Два байта. Сначала младший, а затем старший. Хм... А не наоборот?
Сообщение отредактировал vik0 - Oct 2 2008, 13:01
|
|
|
|
|
Oct 14 2008, 13:32
|
Частый гость
 
Группа: Свой
Сообщений: 148
Регистрация: 26-05-05
Пользователь №: 5 416

|
Дабы не создавать новую тему, подниму эту... ситуация: на шине 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); } В общем вот... Что я не так делаю?
|
|
|
|
|
Oct 15 2008, 11:14
|
Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233

|
Цитата(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 соответственно). И, кстати, об этом написано в даташите.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|