Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Непонятная работа AT45DB161D
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
IF_P
В прошлом году тестировал м/с AT45DB161B (28 pin). Все работало нормально (то что мне было необходимо). Сейчас решил поставить эту м/с в один проект. Вместо DB161B поставил DB161D (8 pin). Согласно информации Atmel никаких изменений вносить не надо. Снизу вверх эта м/с полностью поддерживается. Программу полностью перенес с макета в этот проект. Но AT45 ведет себя странным образом.
Записываю 528 байт, читаю тоже 528. А на RS232 получаю 528, 529, 792, 880 байт в зависимости от записываемого байта. Т.е. при записи в ту же страницу разных чисел получаю различную длину данных.
Ну и информация в ячейках совершенно другая от записываемой.
Программу еще раз проверил на макете - все OK. В Proteus'е тоже моделируется все нормально. В проекте предусмотрено 4 таких м/с. Запаял остальные - тоже самое. Кто что может посоветовать или кто-то уже встречался с чем-то подобным.
У меня питание AT45 - 3,3V - 74HCT125 - ATMega128.

Приложил файлы полученные при чтении.

P.S.

Хочу уточнить. В макете AT45 питается 5V. Я где-то здесь читал, что такое возможно. Под рукой не было 3V стабилизатора и я запитал от 5 V. Да, действительно все работало. Я отладил работу с этой м/с и занялся другими узлами на этой же макетке.
Но вот сейчас, когда я попробовал вернуться к этим м/с на макете, оказалось что они не работоспособны.
Одна из AT45 (их 2 шт ) повесила выход глухо на "0". Вторая выдавала всякий мусор. После замены м/с все снова зарабтало на макете.
Так что, НЕ ЗАПИТЫВАЙТЕ AT45 5V, как кое-кто советует. Работайте по datasheet wink.gif

Вот только-что попробовал прочитать р-р состояния.
На макете (DB161B) - 0xAC, что соответствует документации

У меня на плате (DB161D) - 0xF0 0xF3 на всех 4-х м/с
Почему два байта?
_Артём_
Цитата(IF_P @ Mar 19 2011, 12:09) *
У меня на плате (DB161D) - 0xF0 0xF3 на всех 4-х м/с
Почему два байта?


Что-то у Вас в программе не так: непонятно как mega в режиме SPI-мастера может считывать на запрос статуса 2 байта, а не один.
IF_P
Цитата(_Артём_ @ Mar 19 2011, 16:17) *
Что-то у Вас в программе не так: непонятно как mega в режиме SPI-мастера может считывать на запрос статуса 2 байта, а не один.

Так я же написал, что с другой м/с (AT45DB161B) эта же программа считывает один байт и он отвечает документации.
А тут два байта, причем, ни один из них не подходит.
Да и в Proteus'е эта же программа выводит один байт. 05.gif

Вот выкладываю тестовый пример. Проект в IAR 4.30A, Proteus 7.5 SP3.
У меня на плате LCD 4х20 и клавиатура 4х4. Поэтому в программе есть соответствующие модули и операторы.
Все что касается этих программ, я сдвинул подальше (test_AT45.c)

P.S.

В файле "instruction.txt" порядок работы
uriy
SPI это вам не I2C. Сколько байт вы просите столько микросхема вам и выдаст. Если вы даете клоки она выдает данные, нет клоков нет данных на ее выходе. Раз она вам два байта возвращает, значит вы два байта и просите.
IF_P
Цитата(uriy @ Mar 19 2011, 22:42) *
SPI это вам не I2C. Сколько байт вы просите столько микросхема вам и выдаст. Если вы даете клоки она выдает данные, нет клоков нет данных на ее выходе. Раз она вам два байта возвращает, значит вы два байта и просите.

Да знаю я это. Выше я привел тестовый пример. Там можна увидеть, что я запрашиваю один байт (р-р статуса), а получаю 2.
И эта же программа на другой плате, но с другой м/с (DB161B) работает нормально.
Proteus тоже выдает один байт. Вот скриншот Proteus'а.
Если в программе ошибка, то и здесь будет тоже.
M_Andrey
А как вы определяете что программа считывает 2 байта - по UART-у? Так может у вас UART неправильно работает - ведь плата другая и могут быть ошибки как минимум в разводке. И вообще как можно доверять симуляциям во всяких протеусах? Выводите считываемые данные сразу на индикатор.
SysRq
Цитата(IF_P @ Mar 20 2011, 18:49) *
Если в программе ошибка, то и здесь будет тоже.
Поставьте в виртуальном терминале бодовую скорость этак раза в два больше чем надо (ну или на МК меньше чем надо), и тоже будет ошибка rolleyes.gif
IF_P
Цитата(SysRq @ Mar 20 2011, 22:05) *
Поставьте в виртуальном терминале бодовую скорость этак раза в два больше чем надо (ну или на МК меньше чем надо), и тоже будет ошибка rolleyes.gif

