Перейти к содержанию
    

STM32F429 и 16-битная SDRAM 16MB /32 MB : практический опыт?

11 минут назад, ruslan1 сказал:

У меня перепутаны на элементе в схематике A11 и A10.

...

Что самое интересное- никаких проблем с 8-МБайт памятью не было, даже и не думал про такое.

Посмотрите какие там размер строки и столбца: ваша 4Мб требует больше адресных линий (как минимум 11), а в 1Мб возможно всё влазило в 10 адресных линий.

Например в моей IS45S16400J (1 Meg Bits x 16 Bits x 4 Banks (64-MBIT)):

#define SDRAM_RAS_L 2   //RAS latency (active to read/write delay)
#define SDRAM_CAS_L 2   //CAS latency
#define SDRAM_ROWS  12  //разрядность строк
#define SDRAM_COLS  8   //разрядность столбцов
#define SDRAM_BANKS 2   //разрядность кол-ва банков (кол-во банков == 1<<SDRAM_BANKS)
#define SDRAM_WIDTH 16  //разрядность шины данных чипа SDRAM (16 или 32)
#define SDRAM_BUS   16  //разрядность шины данных контроллера SDRAM (16 или 32)
#define SDRAM_SIZE \
  (SDRAM_WIDTH / 8 << SDRAM_ROWS + SDRAM_COLS + SDRAM_BANKS)

Т.е. - нужны A0...A11, но у вас может другая конфигурация.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, ruslan1 сказал:

У меня перепутаны на элементе в схематике A11 и A10.

И как теперь с этим жить....

Немного размышлений на этот счет.

Допустим, если бы это была обычная внешняя SRAM-память. Например, вот такая.

Даже если при разводке сплошь перепутать как угодно биты данных в пределах шины данных, и/или линии адреса в пределах шины адреса (например, для упрощения разводки платы или прожарки мозгов реверс-инженерам в будущем:laugh1:), очевидно, что все будет работать как положено. Почему? Потому что, поскольку при выставлении на шине адреса определенного кода со стороны МК, на стороне SRAM этот код может выглядеть перепутанной, но уникальной, белибердой. Например, адресу 000100002 в программе будет соответствовать реальный адрес 000000102 из-за того, что перепутаны местами биты A4 и A1 адресной шины. Таким образом, каждому выставляемому уникальному адресу соответствует один уникальный адрес на лапках внешней памяти. То же самое и с шиной данных.

Но в SDRAM все немного по-другому, и там есть Burst-режимы, при которых микросхеме дается один адрес и она выплевывает (или записывает) определенный блок данных с автоинкрементом внутреннего счетчика адреса. Эти "начальный" и "конечный тот самым внутренний" адреса могут не совпасть при такой Burst-транзакции. Это пока один толстый момент. Микросхеме IS42S16400J можно задать режим не пакетной записи. Но режим чтения всегда будет, к сожалению, пакетный. Хотя есть замечательная команда отмены Burst-чтения... Настроив Burst-чтение на 2 слова (разрядностью 16 бит по ширине шины данных), после чтения 1 слова дать команду отмены пакетного чтения, и т.д.

Другой момент, на линию A10 возложена еще и дополнительная функция Precharge. Тут уже разбираться с конкретной микросхемой нужно, можно ли все это дело сделать автоматом.

ИМХО, можно все-таки заставить SDRAM работать с перепутанными линиями, только в лютый костыль выливается и работать будет, но медленно.

Изменено пользователем Arlleex

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, Arlleex сказал:

Допустим, если бы это была обычная внешняя SRAM-память. Например, вот такая.

Даже если при разводке сплошь перепутать как угодно биты данных в пределах шины данных, и/или линии адреса в пределах шины адреса (например, для упрощения разводки платы или прожарки мозгов реверс-инженерам в будущем:laugh1:), очевидно, что все будет работать как положено. Почему? Потому что, поскольку при выставлении на шине адреса определенного кода со стороны МК, на стороне SRAM этот код может выглядеть перепутанной, но уникальной, белибердой.

Тут дело не в SRAM/не_SRAM, а в том - мультиплексирована шина адреса или нет. У рассматриваемого чипа SDRAM шина адреса мультиплексирована. И адрес делится на адрес строки + адрес столбца. Именно поэтому перепутывать нельзя. Если есть в природе SRAM с мультиплексированной шиной адреса, то для неё тоже это ограничение возможно будет справедливо.

Ну уже не говоря про пакетный доступ.

 

Цитата

ИМХО, можно все-таки заставить SDRAM работать с перепутанными линиями, только в лютый костыль выливается и работать будет, но медленно.

Если Вы имеете в виду: формировать все сигналы ногодрыгом GPIO - то пожалуй можно, но будет реально медленно  :biggrin:

