EEPROM AT24C256C не читается несколько байт подряд, почему?

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Прорезались зубы
Сообщения: 213
Зарегистрирован: Вт сен 09, 2008 18:17:27

Сообщение DENIS451 »

EEPROM AT24C256C не читается несколько байт подряд:
записываю в подряд 12 байт и пробую их прочесть, тоже в подряд,
читается только самый первый байт - остальные 11 байт нули!

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

Что может быть не так?

Прилагаю датаграмму с логического анализатора для KingstVIS 3.1.2
Вложения
2019-01-19_01-57-15.zip
(2.78 КБ) 187 скачиваний
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 83
Зарегистрирован: Вс ноя 01, 2015 00:09:59

Сообщение Core-X »

У вас скорее всего не правильно происходить считывания массива. Считывания одно байта и массива байт, это разные вещи. В даташите есть пример считывания данных по I2C.
Для связи email: risctronix собака gmail.com
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

DENIS451 писал(а):Прилагаю датаграмму с логического анализатора для KingstVIS 3.1.2
Лучше бы код показали, чем файл какого-то неизвестного половине пользователям формата.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

После чтения каждого байта STOP передаёте, небось?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 39197
Зарегистрирован: Сб сен 13, 2014 16:27:32
Откуда: СпиртоГонск созвездия Омега

Сообщение musor »

уже не помню на вскидку но кажется 24с02 и 24с256 читают пишут иначе
ZМудрость(Опыт и выдержка) приходит с годами.
Все Ваши беды и проблемы, от недостатка знаний.
Умный и у дурака научится, а дураку и ..
Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

DENIS451, Выложите Printscreen экрана ЛА. Скорее всего, ошибка в Restart-е после записи адреса стартового адреса чтения.
P.S.
На всякий случай, напомню: У 24C256 страница записи 64 байта. Т.е., если вы, к примеру, захотите записать несколько байт подряд с адреса 63h - будет ошибка (данные, ожидаемые по записи по адресу 64h, окажутся по адресу 0h).
Т.ч, при записи, если вы переходите на следующую страницу, нужно дать Stop, подождать пока она запишет (можно проверять по ACK-у на её адрес), и продолжить запись с начала следующей страницы (Start, Device Adress и т.д.).
Реклама
Прорезались зубы
Сообщения: 213
Зарегистрирован: Вт сен 09, 2008 18:17:27

Сообщение DENIS451 »

Выложил скрины ЛА1.png и ЛА2.png

На всякий случай прога: https://yadi.sk/d/DV2zN0L6A3v0hA (она бесплатная, скачал с оф сайта производителя ЛА Kingst LA1010)

Код под STM32F105 нет смысла выкладывать - там софтовый I2C я могу нарисовать любую датаграмму, логический анализатор не самый плохой,
на двух каналах выборка 100мГц заметит любую иголку на которую способна среагировать EEPROM.

Писать и читать пытаюсь с нулевого адреса.

Покупал тут: https://www.chipdip.ru/product/at24c256c-sshl-t

Ещё вопрос, что означает параметр из датащита "Write Cycle Time" равный 5 миллисекунд?
Вложения
ЛА2.png
(51.95 КБ) 487 скачиваний
ЛА1.png
(62.46 КБ) 476 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

DENIS451 писал(а):...что означает параметр из датащита "Write Cycle Time" равный 5 миллисекунд?
Это время записи страницы из буфера AT24C256C в физическую Flash (стартует после команды Stop). В течении этого времени (это максимальное время), AT24C256C не будет выдавать ACK на свой адрес.
Что касается основного вопроса - посмотрите в файле. Я отметил два "скользких момента" (первое, на что обратил внимание):
1. Обозначил как Err. Здесь "игра на фронтах" может быть воспринята как команда Stop.
2. Обозначил как t=?. Не понял реальное время, но как мне показалось, времена команды Start не соблюдены.
В общем, более тщательно проверьте/исправьте все времена и всё заработает.
/картинка кликабельна/
Изображение
ЛА1_1.gif
(49.93 КБ) 447 скачиваний
P.S.
По 'Err': Рекомендуется выдерживать время не менее 300nS после спада по SCL.
Последний раз редактировалось Albert_V Сб янв 19, 2019 14:10:50, всего редактировалось 2 раза.
Прорезались зубы
Сообщения: 213
Зарегистрирован: Вт сен 09, 2008 18:17:27

