UniBomb 0 16 октября, 2008 Опубликовано 16 октября, 2008 · Жалоба В общем такая проблема - сабжевая микросхема работает наполовину. Т.е. если в неё что-нибудь записать, то вероятность считывания того же значения примерно 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 самописны, но точно рабочие (с другими устройствами работается прекрасно). Уже неделю сижу над этим всем и не могу заставить правильно записывать и считывать данные, подскажите в чём я неправ))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 16 октября, 2008 Опубликовано 16 октября, 2008 · Жалоба У вас вроде нигде нет проверки на наличие ACK и тем более нет ее в функции записи после twi_write_address(0b10100000,'w'); Вы на 100% уверены, что за время двойного _delay_loop_2(0xFFFF); запись полностью успевает завершиться? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
UniBomb 0 17 октября, 2008 Опубликовано 17 октября, 2008 · Жалоба Прошу прощения за задержку - доступа к интернету небыло))) Проверка статуса 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; В результате теперь возвращается правлиьное значение ровно через раз. Т.е. правильный и неправильный возврат чередуются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
UniBomb 0 20 октября, 2008 Опубликовано 20 октября, 2008 · Жалоба блин... что то совсем плохо, думалка уже не знает что делать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kamil_yaminov 1 24 октября, 2008 Опубликовано 24 октября, 2008 · Жалоба Немного похожая проблема с AT25F1024 - либо при записи, либо при чтении (пока не разобрался) выпадает один бит из байта, причем строго определенный - либо 1й, либо 4й, если считать от младшего. Причем если выпал 1й, то он выпадает во всех байтах, 4й - соответственно. 1) Есть подозрение что неплохой выброс по питанию попортил флешь, и вообще надо организовать нормальное питание. 2) нужно посмотреть осциллографом сигналы SPI-интерфейса 3) еще что-то как проделаю отпишусь, может чем-то поможет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kamil_yaminov 1 26 октября, 2008 Опубликовано 26 октября, 2008 · Жалоба Поставил по питанию LM317, после этого все заработало нормально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться