реклама на сайте
подробности

 
 
> AT45DB*** Есть вопросы
Alt.F4
сообщение Oct 21 2010, 20:15
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Опытным путем пришел к выводу, что чтобы считать что-либо из памяти (буфер, страницу прочитать или регистр статуса) всегда надо сначала посылать байт, а только затем считывать. В даташите такого не указано. Почему?
Спасибо.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 28)
MALLOY2
сообщение Oct 21 2010, 20:19
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Наверное потому что это SPI или я вопроса не понял smile.gif
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Oct 21 2010, 20:30
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(MALLOY2 @ Oct 22 2010, 00:19) *
Наверное потому что это SPI или я вопроса не понял smile.gif

АГА SPI и пол DS посвящено протоколу обмена. Так , что как-то вопрос не о чём


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Oct 21 2010, 20:35
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



DS data flash не описывает, что надо сперва передавать байт, а затем читать, в DS на ATmega тоже такого не встречал. Помню только что буфер у SPI только приему. unsure.gif

Сообщение отредактировал Alt.F4 - Oct 21 2010, 20:38
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Oct 21 2010, 20:47
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(Alt.F4 @ Oct 22 2010, 00:35) *
DS data flash не описывает, что надо сперва передавать байт, а затем читать, в DS на ATmega тоже такого не встречал. Помню только что буфер у SPI только приему. unsure.gif

07.gif
и страница 3
Read
By specifying the appropriate opcode, data can be readfrom the main memory or from either one of the two data
buffers.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Oct 21 2010, 21:16
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Вы наверное немного не те графики привели. OPCODE - это по-моему команда.
Еще раз полистал все waveforms и вроде бы как нашел эти "dummy bytes". Но по графику получается, что их постоянно повторять не надо, достаточно только после адреса послать 4 байта для чтения страницы и 1 байт для чтения буфера?
Прикрепленное изображение

з.ы. непонятно почему про эти "dummy bytes" не сказано в пунктах описания чтения буфера и страницы. Поиск слова dummy нашел только 5 мест, без графиков... wacko.gif

Сообщение отредактировал Alt.F4 - Oct 21 2010, 21:19
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 21 2010, 21:30
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



В даташите Dataflash имеется сводная таблица Detailed Bit-level Addressing Sequence for DataFlash, где указано сколько байт требуется передать для выполнения операции и сколько дополнительных незначащих (dummy) байт требуется перед тем, как эта операция будет выполнена. В любом случае требуется передать как минимум один байт Opcode и один незначащий байт для чтения, например, регистра статуса. Связано это с тем, что SPI это синхронный интерфейс и мастер, тактируя шину, побитно "пропихивает" данные в сдвиговый регистр приемника ведомого, получая одновременно от сдвигового регистра передатчика ведомого такое же количество бит в свой собственный сдвиговый регистр приемника. SPI осуществляет не просто прием или передачу, а одновременный обмен данными (транзакцию). Первый байт - Opcode - сообщает Dataflash код команды, которую требуется выполнить и только, проведя как минимум еще один обмен, можно получить результат выполнения этой команды (завершить транзакцию). В других случаях требуется бОльшее количество циклов обмена данными, т.к. DataFlash выполняет какие-либо операции внутри себя перед выдачей результата команды.
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Oct 22 2010, 12:02
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



rezident, вот теперь все ясно. Я раньше думал, что SCK выдает тактовые импульсы постоянно, а не только во время обмена битами.
Т.е. получается, чтобы прочитать страницу командой D2h надо послать 4 байта dummy + 1 байт, во время которого произойдет чтение.
Огромное спасибо, тема раскрыта! beer.gif

Сообщение отредактировал Alt.F4 - Oct 22 2010, 12:12
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Jan 4 2011, 17:03
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



"Шото я не поняв, чому":
CS=0, шлю команду чтения страницы без буфера D2h + адрес + 4 dummy байта, затем читаю байт из флэша.
После этого, чтобы прочитать следующий байт из флэша, надо сделать пустую передачу байта.
Вопрос: почему не 4 dummy байта, а 1?
Спасибо.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 4 2011, 18:17
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Alt.F4 @ Jan 5 2011, 01:03) *
Вопрос: почему не 4 dummy байта, а 1?
Потому, что уже не нужно загружать во внутренний счетчик-дешифратор полный (18+ бита) адрес этого байта. Загруженное первой командой значение этого счетчика автоматически инкрементируется после передачи каждого последующего dummy.
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Jan 4 2011, 18:23
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



А почему тогда в графике из поста 6 стрелками указаны "4 dummy bytes"? Ошибка даташит? Да и в самой главе о чтении страницы памяти об это не сказано.
Даташит - додумай сам wacko.gif

Сообщение отредактировал Alt.F4 - Jan 4 2011, 18:23
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 4 2011, 18:38
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Нет там ошибки. Данные поступают на выход dataflash после передачи последовательности: 1 байт cmd, 3-х байт адреса, 4-х dummy и после каждого последующего переданного dummy-байта.
Обратите внимание, что такая последовательность только для режима Continuous Array Read - Legacy Command (cmd=0xE8). Для режима High Frequency (cmd=0x0B) требуется только 1 дополнительный dummy-байт, а для Low Frequency (cmd=0x03) чтения дополнительных dummy-байт вовсе не требуется.
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Jan 4 2011, 19:01
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Вы видимо график не посмотрели. Снизу есть надпись "4 dummy bytes", которая стрелками указывает на место после адреса и на место следующее после чтения.
Я веду речь про Main Memory Page Read


Сообщение отредактировал Alt.F4 - Jan 4 2011, 19:08
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 4 2011, 19:06
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Alt.F4 @ Jan 5 2011, 03:01) *
Вы видимо график не посмотрели. Снизу есть надпись "4 dummy bytes", которая стрелками указывает на место после адреса и на место следующее после чтения.
Я-то посмотрел. Это вы ...эээ... не совсем адекватно видите то, что изображено. rolleyes.gif Стрелки следует трактовать как открывающую и закрывающую скобки. Вот потактовая картинка этого же самого процесса. Посчитайте биты и переведите их в байты, поделив на 8 wink.gif
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Jan 4 2011, 19:17
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Ну в этом графике тоже нигде не указано, что при последующих чтениях байтов надо слать один dummy.
Здесь указано только начало всей операции... Главу Main Memory Page Read уже который раз перечитываю, ну не написано там такого!
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 4 2011, 19:24
Сообщение #16


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Alt.F4 @ Jan 5 2011, 03:17) *
Ну в этом графике тоже нигде не указано, что при последующих чтениях байтов надо слать один dummy.

Так устроен SPI. Для того, чтобы прочитать байт, надо записать байт. Это никак не связано с AT45.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Jan 4 2011, 19:34
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Нет, сейчас речь не об этом. rezident мне это еще в октябре объяснил a14.gif
Другое дело, что надо провести "пустой обмен" перед полезным обменом (читай чтением), что в даташите не описано.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 4 2011, 19:44
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Alt.F4 @ Jan 5 2011, 03:34) *
Другое дело, что надо провести "пустой обмен" перед полезным обменом (читай чтением), что в даташите не описано.
В даташите все описано. И для подавляющего большинства описанное понятно. Если вы не можете понять прочитанное, то я вам только посочувствовать могу laughing.gif Взгляните еще раз на временные диаграммы. Там же все по тактам указано!
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Jan 4 2011, 19:48
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Смотрю еще раз. По тактам указано только до 72 включительно.
Причем 64 такта это команда, адреса страницы и байта, и 4 dummy bytes. Затем 8тактов - чтение. Следующих за чтением тактов не описано, что для того чтобы читать далее, надо слать только один dummy и затем читать, потом опять один dummy и чтение и так пока CS не будет = 1.

Сообщение отредактировал Alt.F4 - Jan 4 2011, 19:49
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 4 2011, 20:02
Сообщение #20


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Alt.F4 @ Jan 5 2011, 03:34) *
Другое дело, что надо провести "пустой обмен" перед полезным обменом (читай чтением), что в даташите не описано.

Откуда вы это тогда узнали, если это не описано в даташите?
(Что-то не припоминаю необходимости передачи dummy-байта перед чтением каждого байта при последовательном чтении...)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Jan 4 2011, 20:05
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Опытным путем. Стал проигрывать музыку и на слух определял, что идет пропуск байтов.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 4 2011, 20:13
Сообщение #22


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Значит дело в чём-то другом. Потому что (я ещё раз посмотрел) при последовательном чтении dummy-байты нужны только в начале. Может наоборот, воспроизводить не успеваете?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Jan 4 2011, 20:23
Сообщение #23


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Вы наверное работаете в режиме Continuous Array Read (Low Frequency Mode: 03H)
Я веду речь о Main Memory Page Read (команда D2H) - постраничное чтение
з.ы. все работает когда в последующем чтении сперва отсылаю dummy, а затем читаю. Воспроизводить успеваю.

Сообщение отредактировал Alt.F4 - Jan 4 2011, 20:27
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 5 2011, 07:32
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Alt.F4 @ Jan 5 2011, 03:48) *
По тактам указано только до 72 включительно.
Причем 64 такта это команда, адреса страницы и байта, и 4 dummy bytes. Затем 8тактов - чтение. Следующих за чтением тактов не описано, что для того чтобы читать далее, надо слать только один dummy и затем читать, потом опять один dummy и чтение и так пока CS не будет = 1.
Это и так понятно любому здравомыслящему инженеру. И вам должно быть понятно, т.к. вы уже знаете - для того, чтобы что-то прочитать нужно что-то передать потому, что так работает синхронный интерфейс SPI.
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Jan 5 2011, 07:57
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Вы меня не понимаете!!! Приведу листинг:
Код
SPI_exchange:
    out        SPDR,data_temp; передаем
  wait_spi_transmit:;
    in        temp,SPSR;
    sbrs    temp,(SPIF);ждем когда произойдет передача
    rjmp    wait_spi_transmit;
    in        data_temp,SPDR;читаем принятое
ret                ;

Теперь представим, что команду, адреса страницы и байта, и dummy передали.
Пробуем читать дальше не дергая CS.
rcall SPI_exchange ;
rcall SPI_exchange ;
грузим data_temp в регистр сравнения таймера, для управления ШИМом

Вот таким образом читается без потерь! Если делать только одну транзакцию перед загрузкой "звукового байта" в регистр сравнения таймера, происходит пропуск байта!

Сообщение отредактировал Alt.F4 - Jan 5 2011, 07:59
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 5 2011, 08:18
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



А причем тут DataFlash? cranky.gif Проблема где-то в (вашей) конкретной реализации программного протокола или (вашего) использования SPI-модуля в МК. Поскольку с AVR я знаком шапочно, то специально разбираться с флагами и регистрами его модуля SPI не имею большого желания. Может там какой-то флаг (который автоматически сбрасывается при работе по прерываниям) перед записью/чтением программно сбрасывать нужно?
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Jan 5 2011, 08:26
Сообщение #27


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Я по SPI передачу осуществляю без прерываний. Т.е. по идее байт должен был прочитаться за одну транзакцию?
По сути, там и настроек SPI у AVR минимум, вот они.
Мои настройки: прерывания выключены, SPE=1 (вкл), старший бит первым, режим Master, полярность SCK - низкий уровень, фаза тактового сигнала - по нарастающему фронту.

Сообщение отредактировал Alt.F4 - Jan 5 2011, 08:34
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 5 2011, 08:36
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Alt.F4 @ Jan 5 2011, 16:26) *
По сути, там и настроек SPI у AVR минимум, вот они.
Ага. Кажется понятно, где тут собака порылась. См. описание бита SPIF на следующей странице.
Цитата
Bit 7 - SPIF: SPI Interrupt Flag - Флаг прерывания по SPI
По завершении обмена последовательными данными бит SPIF устанавливается в состояние 1 и, если бит SPIE в регистре SPCR установлен и разрешено глобальное прерывание, генерируется сигнал прерывания. Бит SPIF очищается аппаратно при выполнении подпрограммы обработки соответствующего вектора прерывания. Бит SPIF может быть очищен также при первом считывании состояния регистра статуса SPI, с установленным битом SPIF, с последующим обращением к регистру данных SPI (SPDR).

Добавьте в свою функцию команду чтения регистра SPSR перед записью в регистр SPDR.
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Jan 5 2011, 09:09
Сообщение #29


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Попробовал, тоже самое - работает только при двойной транзакции. Да и по сути, если бы передача была не верна, то команда и адрес не передавались бы.
Кстати обращение к SPSR есть в строке после передачи: in temp,SPSR; Таким образом флаг SPIF сбрасывается и только после 4 тактов (при скорости f/4) устанавливается вновь

Сообщение отредактировал Alt.F4 - Jan 5 2011, 09:09
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 06:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01674 секунд с 7
ELECTRONIX ©2004-2016