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

Проблема с записью в sdram.

Добрый день.

Настраиваю связку MT48LC4M32B2P-6A + stm32f7

Первоначально память завелась сразу, я написал коротенький код, заполняющий буфер, копирующий из буфера в sdram, а затем читающий из сдрам в другой буфер. Сверил оба буфера, все ОК. И успокоился. После этого я много чего настраивал, менял, возможно поменял что-то, не касающееся сдрам напрямую, но влияющее га ее работу. А может быть и память накрылась

Короче, когда я снова попытался поработать с памятью - данных при чтении не получил. Отладка показала, что генерируется прерывание HardFault на строке, которая пишет в память по определенному адресу.

Скажите, этот факт, он как то может свидетельствовать о том, что проблема га в микросхеме памяти, а в коде или в настройках контроллера? Я к тому, что, насколько я представляю себе принцип работы sdram, у контроллера нет обратной связи с микросхемой при записи, контроллер дрыгает ногами и не получает от микросхемы какого либо подтверждения исполнения. Другими словами, если микросхему вообще выпаять, или если она в силу неисправности не будет отвечать, то к зависанию в микроконтроллере это не приведет, программа после попытки записи двинется дальше, а при чтении получит нули, правильно?

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

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

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


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

50 minutes ago, Salamander said:

если микросхему вообще выпаять, или если она в силу неисправности не будет отвечать, то к зависанию в микроконтроллере это не приведет, программа после попытки записи двинется дальше, а при чтении получит нули, правильно?

Правильно

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


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

Ок, а что тогда может вызывать зависание на, строке

Quote

 #define sdram_base_addr 0xC0000000;

*(__IO uint32_t*) (sdram_base_addr) = 0x000000ff;

 

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


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

Возможно физическое повреждение чипа памяти. В частности серия MT имеет очень нежные контакты, +4в уже дохнут. Мой чип памяти на отладке сдох от болтающегося провода дежурки +5в.

2 hours ago, Salamander said:

возможно поменял что-то

Для таких ситуаций существует система контроля версий, откатиться назад - посмотреть изменения. Для программного кода есть несколько бесплатных программ, лично мне нравится черепаха TortoiseHg.

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


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

7 minutes ago, AVI-crak said:

Возможно физическое повреждение чипа памяти. В частности серия MT имеет очень нежные контакты, +4в уже дохнут. Мой чип памяти на отладке сдох от болтающегося провода дежурки +5в.

И как это приводит к зависанию контррллера? Он ведь, в конечном счете дрыгает ногами. Во время записи обратной информации не получает. Даже ноги свои в режим чтения не переводит.

В общем, наверное я сделаю вот что.... отключу fmc совсем. И попробую записать. Sdram, конечно, в этом случае не будет влиять, но вот другой вопрос  - не свихнется ли контроллер от попытки обратиться по несуществующему адресу?

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


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

1 hour ago, Salamander said:

Ок, а что тогда может вызывать зависание на, строке

Hard Fault - это не зависание.

 

17 minutes ago, Salamander said:

но вот другой вопрос  - не свихнется ли контроллер от попытки обратиться по несуществующему адресу?

Внезапно, получите тот же Hard Fault.

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


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

А если не отключать fmc,  но не инициализировать сдрам, будет фаульт?

18 minutes ago, aaarrr said:

Hard Fault - это не зависание.

 

Ну допустим, что может его вызвать?

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


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

16 minutes ago, Salamander said:

Ну допустим, что может его вызвать?

Например, чтение или запись по запрещённому адресу (запись во флеш микроконтроллера или выполнение кода из IO-памяти). Или обращение по невыровненному адресу.

Тут лучше читать первоисточники.

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


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

19 minutes ago, Salamander said:

что может его вызвать?

Обращение к выключенной периферии, обращение по несуществующему адресу и т.д. и т.п.

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


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

по какому адресу расположенo начало SDRAM?   C0000000?  ее размер?

каково содержимое  GUIConf.c ?

 

 

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


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

17 minutes ago, haker_fox said:

Или обращение по невыровненному адресу.

А вот с этого момента поподробнее.

Я, кстати, когда все работало, игрался с шириной шины (ставил в настройках 16 бит), с форматом записываемых данных (писал 32 битные данные) и у меня не всегда получалось их потом правильно прочесть. Жаль, не проверял тогда - есть ли hard fault.

Ответьте на ряд вопросов по адресации sdram.

1. Влияет ли как-то ширина шины sdram, на то, как я буду читать из нее данные программным кодом, обращаясь как единому адресному пространству?

Для примера у меня 32 битная сдрам. Начальный адрес 0хc0000000. Я хочу записать 4 байта. Эти 4 байта влезут в одну ячейку памяти, по одному ее физическому адресу. Но в адресное пространство эти байты будут записаны по адресам 0хс000000-0хс0000003, так?

А если я запишу 32 битное слово, то в едином адресном пространстве оно так же будет располагаться по адресам 0-3? А если я захочу прочитать 32 битное слово, которое я раньше записал по адресу 0хс0000000, то контроллер возьмет эти данные из одной ячейки микросхемы сдрам, спроецирует их в адрсное пространство по адресам 0-3, а мне выдаст в виде склеенных четырех байт . 

 