А через контроллер SDRAM - сильно сомневаюсь, что получится при произвольных перепутанных ногах адреса. Проблема тут в том, что контроллер SDRAM должен знать какие разряды адреса относятся к строке, а какие - к столбцу. Иначе - не получится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 hours ago, ruslan1 said:

У меня перепутаны на элементе в схематике A11 и A10.

должно быть A10- pin22, у меня- pin 35, A11- pin35, у меня pin22.

Перекинул проводками- заработало.

Лет 6 назад его рисовал. блин. А может и не я рисовал....

Что самое интересное- никаких проблем с 8-МБайт памятью не было, даже и не думал про такое.

И как теперь с этим жить....

есть заведомо рабочие платы  STM32F439 / STM32F746 @TQFP176 + 32 бит/32 МByte MT48xxx. (без чипов) могу одну штучку подарить, если близко... Все свободные ножки(незадействованные для SDRAM) выведены на четыре двухрядных 22 пиновых раз'ема.

P.S.  Екб.

Изменено пользователем nanorobot

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если Ёбург неудобен, то могу посоветовать для пробы плату SK-MLPC1788 (есть на starterkit.ru или на его украинском варианте (наверное он ТСу ближе) - http://otladka.com.ua/). Схема на эту плату говорит что на ней стоит как раз MT48LC16M16A2TG. Правда на имеющемся у меня экземпляре стоит K4S561632N-LC75 - видимо у меня ещё старая ревизия платы. В любом случае можно связаться с ними и уточнить. Плата проверено рабочая - я на ней начинал некоторые свои проекты. В том числе у меня есть тест всего объёма SDRAM для неё (на разные режимы, в том числе и проверка времени хранения без рефреша).

И да - на плате стоит LPC1788, а не STM32, но мне кажется МК для пробы не принципиален. А может на других их платах с STM32 есть такая же SDRAM.

 

PS: Да уж - на украинском варианте этого магазина цена конечно какая-то негуманная....  :shok:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

(Кстати, нашел внятный перевод части документа на эту самую SDRAM, если кому на великом и могучем легче: тынц!)

 

Выпив, я рассудил трезво....

 

Спасибо за советы и идеи, вот какие выводы сделал из выше(ниже)написанного:

1.  для использования памяти в полном объеме нужно резать. В смысле, соединять адреса правильно а не как у меня. Это самый простой и понятный "костыль". Как выше заметил  VladislavS, с учетом наличия резисторов подобраться к дорожкам технологически несложно.

2. Нужно понять, может ли работать микросхема в таком режиме (без изменения платы), с использованием только первой четверти памяти (0-й банк)?  По моему разумению да, но тут хотелось бы ваше мнение услышать.

Почему мне кажется что работа стабильна в таком режиме при использовании только четверти памяти:

Про перемешивание строк и столбцов:

У меня  строки: row address: A[12:0],  столбцы: column address: A[8:0].
То есть собственно строки и столбцы из-за перестановки A10 <-> A11 не перемешиваются, можно спать спокойно.

Про Precharge:

А  вот тут интереснее, ибо A10 не просто адрес, он дырку в стене загораживает активно участвует в данном процессе:

Quote

 

A10 is sampled during a PRECHARGE command to determine if all banks are to be precharged (A10 HIGH) or bank selected by BA[1:0] (LOW)

....

READ/WRITE: A10 HIGH enables the auto precharge feature (nonpersistent), while A10 LOW disables the auto precharge feature. BA0 and BA1 determine which bank is being read from or written to.

PRECHARGE (Deactivate row in bank or banks): A10 LOW: BA0, BA1 determine the bank being precharged. A10 HIGH: all banks precharged and BA0, BA1 are “Don’t Care.”

....

PRECHARGE Operation
The PRECHARGE command (see Figure 17 (page 36)) is used to deactivate the open row in a particular bank or the open row in all banks. The bank(s) will be available for a subsequent row access some specified time (tRP) after the PRECHARGE command is issued. Input A10 determines whether one or all banks are to be precharged, and in the case where only one bank is to be precharged (A10 = LOW), inputs BA0 and BA1 select the bank. When all banks are to be precharged (A10 = HIGH), inputs BA0 and BA1 are treated as “Don’t Care.” After a bank has been precharged, it is in the idle state and must be activated prior to any READ or WRITE commands being issued to that bank.
 

из переведенного:

READ. ... Значение на входе A10 определяет, должно ли использоваться auto precharge. Если выбрано auto precharge, то по окончанию пакета чтения (READ burst) для строки, к которой осуществляется доступ, выполняется precharge; если auto precharge не выбрано, строка остается открытой для последующих доступов.

WRITE. ... Значение на входе A10 определяет, должно ли использоваться auto precharge. Если выбрано auto precharge, то для строки, к которой осуществляется доступ, выполняется precharge по окончанию пакета записи (write burst); если auto precharge не выбрано, то строка остается открытой для последующих доступов.

Из документации на мой МК:

Quote

SDRAM address mapping with 16-bit data bus width : [Bank1:0], Raw[12:0],Column[8:0],BM0

The AutoPrecharge is not supported. FMC_A[10] must be connected to the external memory address A[10] but it will be always driven ‘low’.
 

То есть пока я сижу тихо и не отсвечиваю не устанавливаю мой A11 (для SDRAM это A10) в 'high', это штатный режим работы.

Делаю вывод: свои 8 Мегабайт из установленных 32 я могу и так использовать, без всяких харакири на плате.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемые nanorobot и jcxz,

Спасибо за предложения помочь с железом! Удалось запустить имеющуюся плату с полной памятью(32МБ)  после простой перепайки-перерезки, так что дополнительные тушки для экспериментов вроде как и не нужны :)

 