К чему бы это?
SysRq
Цитата(IF_P @ Mar 20 2011, 23:21) *
К чему бы это?
К тому, что вместо одного байта станет два. Байт, посланный на 9600, превратится в два (или больше), если ожидать его как посланный на 57600.
Проверьте работу RS-канала, вам же намекнули...
IF_P
Цитата(SysRq @ Mar 20 2011, 22:23) *
К тому, что вместо одного байта станет два. Байт, посланный на 9600, превратится в два (или больше), если ожидать его как посланный на 57600.
Проверьте работу RS-канала, вам же намекнули...

Это мне объяснять не надо. Не первый год работаю с COM-портом. Для сомневающихся выкладываю скриншот настроек терминала.
Настройки AVR можно увидеть в тестовом примере.
Что касается разводки, то я перед подачей питания всегда делаю прозвонку. С этим там все в порядке.
А что касается аппаратной части, то у меня тоже возникли сомнения. RS232-это единственный узел, который я не проверил на плате.
Просто у меня никогда с этим не было проблем. Если нет ошибок в монтаже, то все всегда работало.
Попробую глянуть осциллографом. Если нет, то заменю MAX232. На AVR пока не думаю.

P.S.

Правда, завтра уезжаю на пару дней в командировку. По приезду все это проверю.
SysRq
Цитата(IF_P @ Mar 21 2011, 00:35) *
Настройки AVR можно увидеть в тестовом примере.
Fuse bits не видать же ж, они в МК.
IF_P
Цитата(SysRq @ Mar 21 2011, 00:00) *
Fuse bits не видать же ж, они в МК.

Вот они.

Цитата(SysRq @ Mar 21 2011, 00:00) *
Fuse bits не видать же ж, они в МК.

Я прошу извинить за неточность. Я привел картинку с Fuse, которые я обычно записываю в AVR. Но при чтении там было что-то другое
(видимо, заводские установки). Я их не анализировал, т.к подумал, что это ошибка чтения. Просто записал еще раз то, что надо. И все заработало.
Спасибо SysRq за подсказку про Fuse. С AVR я еще серьезно не работал. Поэтому всех тонкостей не знаю.
Видимо Fuse=M103C был установлен, а я использовал как раз UART1. Больше, вроде нечему мешать.

Еще раз спасибо. Пора баиньки.
Есть еще вопрос по работе с AT45. Но это, возможно, программная ошибка, т.к. проявляется одинаково в обоих платах.
После приезда опишу более детально.
Буду благодарен, если сможете помочь.
SysRq
Цитата(IF_P @ Mar 21 2011, 02:25) *
Видимо Fuse=M103C был установлен, а я использовал как раз UART1. Больше, вроде нечему мешать.
Установка M103C меняет очень многое, сразу бы заметили. А вот тактирование от 1МГц не так видно rolleyes.gif

Цитата(IF_P @ Mar 21 2011, 02:25) *
После приезда опишу более детально.
Пишите, сообразим.
IF_P
Цитата(SysRq @ Mar 21 2011, 01:50) *
Пишите, сообразим.


Вот приехал из командировки и возвращаюсь к своей теме.
Вопрос в следующем.
Чтение из страницы AT45 я делаю с использованием прерывания RS232. Там все нормально.
А вот запись-чтение буфера я попробовал сделать по опросу флага.
После включения питания и инициализации SPI (у меня в тестовой программе "*" "3") я выполняю запись-чтение буфера ("Shift" "1").
Получаю 528 байт. (см. ekr_norm).
Если еще раз послать эту же команду, то получаю 31 байт (см. ekr_1). И так до тех пока не выключу питание.

