Полная версия этой страницы:
AT45DB*** Есть вопросы
Alt.F4
Oct 21 2010, 20:15
Опытным путем пришел к выводу, что чтобы считать что-либо из памяти (буфер, страницу прочитать или регистр статуса) всегда надо сначала посылать байт, а только затем считывать. В даташите такого не указано. Почему?
Спасибо.
MALLOY2
Oct 21 2010, 20:19
Наверное потому что это SPI или я вопроса не понял
ILYAUL
Oct 21 2010, 20:30
Цитата(MALLOY2 @ Oct 22 2010, 00:19)

Наверное потому что это SPI или я вопроса не понял

АГА SPI и пол DS посвящено протоколу обмена. Так , что как-то вопрос не о чём
Alt.F4
Oct 21 2010, 20:35
DS data flash не описывает, что надо сперва передавать байт, а затем читать, в DS на ATmega тоже такого не встречал. Помню только что буфер у SPI только приему.
ILYAUL
Oct 21 2010, 20:47
Цитата(Alt.F4 @ Oct 22 2010, 00:35)

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


и страница 3
ReadBy specifying the appropriate opcode, data can be readfrom the main memory or from either one of the two data
buffers.
Alt.F4
Oct 21 2010, 21:16
Вы наверное немного не те графики привели. OPCODE - это по-моему команда.
Еще раз полистал все waveforms и вроде бы как нашел эти "dummy bytes". Но по графику получается, что их постоянно повторять не надо, достаточно только после адреса послать 4 байта для чтения страницы и 1 байт для чтения буфера?
Нажмите для просмотра прикрепленного файлаз.ы. непонятно почему про эти "dummy bytes" не сказано в пунктах описания чтения буфера и страницы. Поиск слова dummy нашел только 5 мест, без графиков...
rezident
Oct 21 2010, 21:30
В даташите Dataflash имеется сводная таблица Detailed Bit-level Addressing Sequence for DataFlash, где указано сколько байт требуется передать для выполнения операции и сколько дополнительных незначащих (dummy) байт требуется перед тем, как эта операция будет выполнена. В любом случае требуется передать как минимум один байт Opcode и один незначащий байт для чтения, например, регистра статуса. Связано это с тем, что SPI это синхронный интерфейс и мастер, тактируя шину, побитно "пропихивает" данные в сдвиговый регистр приемника ведомого, получая одновременно от сдвигового регистра передатчика ведомого такое же количество бит в свой собственный сдвиговый регистр приемника. SPI осуществляет не просто прием или передачу, а одновременный обмен данными (транзакцию). Первый байт - Opcode - сообщает Dataflash код команды, которую требуется выполнить и только, проведя как минимум еще один обмен, можно получить результат выполнения этой команды (завершить транзакцию). В других случаях требуется бОльшее количество циклов обмена данными, т.к. DataFlash выполняет какие-либо операции внутри себя перед выдачей результата команды.
Alt.F4
Oct 22 2010, 12:02
rezident, вот теперь все ясно. Я раньше думал, что SCK выдает тактовые импульсы постоянно, а не только во время обмена битами.
Т.е. получается, чтобы прочитать страницу командой D2h надо послать 4 байта dummy + 1 байт, во время которого произойдет чтение.
Огромное спасибо, тема раскрыта!
"Шото я не поняв, чому":
CS=0, шлю команду чтения страницы без буфера D2h + адрес + 4 dummy байта, затем читаю байт из флэша.
После этого, чтобы прочитать следующий байт из флэша, надо сделать пустую передачу байта.
Вопрос: почему не 4 dummy байта, а 1?
Спасибо.
rezident
Jan 4 2011, 18:17
Цитата(Alt.F4 @ Jan 5 2011, 01:03)

Вопрос: почему не 4 dummy байта, а 1?
Потому, что уже не нужно загружать во внутренний счетчик-дешифратор полный (18+ бита) адрес этого байта. Загруженное первой командой значение этого счетчика
автоматически инкрементируется после передачи каждого последующего dummy.
А почему тогда в
графике из поста 6 стрелками указаны "4 dummy bytes"? Ошибка даташит? Да и в самой главе о чтении страницы памяти об это не сказано.
Даташит - додумай сам
rezident
Jan 4 2011, 18:38
Нет там ошибки. Данные поступают на выход 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-байт вовсе не требуется.
Вы видимо
график не посмотрели. Снизу есть надпись "4 dummy bytes", которая стрелками указывает на место после адреса и на место следующее после чтения.
Я веду речь про Main Memory Page Read
rezident
Jan 4 2011, 19:06
Цитата(Alt.F4 @ Jan 5 2011, 03:01)

Вы видимо
график не посмотрели. Снизу есть надпись "4 dummy bytes", которая стрелками указывает на место после адреса и на место следующее после чтения.
Я-то посмотрел. Это вы ...эээ... не совсем адекватно видите то, что изображено.