Если у меня 8битная память, то будет то же самое - в едином адресном пространстве по каждому адресу записано 8 бит, а захоти я прочитать или записать несколько 32 битных слов, мне просто нужно обращаться к адресам, кратным 4м?

 

Просто скажите, правильно ли я понял механизм?

10 minutes ago, golf2109 said:

какому адресу расположенo начало SDRAM?   C0000000?  ее размер?

0xc0000000, размер памяти 1м х 32 х 4 банка

ГУИ тут ни при чем, он не установлен, я ручками пишу и читаю.

Еще вопрос - особо волнует - в настройках сдрам можно выбрать ширину 32 бит. При этом есть еще одна опция byte enable. Она можеть быть отключена, может быть равна не только 32 бита, но и 16 бит? Как это понимать?

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


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

16 минут назад, Salamander сказал:

Я, кстати, когда все работало, игрался с шириной шины (ставил в настройках 16 бит)

Зачем??? Вы не знаете как у Вас чип SDRAM подключен?? :wacko2:  Может стоит лучше найти принципиальную схему и посмотреть на неё, а не "играться"?

16 минут назад, Salamander сказал:

Если у меня 8битная память, то будет то же самое - в едином адресном пространстве по каждому адресу записано 8 бит, а захоти я прочитать или записать несколько 32 битных слов, мне просто нужно обращаться к адресам, кратным 4м?

Если всё проинициализировано правильно, то обращаться можете ровно также как к внутренней ОЗУ.

16 минут назад, Salamander сказал:

Еще вопрос - особо волнует - в настройках сдрам можно выбрать ширину 32 бит. При этом есть еще одна опция byte enable. Она можеть быть отключена, может быть равна не только 32 бита, но и 16 бит? Как это понимать?

Не понятно о каких настройках речь. Видимо о калокубовских. Тогда скорей всего мануал на FMC даже не открывали. :prankster2:

Советую открыть и прочитать - многое станет ясно.  

1 час назад, Salamander сказал:

А если не отключать fmc,  но не инициализировать сдрам, будет фаульт?

Ну допустим, что может его вызвать?

Видимо опять-же нужно открыть мануал на ядро и прочитать описание регистров, описывающих причину fault-а.

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


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

41 minutes ago, jcxz said:

Зачем??? Вы не знаете как у Вас чип SDRAM подключен?? :wacko2:  Может стоит лучше найти принципиальную схему и посмотреть на неё, а не "играться"

Так принципиальную схему я и разрабатывал. У меня 32 бита. Все подключены. Когда спаял плату, корректно прочесть данные не получилось. Я достал из ящика плату дискавери. Посмотрел схему. На схеме 32 битная микросхема, у которой задействовано лишь 16 линий данных, остальные резистором притянуты к земле кажется. И в кубе пример для этой платы тоже настроен на 16 бит.

Сделал я проект, попробовал пописать в память на плате - ура, работает. Взял свою 32 битную плату, внушил ей, что на ней 16 битная память - ура, работает. Разбирательства почему у меня не работало на 32 битах, я оставил на потом. "Потом" настало вчера, но, как указано в начале темы,  я или что-то ковырнул, не подумав или спалил микросхему. О чем собственно и спросил, создав тему, мол может ли возникать хардфаульт при неисправной микросхеме. Из двух возможных вариантов ответа в теме прозвучало два.

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

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


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

10 minutes ago, Salamander said:

может ли возникать хардфаульт при неисправной микросхеме

При простом чтении-записи не может, ищите проблемы в софте.

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


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

2 hours ago, Salamander said:

А вот с этого момента поподробнее.

Здесь перечислены команды, которые допускают невыровненный доступ. Остальные команды доступа к памяти вызовут UsageFault, который будет эскалирован до HardFault. Это при условии, что USageFault не включен.

2 hours ago, Salamander said:

Влияет ли как-то ширина шины sdram,

Не влияет. Вы конфигурируете EMC в соответствии со схемой подключения памяти.

2 hours ago, Salamander said:

оно так же будет располагаться по адресам 0-3?

Конечно, другого не дано.

2 hours ago, Salamander said:

несколько 32 битных слов, мне просто нужно обращаться к адресам, кратным 4м?

Если вы используете высокоуровневый язык (Си и т.п.), то вас нюансы железа уже не должны заботить. Компилятор сгенерирует нужные команды, а ЕМС, при условии, что он правильно настроен, доделает всю работу.

1 hour ago, Salamander said:

создав тему, мол может ли возникать хардфаульт при неисправной микросхеме.

Я думаю, что при неисправном железе, может быть всё, что угодно... Например, вы в памяти можете хранить адрес переменной (указатель в Си). И если микросхема вам выдала битый указатель, и МК пытается считать данные с Марса, то конечно возникнет хардфолт.

1 hour ago, aaarrr said:

При простом чтении-записи не может, ищите проблемы в софте.

+1. Правда мы не знаем, как автор тестирует свою микросхему.

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


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

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

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

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

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

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

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

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

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

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