P.S.
Вот сейчас допаял кнопку RESET. Она у меня заведена и на CPU и на AT45.
После RESET тоже самое. Первый раз нормально, а потом 31 байт.
nk@
Чем дальше, тем непонятней.
PS: У меня какраз платка лежит на которой mega16 и AT25DF321 (подобный AT45 чип) стоят. Все прекрасно работает. Могу либу задарить.
IF_P
Так я ведь написал, что все нормально работает, если использовать прерывание UART. Я так и планирую работать.
Но вот в тестовой программе для простоты написал обмен с UART по опросу флага и возникли проблемы.
Просто хочется разобраться и найти причину, то ли с UARTом что-то, то ли с AT45. Ведь всякое в дальнейшем может быть.

P.S.

Вот только-что еще попробовал.
Если после инициализации SPI ("*" "3") ввести команду чтения р-ра состояния ("*" "9") , получаю как и положено 0xAC, а после следующей команды записи-чтения буфера ("Shift" "1") тоже получаю 31 байт.
M_Andrey
Опять вы все смотрите через терминал, одних граблей вам мало, загадочные "*" и "Shift" говорят о том что у вас как минимум 2 промежуточных звена возможных ошибок. У вас есть (судя по схеме) кнопки, дисплей, для проверки больше и мечтать не о чем - заведите команды на кнопки и смотрите ответы на дисплее (если конечно они работают :-) ).
SysRq
Цитата(IF_P @ Mar 19 2011, 17:28) *
Вот выкладываю тестовый пример. Проект в IAR 4.30A...
Возможно, ошибка из-за того, что вы путаете & и &&.

Такая вот конструкция делает совсем не то что задумано:
Код
while (!(UCSR1A && (1 << UDRE1)));
IF_P
Цитата(SysRq @ Mar 26 2011, 23:47) *
Возможно, ошибка из-за того, что вы путаете & и &&.

Такая вот конструкция делает совсем не то что задумано:
Код
while (!(UCSR1A && (1 << UDRE1)));

Да, действительно. Ошибка именно в этом. Только-что проверил.
Но как эта конструкция появилась у меня ума не приложу. Я прекрасно понимаю как работают обе конструкции.
И применял я их не раз. Да и тут я ставил из datasheet:


/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = data;

Откуда взялось "&&" - sad.gif
Этот оператор был настолько очевиден, что я даже не присматривался к нему, а искал ошибку в другом месте.

Как сказал К.Прутков:
"Если увидишь на клетке слона надпись буйвол - не верь глазам свои!"

Видимо, по ночам надо меньше работать. wub.gif

Еще раз Большое спасибо SysRq a14.gif
Ткнули носом в элементарную ошибку.

Буду работать дальше, но, видимою уже не сегодня. smile3046.gif




Цитата(M_Andrey @ Mar 26 2011, 21:05) *
Опять вы все смотрите через терминал, одних граблей вам мало, загадочные "*" и "Shift" говорят о том что у вас как минимум 2 промежуточных звена возможных ошибок. У вас есть (судя по схеме) кнопки, дисплей, для проверки больше и мечтать не о чем - заведите команды на кнопки и смотрите ответы на дисплее (если конечно они работают :-) ).


Опять повторюсь. (cм. пост выше) Все прекрасно работает и выводится на терминал, но при использовании прерывания UART. И так я буду работать с AT45. На этом я бы мог закончить и идти дальше. Но не хочется оставлять темных пятен (привычка). Конечно, это отнимает время. Но не наступая на "грабли" не приобретаешь опыт. wink.gif

P.S.

Да, у меня есть и клавиатура и дисплей. И я их использую для наладки на определенных этапах. Но куда удобнее использовать UART. Ведь выводить 528 байт из буфера или страницы на LCD не очень удобно. Тем более, что работу AVR с UARTом я проверил на макетке.
ELEKTROS
Здраствуйте, у меня проблема с AT45DB161D, никак не реагирует на воздействия, не могу добиться от неё ответа. Смотрю осцилом посылка как по даташиту идёт, например запрос ID: посылка 9F и несколько байт в догонку, по идее на этой догонке она и отвечать должна, а результата нету. Посылаю предварительно AB, для перевода в активный режим. Может память таво? Использую плату TE-TMS320F28335, или на ней чевото криво впаяли.
GDI
А режим SPI правильный? Она только 2 из 4х возможных поддерживает.
ELEKTROS
Говорюже смотрю осциллом, как не крути, а диаграмму не подресуешь. Нашёл проблему. Плата неправильно спаяна, уже выяснил что на первой ревизии этот косяк был.
ELEKTROS
А такой вопрос, в память миную буфер записывать через опкод 82H можно и также читать через D2H?
GDI
Я уже давно с ними не работал, если есть нужный опкод и есть в этом необходимость, то почему нет?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.