Стрелки следует трактовать как открывающую и закрывающую скобки. Вот потактовая картинка этого же самого процесса. Посчитайте биты и переведите их в байты, поделив на 8
Ну в этом графике тоже нигде не указано, что при последующих чтениях байтов надо слать один dummy.
Здесь указано только начало всей операции... Главу Main Memory Page Read уже который раз перечитываю, ну не написано там такого!
Цитата(Alt.F4 @ Jan 5 2011, 03:17)

Ну в этом графике тоже нигде не указано, что при последующих чтениях байтов надо слать один dummy.
Так устроен SPI. Для того, чтобы прочитать байт, надо записать байт. Это никак не связано с AT45.
Нет, сейчас речь не об этом.
rezident мне это еще в октябре объяснил
Другое дело, что надо провести "пустой обмен" перед полезным обменом (читай чтением), что в даташите не описано.
rezident
Jan 4 2011, 19:44
Цитата(Alt.F4 @ Jan 5 2011, 03:34)

Другое дело, что надо провести "пустой обмен" перед полезным обменом (читай чтением), что в даташите не описано.
В даташите все описано. И для подавляющего большинства описанное понятно. Если вы не можете понять прочитанное, то я вам только посочувствовать могу

Взгляните еще раз на временные диаграммы. Там же все
по тактам указано!
Смотрю еще раз. По тактам указано только до 72 включительно.
Причем 64 такта это команда, адреса страницы и байта, и 4 dummy bytes. Затем 8тактов - чтение. Следующих за чтением тактов не описано, что для того чтобы читать далее, надо слать только один dummy и затем читать, потом опять один dummy и чтение и так пока CS не будет = 1.
Цитата(Alt.F4 @ Jan 5 2011, 03:34)

Другое дело, что надо провести "пустой обмен" перед полезным обменом (читай чтением), что в даташите не описано.
Откуда вы это тогда узнали, если это не описано в даташите?
(Что-то не припоминаю необходимости передачи dummy-байта перед чтением каждого байта при последовательном чтении...)
Опытным путем. Стал проигрывать музыку и на слух определял, что идет пропуск байтов.
Значит дело в чём-то другом. Потому что (я ещё раз посмотрел) при последовательном чтении dummy-байты нужны только в начале. Может наоборот, воспроизводить не успеваете?
Вы наверное работаете в режиме Continuous Array Read (Low Frequency Mode: 03H)
Я веду речь о Main Memory Page Read (команда D2H) - постраничное чтение
з.ы. все работает когда в последующем чтении сперва отсылаю dummy, а затем читаю. Воспроизводить успеваю.
rezident
Jan 5 2011, 07:32
Цитата(Alt.F4 @ Jan 5 2011, 03:48)

По тактам указано только до 72 включительно.
Причем 64 такта это команда, адреса страницы и байта, и 4 dummy bytes. Затем 8тактов - чтение. Следующих за чтением тактов не описано, что для того чтобы читать далее, надо слать только один dummy и затем читать, потом опять один dummy и чтение и так пока CS не будет = 1.
Это и так понятно любому здравомыслящему инженеру. И вам должно быть понятно, т.к. вы уже знаете - для того, чтобы что-то прочитать нужно что-то передать потому, что так работает
синхронный интерфейс
SPI.
Вы меня не понимаете!!! Приведу листинг:
Код
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 в регистр сравнения таймера, для управления ШИМомВот таким образом читается без потерь! Если делать только одну транзакцию перед загрузкой "звукового байта" в регистр сравнения таймера, происходит пропуск байта!
rezident
Jan 5 2011, 08:18
А причем тут DataFlash?

Проблема где-то в (вашей) конкретной реализации программного протокола или (вашего) использования SPI-модуля в МК. Поскольку с AVR я знаком шапочно, то специально разбираться с флагами и регистрами его модуля SPI не имею большого желания. Может там какой-то флаг (который автоматически сбрасывается при работе по прерываниям) перед записью/чтением
программно сбрасывать нужно?
Я по SPI передачу осуществляю без прерываний. Т.е. по идее байт должен был прочитаться за одну транзакцию?
По сути, там и настроек SPI у AVR минимум, вот
они.
Мои настройки: прерывания выключены, SPE=1 (вкл), старший бит первым, режим Master, полярность SCK - низкий уровень, фаза тактового сигнала - по нарастающему фронту.
rezident
Jan 5 2011, 08:36
Цитата(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.
Попробовал, тоже самое - работает только при двойной транзакции. Да и по сути, если бы передача была не верна, то команда и адрес не передавались бы.
Кстати обращение к SPSR есть в строке после передачи: in temp,SPSR; Таким образом флаг SPIF сбрасывается и только после 4 тактов (при скорости f/4) устанавливается вновь
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.