|
Кто работал с памятью at45db161d или в принципе с at45dbxxxd, пожалуйста подскажите, Проблемы с at45db161d и их решение |
|
|
|
Sep 23 2007, 07:48
|

Участник

Группа: Участник
Сообщений: 47
Регистрация: 22-08-07
Пользователь №: 29 980

|
Так вот, ситуация такая. Использовал примеры программ из аппноутов, переписал коды команд на те которые советуют в даташите. Перепроверил и в других источниках типа занятие 7 с сайт 123avr. Функции написаны правильно. Сначала стираю память, потом пишу в нее значения до 176, тобишь записываю 176 байт. Потом читаю память и сохраняю данные в массив, после вывожу массив на экран (в выводе символов ошибок нет точно), выводятся исключительно значения 255, в рядок так 255 255 255 и т.д. Впихивал вывод значений в разные места программы с выводом разных переменных - вроде все работает. да и в противном случае вывело первоначальное значение массива а это 0. Забавная еще вещь наблюдается, программа написана изначально была для 28 ногово чипа, а я использую 8 ногий так что приходится читать занятость из регистра стуса строчкой типа while (!(SPSR & temp));, я думал что ошибка в ожидании и добавил строчку SPDR = STATUS_REGISTER;, но потом удалил, покуда изменений не произошло. Так теперь зараза не хочет работать без этой строчки, хотя раньше работала так же криво как и сейчас. И еще при стирании биты выставляются как я понял в значение 255. Кто-нибудь сталкивался или работал с данным чипом? В тупике. предположений нет вообще. Если кто хочет помочь и нуждается в наглядной демонстрации кода, то я выложу.
|
|
|
|
|
 |