Что интересно: собственно это было как бы дополнительная хотелка, основной софт на предыдущих версиях платы и на 8МБ трудится устойчиво. Так что думаю может и  переделывать не стану, пока не нужно. А что на плате запаяна микросхема 32МБ- это скрытые резервы, которые можно будет  задействовать в будущем путем несложной перепайки :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, ruslan1 said:

Вообще-то SDA10 (в терминах SDRAM) используется еще и при инициализации микросхемы памяти

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 часов назад, jcxz сказал:

Тут дело не в SRAM/не_SRAM, а в том - мультиплексирована шина адреса или нет. У рассматриваемого чипа SDRAM шина адреса мультиплексирована. И адрес делится на адрес строки + адрес столбца. Именно поэтому перепутывать нельзя.

По сути да. Но, на мой взгляд, самым главным фактором работоспособности связки МК + SDRAM при перепутанных линиях адреса является то, что при перепутывании линий нельзя смешивать те линии, которые не являются общими при адресации. Например, возьмем ту же IS45S16400J. У нее A11-A0 адресуют строку, а A7-A0 - столбец.

Таким образом, получается:

| A11 | A10 | A9 | A8 | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | - адрес строки
                                | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | - адрес столбца

 

Следовательно, нужно не допустить, чтобы перепутались общие линии с не общими (красные с зелеными). Зеленые же между собой могут быть перемешаны. Красные - между собой тоже. Возможно, кроме A10, поскольку эта нога отвечает еще за Precharge. Нужно посмотреть, как работает механизм Precharge, возможно и A10 можно будет перепутать. Опять же, про пакетный режим, конечно, тут стоит забыть.

Это лишь мои догадки, все исходя из логики. Возможно, я не прав, просто наблюдения. На всех своих устройствах я пока еще сам ноги не спутывал:mosking:

 

15 часов назад, jcxz сказал:

Если Вы имеете в виду: формировать все сигналы ногодрыгом GPIO - то пожалуй можно, но будет реально медленно  :biggrin:

Здесь я немного даже завидую ПЛИСоводам - там как захотел, так и развел...

 

2 часа назад, DmitryM сказал:

Вообще-то SDA10 (в терминах SDRAM) используется еще и при инициализации микросхемы памяти

Инициализацию можно провести и ногодрыгом. Повторюсь, это если, допустим, девайс не требует большой производительности доступа к внешней памяти, а нужен лишь большой внешний накопитель. Тогда можно и ноги спутать (как выше я описал), и инициализацию без контроллера SDRAM провести. Я к тому, что выкрутиться можно будет без переделки железа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

49 минут назад, Arlleex сказал:

Следовательно, нужно не допустить, чтобы перепутались общие линии с не общими (красные с зелеными). Зеленые же между собой могут быть перемешаны. Красные - между собой тоже. Возможно, кроме A10, поскольку эта нога отвечает еще за Precharge. Нужно посмотреть, как работает механизм Precharge, возможно и A10 можно будет перепутать. Опять же, про пакетный режим, конечно, тут стоит забыть.

Я так точно не скажу (давненько уже плотно работал с SDRAM), но у меня есть подозрения что контроллер SDRAM какие-то операции может оптимизировать. Например: открыть строку (передать её адрес), а потом не закрывая её, выполнять несколько операций с разными столбцами внутри данной строки (каждый раз передавая только адрес столбца).

Проще говоря: увидев, что следующее обращение к памяти идёт по адресу в той же строке что и предыдущее (определив это по линейному адресу), контроллер для ускорения не станет заново выполнять операцию открытия строки, а передаст только адрес столбца. Он же не знает что линии адреса перепутаны и данный адрес находится совсем в другой строке. И в результате получится обращение совсем к другой ячейке памяти, чем в случае если бы он передал и адрес строки и адрес столбца.

