Перейти к содержанию
    

Вообщем подключил по I2C память AT24C256, и вот у меня встал вопрос, как получить доступ к определённой ячейки памяти, допустим к первой или последней или вообще к тысячной?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, даташит теперь почитайте. Транзакция записи начинается с адреса.

 

У меня только перевод даташита есть, сейчас оригинал скачаю.

Так вот там есть раздел Организация памяти и вот что написано:

Память размером 256 кбит внутренне разделена на 512 страниц по 64 байта в каждой. Для доступа к памяти по произвольному адрессу требуется 15-разрядное слово адреса.

 

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

Изменено пользователем Xenom0rph

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня только перевод даташита есть, сейчас оригинал скачаю.

Так вот там есть раздел Организация памяти и вот что написано:

Память размером 256 кбит внутренне разделена на 512 страниц по 64 байта в каждой. Для доступа к памяти по произвольному адрессу требуется 15-разрядное слово адреса.

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

вот вообщем мой код записи в память

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот что нужно писать в эту переменную address

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

Изменено пользователем vik0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2Xenom0rph

 

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

 

Чтение

1 Старт

2 Адресс устройства +запись ($А1)

3 старший адресс ячейки

4 младший адресс ячейки

5 Рестарт

6 Адресс устройства + чтение ($А0)

7 Читаем ячейку,можно одну ,можно несколько (автоинкремент идет автоматом)

8 Стоп

 

Запись

1 Старт

2 Адресс устройства +запись ($А1)

3 старший адресс ячейки

4 младший адресс ячейки

5 Пишем ячейку ,можно одну ,можно страницу.

6 Стоп

7 Выдерживаем время записи (читаем даташит)

 

Вроде все.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так вот делал я по примерам, и вот как там вызывалась функция

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).

post-3882-1222951633_thumb.jpg

Изменено пользователем rezident

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Так самое интересное что допустим пишу 0xA9 не пишет и не читает, пишу 0xAB читает, и вот непонятно как это всё организовать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Далее при записи передается логический адрес первой из адресуемых ячеек памяти. Два байта. Сначала младший, а затем старший.

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

Изменено пользователем vik0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Изменено пользователем Xenom0rph

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дабы не создавать новую тему, подниму эту...

 

ситуация: на шине 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);  
}

 

В общем вот... Что я не так делаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И кстате, каким напряжением их питать? В даташите написано, что напряжение долно быть 1.8 ... 3.6 Вольт, в интернете на каждом шагу что до 5.5 вольт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И кстате, каким напряжением их питать? В даташите написано, что напряжение долно быть 1.8 ... 3.6 Вольт, в интернете на каждом шагу что до 5.5 вольт.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...