Ответов
|
Sep 25 2007, 03:34
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
1) Прерывания пока разрешать не нужно (в setup()), а иногда и вредно - а вдруг где-то в дебрях спрятанного текста  обработчик прерывания SPI от Папы Карло затерялся? 2) Сначала нужно всё-таки записать-прочитать буфер, чтобы убедиться в правильной настройке интерфейса, пинов и вааще - похоже, к этому уже пришли. Для работы с буфером ничего стирать не нужно (там ОЗУ), т.е. erasing(); нафиг. Это для отладки. 3) В функции записи нет строки unsigned char temp = 0x80; оно типа глобально, но в чтениичто-то есть -намешано. Вообще использовать переменные там, где можно использовать литералы (константные объявления через #define) - это моветон. Переменные жрут озу (стек), их нужно правильно объявлять, не забывать инициализировать, не позволять опитмизатору их выбрасывать... Кроме того, цифирьки разбирать типа SPCR = 0x5C; не очень хорошо - это приводит к нежеланию читать код у меня (ИМХО, и у большинства тоже), но это бы полбеды - беда в том, что такое написание приводит к механическим ошибкам и не позволяет поддерживать код уже через очень короткое время после написания. Компилятор всё-равно всё в цифирьки перепакует, но нафига человеку его работу пытаться сделать, да ещё и неуклюже? Помотрите хотя бына примеры инициализации из DS - там достаточно читабельно. Короче, замените, где надо эту temp на (1<<SPIF), а где на (1<<BUSY). Равно и остальное, а то обсуждение усложняется  5) Приведение типа к знаковому (char)SPDR в функции чтения - нафиг. Объявление bt_word[] не нашёл. 4)Для отладки уберите всякие static buffer_counter и запишите хотя бы один раз в буфер с нулевого адреса несколько байт данных, ну и прочитайте оттуда же. Цикл, вызывающий запись в буфер одного байта, уберите из main и положите в функцию записи, а лучше пока вааще убить и попробовать тупо записать, например, 4 константы. 5) Убрав вызов erasing() из main перестанет выключаться SPI 8-D SPCR = 0x00; // Выключить SPI и есть вероятность, что то, что написано далее, будет фунциклировать  6) Функцию стирания надо будет рихтовать - там некорректные кусочки ожидания готовности (обсуждали ранее)- ожидание либо вынести в отдельную функцию, либо по месту поправить. Я, например, не использую принципиально функции записи со стиранием, потому, если драйвер для себя, то могу запихнуть ожидание внутрь, но если иначе, то смысла прятать нет. Кроме того, в ожидании (а это порядком 40+ мс!!!) часто можно заниматься чем-то более важным  иногда узнавая, как же ж там дела...
--------------------
aka Vit
|
|
|
|
|
Sep 25 2007, 17:49
|

Участник

Группа: Участник
Сообщений: 47
Регистрация: 22-08-07
Пользователь №: 29 980

|
1. В setup написал #asm("cli") // запретить прерывания 2. eracing() нафиг 3. temp заменил через #define 0x80 4. Приведение типа убрал. Объявление мссива забыл написать, покуда это только половина программы была, причем вторая и внизу. Первую занимает дисплей. Управление им осуществлятся через программный spi, никакие регистры там не затрагиваются. Сам массив: char bt_word[176]={0}; 5. Попытался записать только одну константу... И не хочу показаться занудой или неудачником, но 255 на экрачике в рядок. Парни... кажится до меня доперло... У меня на памяти на ноже WP +5 Вольт... Случаем это не защита от записи?  Ответ на вопрос выше, отпаял я этот вывод - не помогло... Ну что за хрень
Сообщение отредактировал lomtev - Sep 25 2007, 17:57
|
|
|
|
|
Sep 25 2007, 18:10
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(lomtev @ Sep 25 2007, 23:49)  Парни... кажится до меня доперло... У меня на памяти на ноже WP +5 Вольт... Случаем это не защита от записи?  Ответ на вопрос выше, отпаял я этот вывод - не помогло... Ну что за хрень Да, WP это вход защиты от записи, но только активный уровень у этого сигнала низкий. Не настаиваю, а просто предлагаю посмотреть мою библиотеку для работы с AT45, написанную когда-то для MSP430. Писал для одного проекта, который заглох и эти исходники мне не пригодились. Исходники минимально тестировались. Дважды уже давал ее нуждающимся, но к сожалению никакой обратной реакции хотя бы на уровне "работает / не работает / глючит / фуфло полное" не получил  Может хотя бы вы попробуете и как-то выскажетесь?
|
|
|
|
Сообщений в этой теме
lomtev Кто работал с памятью at45db161d или в принципе с at45dbxxxd, пожалуйста подскажите Sep 23 2007, 07:48 sensor_ua Похоже, чтение регистра статуса неправильное. Пока... Sep 23 2007, 08:11 lomtev Цитата(sensor_ua @ Sep 23 2007, 12:11) По... Sep 23 2007, 10:07 sensor_ua Цитатая понял надо писать до chip_select
Неправиль... Sep 23 2007, 10:40 lomtev Цитата(sensor_ua @ Sep 23 2007, 14:40) Не... Sep 23 2007, 10:59 sensor_ua ЦитатаSPDR = STATUS_REGISTER;
while (!(SPSR ... Sep 23 2007, 11:07 lomtev Написал аналог предложенного выше цикла... вот что... Sep 23 2007, 18:24 sensor_ua Ну а остальные команды обрамить CS?
Вот примерчик ... Sep 23 2007, 18:40 lomtev Цитата(sensor_ua @ Sep 23 2007, 22:40) Ну... Sep 23 2007, 18:51  lomtev Цитата(lomtev @ Sep 23 2007, 22:51) ДА вр... Sep 23 2007, 20:02 sensor_ua Чтение/запись буфера не требуют проверки статуса н... Sep 23 2007, 20:05 lomtev Я уже начал искать совершенно тупые варианты и наз... Sep 23 2007, 20:05 OLEG_BOS Цитата(lomtev @ Sep 23 2007, 23:05) Я уже... Sep 23 2007, 20:16  lomtev Цитата(OLEG_BOS @ Sep 24 2007, 00:16) В к... Sep 23 2007, 20:25   OLEG_BOS Цитата(lomtev @ Sep 23 2007, 23:25) Ясно,... Sep 23 2007, 20:28 sensor_ua ))
MISO - Master Input Slave Output
MOSI - Master ... Sep 23 2007, 20:32 lomtev Цитата(sensor_ua @ Sep 24 2007, 00:32) ))... Sep 23 2007, 20:59 sensor_ua Цитатая не понял что есть такое.
Вот-вот. Проблема... Sep 23 2007, 21:02 lomtev Цитата(sensor_ua @ Sep 24 2007, 01:02) Во... Sep 23 2007, 21:05 sensor_ua Цитатаона может работать и на пяти
Для этого нужно... Sep 23 2007, 21:13 Snaky Цитата(lomtev @ Sep 23 2007, 14:48) Кто-н... Sep 24 2007, 03:53 sensor_ua ЦитатаЕсть готовая рабочая билиотека
А была надежд... Sep 24 2007, 04:12 lomtev Цитата(sensor_ua @ Sep 24 2007, 08:12) А ... Sep 24 2007, 14:00  zltigo Цитата(lomtev @ Sep 24 2007, 17:00) в 8 н... Sep 24 2007, 15:10 GDI Раньше выпускались АТ45 с какой то буквой(вроде , ... Sep 24 2007, 12:01 sensor_ua ЦитатаВозможно удивитесь
Не принимайте так близко ... Sep 24 2007, 14:30 lomtev Цитата(sensor_ua @ Sep 24 2007, 18:30) Не... Sep 24 2007, 20:01 lomtev В прикрепленном файле функции. Файл не большой пос... Sep 24 2007, 21:16 GDI Вот библиотека с которой я работаю, инициализация ... Sep 25 2007, 06:44 lomtev Предложенный исходник, написан явно не для Codevis... Sep 25 2007, 18:38 rezident Цитата(lomtev @ Sep 26 2007, 00:38) Предл... Sep 25 2007, 18:49 lomtev ТАк парни, кажись пошло г**вно по трубам, перепаял... Sep 25 2007, 18:59 sensor_ua А какой проц? пока почему-то думал, что мега16. Sep 25 2007, 19:25 lomtev Всё парни.... всё заработало, по крайней мере перв... Sep 25 2007, 19:31 urasinov ЦитатаВторая - Не знаю почему но программатор (Обы... Sep 26 2007, 04:06 GDI Программатор все же лучше сделать покруче, наприме... Sep 26 2007, 06:58 lomtev Фишка не в самом программаторе, а в компе, если пр... Sep 26 2007, 17:28 lomtev Заметил странную штуку. Была проблема что у меня н... Sep 26 2007, 19:48 sensor_ua А unsigned char k не пробовал? Sep 26 2007, 20:43 lomtev Цитата(sensor_ua @ Sep 27 2007, 00:43) А ... Sep 27 2007, 16:29 lomtev Я иногда дивлюсь своему аналитическому уму Добав... Sep 27 2007, 18:19 sensor_ua eds == 0xFF для
Цитатаfor(i=0; i<eds; i++) //Р... Sep 27 2007, 18:41 lomtev Я бобер хитрый и вывел значение которое должно ото... Sep 27 2007, 20:33 Ivaxa Решил и про свою проблему написать. При замене AT4... Jan 23 2008, 13:13 uriy А какую частоту CLK используете? У меня при частот... Jan 23 2008, 19:15 Roger Помогите решить проблемы, курсач нужно было сдать ... Dec 11 2009, 13:47 GDI Программатор пробовали от схемы отключать? Dec 14 2009, 11:50 Roger Цитата(GDI @ Dec 14 2009, 14:50) Программ... Dec 15 2009, 19:11
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|