Сообщение DENIS451 »

Спасибо, но я сейчас ухожу, проверить смогу только после 16:00.

Может нарисуете от руки в паинте, как по вашему мнению, должен правильно выглядеть этот участок датаграммы?

Сделал более подробный скрин с этим подозрительным участком: ЛА3.png
Вложения
ЛА3.png
(47.73 КБ) 470 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

На этом "переходе", время "единички" у SCL должно быть не менее 2-ух времён "единички" при обмене данными.
Если делаете "нечто", у чего должна быть высокая повторяемость - лучше выжидайте время не менее 1/Fclk_max/2 (для 400kHz это 1.25µS). Не думаю что это время сильно "затормозит" работу вашего изделия...
Вот пример с моего ЛА (SLA5032):
/у меня частота по SCL чуть выше 260kHz/
Изображение
Прорезались зубы
Сообщения: 213
Зарегистрирован: Вт сен 09, 2008 18:17:27

Сообщение DENIS451 »

Сделал тайминги побольше(см. ЛА4.png), ничего не изменилось.

Навсякий случай функция чтения блока (выполняется с задержкой не менее 5мс. после записи,
(закомментированные задержки не помогли)):
Спойлер

Код: Выделить всё

void m_I2C_ReadBlok(char* bf) //чтение тестового блока 
{
////////////////////////////////////////////////////////////////////////////////////////
m_I2C_StartCondition ();
m_I2C_SendByte(0b10100000);	//адрес микросхемы + бит режима записи
m_I2C_SendByte(0b00000000);	//старший байт адреса EEPROM 
m_I2C_SendByte(0b00000000);	//младший байт адреса EEPROM
_delay_us(2);	
m_I2C_StartCondition ();
m_I2C_SendByte(0b10100001);	//адрес микросхемы + бит режима чтения	
for(unsigned char i=0; i<11; i++)
  {
	//_delay_ms(5);	
	bf[i] = m_I2C_RecvByte(1);//чтение байта EEPROM с ACK от мастера	
	}
//_delay_ms(5);	
bf[11] = m_I2C_RecvByte(0);//чтение последнего байта EEPROM с NACK от мастера
m_I2C_StopCondition();	
///////////////////////////////////////////////////////////////////////////////////////	
}
Вложения
ЛА4.png
(49.93 КБ) 444 скачивания
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

У AT24C256C "керамика" по питанию поставлена?
Прорезались зубы
Сообщения: 213
Зарегистрирован: Вт сен 09, 2008 18:17:27

Сообщение DENIS451 »

Да.
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

Разделите проверку на две части.
Запишите AT24C256C на внешнем программаторе и прочтите данные или запишите своей программой и прочтите программатором.
На данный момент, вы не можете быть уверенным что данные реально записываются в EEPROM.
Дело в том что декодеры протокола ПО логических анализаторов не "ругнутся" если где-то есть "игра на фронтах" или некое время по I2C не соответствует стандарту.

Добавлено after 10 minutes 32 seconds:
Re: EEPROM AT24C256C не читается несколько байт подряд, почему?
P.S.
Извиняюсь, предположение из серии "дурдома": После чтения первого байта вы точно сами не "роняете" линию SDA в "ноль"?
Смущает то, что у стёртой/новой AT24C256C по всем адресам должны быть 0FFh...
Прорезались зубы
Сообщения: 213
Зарегистрирован: Вт сен 09, 2008 18:17:27

Сообщение DENIS451 »

Извиняюсь, предположение из серии "дурдома": После чтения первого байта вы точно сами не "роняете" линию SDA в "ноль"?
Да, это так, спасибо!

Совсем забыл что надо отпустить линию после формирования ACK со стороны мастера, всё заработало!
Ответить

Вернуться в «Периферия»