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

Помогите с AT24C04B

В общем такая проблема - сабжевая микросхема работает наполовину. Т.е. если в неё что-нибудь записать, то вероятность считывания того же значения примерно 50%. Записываю в неё побайтно, считываю тоже. И вот скажем если записать в неё вот такую последовательность байт:

 

0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae,
0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8,
0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3,
0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd,
0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1,
0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
0xec, 0xed, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6,
0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0xff

 

то после прочтения имеем такую картину:

 

0xA5, 0x00, 0xA7, 0x00, 0x00, 0xAA, 0x00, 0x00, 0xAD, 0x00, 
0xAF, 0x00, 0xB1, 0x00, 0xB3, 0x00, 0xB5, 0x00, 0xB7, 0x00, 
0xB9, 0x00, 0xBB, 0x00, 0xBD, 0x00, 0xC0, 0x00, 0xC2, 0x00, 
0xC4, 0x00, 0xC6, 0x00, 0xC8, 0x00, 0xCA, 0x00, 0xCC, 0x00, 
0xCE, 0x00, 0xD0, 0x00, 0xD2, 0x00, 0xD4, 0x00, 0xD6, 0x00, 
0xD8, 0x00, 0xDA, 0x00, 0xDC, 0x00, 0xDE, 0x00, 0xE0, 0x00, 
0xE2, 0x00, 0xE4, 0x00, 0xE6, 0x00, 0xE8, 0x00, 0xEA, 0x00, 
0xEC, 0x00, 0xEF, 0x00, 0xF1, 0x00, 0xF3, 0x00, 0xF5, 0x00, 
0xF7, 0x00, 0x00, 0xFA, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0xF8

 

 

Записываю побайтно потому, что в процессе работы иногда возникает необходимость изменить только пару байт.

 

Характеристики у этой системы такие: 100кГц частота, пулап 6,8кОм, длина шины TWI сантиметра три, на шине висят два устройства (помимо AT24C04B ещё висит ATD75). Работаю с устройствами так:

 

unsigned char ReadByteFromExtEEPROM(unsigned char address)
{
unsigned char eep_value = 0;
twi_start();
twi_write_address(0b10100000,'w');
twi_write_byte(address);
twi_start();
twi_write_address(0b10100000,'r');
twi_read_byte(&eep_value, 0);
twi_stop();
return eep_value;
}
//---------------------------------------------------------------------------
void WriteByteIntoExtEEPROM(unsigned char address, unsigned char value)
{
twi_start();
twi_write_address(0b10100000,'w');
twi_write_byte(address);
twi_write_byte(value);
twi_stop();

_delay_loop_2(0xFFFF);
_delay_loop_2(0xFFFF); 
}

 

Функции для работы с TWI самописны, но точно рабочие (с другими устройствами работается прекрасно). Уже неделю сижу над этим всем и не могу заставить правильно записывать и считывать данные, подскажите в чём я неправ)))

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


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

У вас вроде нигде нет проверки на наличие ACK и тем более нет ее в функции записи после twi_write_address(0b10100000,'w'); Вы на 100% уверены, что за время двойного _delay_loop_2(0xFFFF); запись полностью успевает завершиться?

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


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

Прошу прощения за задержку - доступа к интернету небыло)))

 

Проверка статуса TWI естественно проверялась, я убрал эту проверку при написании темы дабы облегчить понимание кода. Проверки стояли такого плана:

 

twi_write_address(0b10100000,'w');
th1_l(0); th1_l(0); con_l(1); bf(1);
while(ti_get_last_status() != 0x18);
bf(0);

подобная проверка была после каждой функции. Смысл её таков - первая строчка зажигала определённую комбинацию светодиодов (после каждой функции своя компбинация) и включала пищалку. Если последний код статуса шины не соответсвует необходимому программа зависала в этом цикле. Так я могу узнать в каком именно месте и произошла ошибка. Но всё происходило хорошо, соответсвующие ACK получал всегда.

 

Насчёт двойного _delay_loop_2(0xFFFF); - эта задержка в 16мс, по даташиту максимальное время записи 5мс. Но в любом случае я и увеличивал эту задержку и уменьшал, но результат от этого не менялся.

 

И ещё - последнее что я делал - это вставлял функцию софтового сброса перед каждой командой:

 

  twi_start();
  twi_write_address(0xff, 'r');
  twi_start;
  twi_stop;

 

В результате теперь возвращается правлиьное значение ровно через раз. Т.е. правильный и неправильный возврат чередуются.

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


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

Немного похожая проблема с AT25F1024 - либо при записи, либо при чтении (пока не разобрался) выпадает один бит из байта, причем строго определенный - либо 1й, либо 4й, если считать от младшего. Причем если выпал 1й, то он выпадает во всех байтах, 4й - соответственно.

1) Есть подозрение что неплохой выброс по питанию попортил флешь, и вообще надо организовать нормальное питание.

2) нужно посмотреть осциллографом сигналы SPI-интерфейса

3) еще что-то

как проделаю отпишусь, может чем-то поможет

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


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

Поставил по питанию LM317, после этого все заработало нормально.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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