Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT45DB*** Есть вопросы
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Alt.F4
Опытным путем пришел к выводу, что чтобы считать что-либо из памяти (буфер, страницу прочитать или регистр статуса) всегда надо сначала посылать байт, а только затем считывать. В даташите такого не указано. Почему?
Спасибо.
MALLOY2
Наверное потому что это SPI или я вопроса не понял smile.gif
ILYAUL
Цитата(MALLOY2 @ Oct 22 2010, 00:19) *
Наверное потому что это SPI или я вопроса не понял smile.gif

АГА SPI и пол DS посвящено протоколу обмена. Так , что как-то вопрос не о чём
Alt.F4
DS data flash не описывает, что надо сперва передавать байт, а затем читать, в DS на ATmega тоже такого не встречал. Помню только что буфер у SPI только приему. unsure.gif
ILYAUL
Цитата(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.
Alt.F4
Вы наверное немного не те графики привели. OPCODE - это по-моему команда.
Еще раз полистал все waveforms и вроде бы как нашел эти "dummy bytes". Но по графику получается, что их постоянно повторять не надо, достаточно только после адреса послать 4 байта для чтения страницы и 1 байт для чтения буфера?
Нажмите для просмотра прикрепленного файла
з.ы. непонятно почему про эти "dummy bytes" не сказано в пунктах описания чтения буфера и страницы. Поиск слова dummy нашел только 5 мест, без графиков... wacko.gif
rezident
В даташите Dataflash имеется сводная таблица Detailed Bit-level Addressing Sequence for DataFlash, где указано сколько байт требуется передать для выполнения операции и сколько дополнительных незначащих (dummy) байт требуется перед тем, как эта операция будет выполнена. В любом случае требуется передать как минимум один байт Opcode и один незначащий байт для чтения, например, регистра статуса. Связано это с тем, что SPI это синхронный интерфейс и мастер, тактируя шину, побитно "пропихивает" данные в сдвиговый регистр приемника ведомого, получая одновременно от сдвигового регистра передатчика ведомого такое же количество бит в свой собственный сдвиговый регистр приемника. SPI осуществляет не просто прием или передачу, а одновременный обмен данными (транзакцию). Первый байт - Opcode - сообщает Dataflash код команды, которую требуется выполнить и только, проведя как минимум еще один обмен, можно получить результат выполнения этой команды (завершить транзакцию). В других случаях требуется бОльшее количество циклов обмена данными, т.к. DataFlash выполняет какие-либо операции внутри себя перед выдачей результата команды.
Alt.F4
rezident, вот теперь все ясно. Я раньше думал, что SCK выдает тактовые импульсы постоянно, а не только во время обмена битами.
Т.е. получается, чтобы прочитать страницу командой D2h надо послать 4 байта dummy + 1 байт, во время которого произойдет чтение.
Огромное спасибо, тема раскрыта! beer.gif
Alt.F4
"Шото я не поняв, чому":
CS=0, шлю команду чтения страницы без буфера D2h + адрес + 4 dummy байта, затем читаю байт из флэша.
После этого, чтобы прочитать следующий байт из флэша, надо сделать пустую передачу байта.
Вопрос: почему не 4 dummy байта, а 1?
Спасибо.
rezident
Цитата(Alt.F4 @ Jan 5 2011, 01:03) *
Вопрос: почему не 4 dummy байта, а 1?
Потому, что уже не нужно загружать во внутренний счетчик-дешифратор полный (18+ бита) адрес этого байта. Загруженное первой командой значение этого счетчика автоматически инкрементируется после передачи каждого последующего dummy.
Alt.F4
А почему тогда в графике из поста 6 стрелками указаны "4 dummy bytes"? Ошибка даташит? Да и в самой главе о чтении страницы памяти об это не сказано.
Даташит - додумай сам wacko.gif
rezident
Нет там ошибки. Данные поступают на выход 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-байт вовсе не требуется.
Alt.F4
Вы видимо график не посмотрели. Снизу есть надпись "4 dummy bytes", которая стрелками указывает на место после адреса и на место следующее после чтения.
Я веду речь про Main Memory Page Read
rezident
Цитата(Alt.F4 @ Jan 5 2011, 03:01) *
Вы видимо график не посмотрели. Снизу есть надпись "4 dummy bytes", которая стрелками указывает на место после адреса и на место следующее после чтения.
Я-то посмотрел. Это вы ...эээ... не совсем адекватно видите то, что изображено. rolleyes.gif Стрелки следует трактовать как открывающую и закрывающую скобки. Вот потактовая картинка этого же самого процесса. Посчитайте биты и переведите их в байты, поделив на 8 wink.gif
Alt.F4
Ну в этом графике тоже нигде не указано, что при последующих чтениях байтов надо слать один dummy.
Здесь указано только начало всей операции... Главу Main Memory Page Read уже который раз перечитываю, ну не написано там такого!
AHTOXA
Цитата(Alt.F4 @ Jan 5 2011, 03:17) *
Ну в этом графике тоже нигде не указано, что при последующих чтениях байтов надо слать один dummy.

Так устроен SPI. Для того, чтобы прочитать байт, надо записать байт. Это никак не связано с AT45.
Alt.F4
Нет, сейчас речь не об этом. rezident мне это еще в октябре объяснил a14.gif
Другое дело, что надо провести "пустой обмен" перед полезным обменом (читай чтением), что в даташите не описано.
rezident
Цитата(Alt.F4 @ Jan 5 2011, 03:34) *
Другое дело, что надо провести "пустой обмен" перед полезным обменом (читай чтением), что в даташите не описано.
В даташите все описано. И для подавляющего большинства описанное понятно. Если вы не можете понять прочитанное, то я вам только посочувствовать могу laughing.gif Взгляните еще раз на временные диаграммы. Там же все по тактам указано!
Alt.F4
Смотрю еще раз. По тактам указано только до 72 включительно.
Причем 64 такта это команда, адреса страницы и байта, и 4 dummy bytes. Затем 8тактов - чтение. Следующих за чтением тактов не описано, что для того чтобы читать далее, надо слать только один dummy и затем читать, потом опять один dummy и чтение и так пока CS не будет = 1.
AHTOXA
Цитата(Alt.F4 @ Jan 5 2011, 03:34) *
Другое дело, что надо провести "пустой обмен" перед полезным обменом (читай чтением), что в даташите не описано.

Откуда вы это тогда узнали, если это не описано в даташите?
(Что-то не припоминаю необходимости передачи dummy-байта перед чтением каждого байта при последовательном чтении...)
Alt.F4
Опытным путем. Стал проигрывать музыку и на слух определял, что идет пропуск байтов.
AHTOXA
Значит дело в чём-то другом. Потому что (я ещё раз посмотрел) при последовательном чтении dummy-байты нужны только в начале. Может наоборот, воспроизводить не успеваете?
Alt.F4
Вы наверное работаете в режиме Continuous Array Read (Low Frequency Mode: 03H)
Я веду речь о Main Memory Page Read (команда D2H) - постраничное чтение
з.ы. все работает когда в последующем чтении сперва отсылаю dummy, а затем читаю. Воспроизводить успеваю.
rezident
Цитата(Alt.F4 @ Jan 5 2011, 03:48) *
По тактам указано только до 72 включительно.
Причем 64 такта это команда, адреса страницы и байта, и 4 dummy bytes. Затем 8тактов - чтение. Следующих за чтением тактов не описано, что для того чтобы читать далее, надо слать только один dummy и затем читать, потом опять один dummy и чтение и так пока CS не будет = 1.
Это и так понятно любому здравомыслящему инженеру. И вам должно быть понятно, т.к. вы уже знаете - для того, чтобы что-то прочитать нужно что-то передать потому, что так работает синхронный интерфейс SPI.
Alt.F4
Вы меня не понимаете!!! Приведу листинг:
Код
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
А причем тут DataFlash? cranky.gif Проблема где-то в (вашей) конкретной реализации программного протокола или (вашего) использования SPI-модуля в МК. Поскольку с AVR я знаком шапочно, то специально разбираться с флагами и регистрами его модуля SPI не имею большого желания. Может там какой-то флаг (который автоматически сбрасывается при работе по прерываниям) перед записью/чтением программно сбрасывать нужно?
Alt.F4
Я по SPI передачу осуществляю без прерываний. Т.е. по идее байт должен был прочитаться за одну транзакцию?
По сути, там и настроек SPI у AVR минимум, вот они.
Мои настройки: прерывания выключены, SPE=1 (вкл), старший бит первым, режим Master, полярность SCK - низкий уровень, фаза тактового сигнала - по нарастающему фронту.
rezident
Цитата(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.
Alt.F4
Попробовал, тоже самое - работает только при двойной транзакции. Да и по сути, если бы передача была не верна, то команда и адрес не передавались бы.
Кстати обращение к SPSR есть в строке после передачи: in temp,SPSR; Таким образом флаг SPIF сбрасывается и только после 4 тактов (при скорости f/4) устанавливается вновь
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.