реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Адресация в AT24C256, Как адресуется эта память?
Xenom0rph
сообщение Oct 2 2008, 11:12
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646



Вообщем подключил по I2C память AT24C256, и вот у меня встал вопрос, как получить доступ к определённой ячейки памяти, допустим к первой или последней или вообще к тысячной?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 2 2008, 11:17
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Ну, даташит теперь почитайте. Транзакция записи начинается с адреса.
Go to the top of the page
 
+Quote Post
Xenom0rph
сообщение Oct 2 2008, 11:54
Сообщение #3


Частый гость
**

Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646



Цитата(aaarrr @ Oct 2 2008, 15:17) *
Ну, даташит теперь почитайте. Транзакция записи начинается с адреса.


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

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

Сообщение отредактировал Xenom0rph - Oct 2 2008, 11:59
Go to the top of the page
 
+Quote Post
bloodden
сообщение Oct 2 2008, 12:12
Сообщение #4


Бывалый
***

Группа: Validating
Сообщений: 375
Регистрация: 19-10-05
Из: Kiev, UA
Пользователь №: 9 853



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

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

Сначала стартуете транзакцию запись по определённому адресу, и тут же старт (без стопа перед ним) и чтение будет с этого адреса. Это ж во всех книгах/газетах/туалетной бумаге написано smile.gif


--------------------
Заходите кому надо на мой сайт
Go to the top of the page
 
+Quote Post
Xenom0rph
сообщение Oct 2 2008, 12:34
Сообщение #5


Частый гость
**

Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646



Цитата(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
Go to the top of the page
 
+Quote Post
vik0
сообщение Oct 2 2008, 12:50
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233



Цитата(Xenom0rph @ Oct 2 2008, 15:34) *
Вот что нужно писать в эту переменную address

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

Сообщение отредактировал vik0 - Oct 2 2008, 12:51
Go to the top of the page
 
+Quote Post
bodja74
сообщение Oct 2 2008, 12:53
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



2Xenom0rph

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

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

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

Вроде все.
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 2 2008, 12:54
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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.
В общем в даташите все в картинках написано. И чего может быть непонятно? laughing.gif
Хотя... Самый важный нюанс состоит в том, что у EEPROM есть кольцевой буфер, для которого часть логического адреса автоинкрементируется при каждом последующем считанным или записанным байтом. Поэтому при записи нужно всегда делать выравнивание на границу этого буфера. Обращаю внимание, что инкрементируется не весь логический адрес, а только лишь часть его (6 младших разрядов адреса для 24C256).

Сообщение отредактировал rezident - Oct 2 2008, 13:06
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Xenom0rph
сообщение Oct 2 2008, 12:54
Сообщение #9


Частый гость
**

Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646



Цитата(vik0 @ Oct 2 2008, 16:50) *
Номер "ячейки памяти" в которую хотите произвести запись. В вашем случае от 0 до 32767 (0x0000 - 0x7FFF).

Так самое интересное что допустим пишу 0xA9 не пишет и не читает, пишу 0xAB читает, и вот непонятно как это всё организовать?
Go to the top of the page
 
+Quote Post
vik0
сообщение Oct 2 2008, 13:00
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233



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

Хм... А не наоборот?

Сообщение отредактировал vik0 - Oct 2 2008, 13:01
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 2 2008, 13:06
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



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

Да, конечно же наоборот. Я опечатался. Извините.
Go to the top of the page
 
+Quote Post
Xenom0rph
сообщение Oct 2 2008, 13:37
Сообщение #12


Частый гость
**

Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646



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

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

Сообщение отредактировал Xenom0rph - Oct 2 2008, 13:39
Go to the top of the page
 
+Quote Post
UniBomb
сообщение Oct 14 2008, 13:32
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 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);  
}


В общем вот... Что я не так делаю?
Go to the top of the page
 
+Quote Post
UniBomb
сообщение Oct 15 2008, 10:17
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 148
Регистрация: 26-05-05
Пользователь №: 5 416



И кстате, каким напряжением их питать? В даташите написано, что напряжение долно быть 1.8 ... 3.6 Вольт, в интернете на каждом шагу что до 5.5 вольт.
Go to the top of the page
 
+Quote Post
vik0
сообщение Oct 15 2008, 11:14
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 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 соответственно). И, кстати, об этом написано в даташите.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01512 секунд с 7
ELECTRONIX ©2004-2016