См. список команд: https://www.alterbit.ru/glossary198.html

 

PS: Кстати - нашёл хорошее описание работы именно этого чипа (MT48LC16M16A2) и на русском!: http://microsin.net/adminstuff/hardware/sdr-sdram-mt48lc16m16a2.html

Для понимания глубинных процессов работы. С кучей диаграмм и команд.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, DmitryM said:

Вообще-то SDA10 (в терминах SDRAM) используется еще и при инициализации микросхемы памяти

Вы имеете в виду LOAD MODE REGISTER (LMR) ?

В данных микросхемах (и в старой и в новой) в LMR перепутанные биты A10 и A12 оба "Reserved" и туда записываются нули

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 минуты назад, jcxz сказал:

Я так точно не скажу (давненько уже плотно работал с SDRAM), но у меня есть подозрения что контроллер SDRAM какие-то операции может оптимизировать. Например: открыть строку (передать её адрес), а потом не закрывая её, выполнять несколько операций с разными столбцами внутри данной строки (каждый раз передавая только адрес столбца).

Тогда увы и ах:wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 hours ago, Arlleex said:

Но в SDRAM все немного по-другому, и там есть Burst-режимы, при которых микросхеме дается один адрес и она выплевывает (или записывает) определенный блок данных с автоинкрементом внутреннего счетчика адреса. Эти "начальный" и "конечный тот самым внутренний" адреса могут не совпасть при такой Burst-транзакции. Это пока один толстый момент. Микросхеме IS42S16400J можно задать режим не пакетной записи. Но режим чтения всегда будет, к сожалению, пакетный.

Контроллер у STM32 не поддерживает пакетную запись/чтение для которой важно правильное подключение младших линий адреса (он всегда выдает адрес столбца на каждую операцию, даже при последовательном чтении/записи), потому проблем с перемешиванием в том числе и младших линий адреса нет. Хотя делать это и нежелательно. Нужно отметить, что регистр MR пишется через адресные линии, соответственно при перемешивании нужно писать корректное значение с учетом этого.

23 hours ago, Arlleex said:

ИМХО, можно все-таки заставить SDRAM работать с перепутанными линиями, только в лютый костыль выливается и работать будет, но медленно.

Главное перемешивать с пониманием вопроса, тогда и костылей не нужно. У меня есть плата где перемешано много всего, чтобы в двух слоях нормально работало, все отлично работает. 

5 hours ago, jcxz said:

Я так точно не скажу (давненько уже плотно работал с SDRAM), но у меня есть подозрения что контроллер SDRAM какие-то операции может оптимизировать. Например: открыть строку (передать её адрес), а потом не закрывая её, выполнять несколько операций с разными столбцами внутри данной строки (каждый раз передавая только адрес столбца).

Совершенно верно. Но схема Arleex рабочая, если не трогать А10.

P.S. Безболезненно можно перемешивать:

-линии выбора банка 

-линии данных в пределах одного байта

-байты линий данных, но только вместе с сигналами выбора байта

К линиям адреса (если это только не старшие линии) нужно подходить осторожно, вдумчиво читая датащит на SDRAM и контроллер памяти - тут возможны варианты. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/19/2018 at 10:23 AM, ruslan1 said:

2. Нужно понять, может ли работать микросхема в таком режиме (без изменения платы), с использованием только первой четверти памяти (0-й банк)?  По моему разумению да, но тут хотелось бы ваше мнение услышать.

Почему мне кажется что работа стабильна в таком режиме при использовании только четверти памяти:

.....

Делаю вывод: свои 8 Мегабайт из установленных 32 я могу и так использовать, без всяких харакири на плате.

Привет, Руслан!

Может теоретически ты и прав, но на практике выходит фигня. Плата с перепутанными A10 и A11 вроде бы работает на первых 8МБ (тест памяти и дальнейшая работа), но иногда выскакивает в "Hard Fault Handler". Изменения в программе по сравнению с прошивкой платы с 8МБ микросхемой памяти минимальны, только измение инициализации контроллера для новой микросхемы 32МБ.

После перепайки A10-A11 в состояние "как надо", плата начинает работать стабильно.

Эффект проверен на 14 платах- с перепутанными A10-A11 иногда есть "Hard Fault", после перепайки эти же платы работают стабильно.

Непонятно чем это вызвано но факт налицо.  Зафиксированные сбои были из области функций работы с очередями RTOS во время подключения дополнительных тасков, это активная косвенная адресация в какой-то до этого малоиспользуемой области памяти.

Димаю, что-то не так с рефрешем при перепутанных A10/A11 и какая-то часть ячеек портится, а дальше косвенная адресация приводит к крешу. Бурст моим МК не поддерживается, так что остается рефреш банков.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...