Goodvin
Dec 14 2011, 12:47
Здравствуйте, коллеги.
В проекте необходимо хранить данные, поступающие с датчика (SPI), в энергонезависимой памяти. Планируется использовать параллельную FRAM память и повесить ее на FSMC. С STM32 до этого не работал, поэтому возникли некоторые вопросы.
Я сравнил временные диаграммы памяти и FSMC. Судя по диаграммам, их получится подружить, но данная FRAM память медленная - цикл записи 140ns. Где то на форуме встречал, что уже при 70ns люди вводили задержки. Вот возникли вопросы:
1) Можно ли писать во внешнюю память посредством DMA? Т.е. у DMA использовать решим MEM2MEM, а в качестве адреса назначения указать адрес внешней памяти так чтобы данные подхватил FSMC и записал во внешнюю память.
2) Если так можно сделать, то нужно ли будет вводить задержки или DMA и FSMC подружатся сами? (сомневаюсь, но вдруг)
Если позволите, то задам еще несколько вопросов по FSMC:
3) Указанная FRAM память имеет интерфейс SRAM памяти. Только контроллеры со 144 пинами умеют работать с внешней SRAM, хотя FSMC есть у МК со 100 пинами, но он урезанный - работает с NOR памятью в мультиплексном режиме. Я посмотрел на временные диаграммы и возникло подозрение, что SRAM память можно подружить с FSMC работающем в режиме NOR (мультиплексном). Кто нибудь так делал? Как думаете, получится?
4) Кто подключал внешнюю память на FSMC подскажите, какие подводные камни могут возникнуть?
5) Кто нибудь подключал NOR память посредством FSMC? Как получилось?
С уважением, goodvin.
NOR память подключал, но не работал. Болтается на шине без дела (пока?). Хватило внутренней.
Мультиплексную шину подключал к собственноручно разработанному интерфейсу на FPGA Cyclone II. Использовал соответствующие настройки FSMC. Работает.
Еще на шине висит SRAM и контроллер LCD. Работают. В-общем, все 4 выбора заняты.
Для каждого из устройств высчитывал количество тактов по всем состояниям на шине. И задавал их при программировании FSMC.
Использовал и сигнал /WAIT. Тогда можно запрограммировать чуть меньшее количество тактов ожидания, но они отработаются аппаратно.
С DMA экспериментировал, но отложил. Все перекидываю программно. Чтобы работал DMA, нужно, чтобы FSMC работал.
На мой взгляд, картинки в документах страшные, а железо заработало, на удивление, практически, с первого запуска.
Dron_Gus
Dec 14 2011, 19:20
3) SRAM к 100-ногому цепляли. И еще три NAND'ины. Немного прокололись с регитром на младшую часть адреса - для нашей SRAM был нужен "прозрачный" при низком Addres Valid (или как он называется у STM). Мы же вначале поставили тот, что защелкивает (и выставляет данные на выход) по положительному фронту. И словили кучу чудес. При замене на правильный регистр все взлетело.
2) ИМХО, должно работать.
На остальные вопросы, вроде, уже ответили.
Goodvin
Dec 15 2011, 09:12
Цитата(Dron_Gus @ Dec 14 2011, 22:20)

3) SRAM к 100-ногому цепляли. И еще три NAND'ины. Немного прокололись с регитром на младшую часть адреса - для нашей SRAM был нужен "прозрачный" при низком Addres Valid (или как он называется у STM). Мы же вначале поставили тот, что защелкивает (и выставляет данные на выход) по положительному фронту. И словили кучу чудес. При замене на правильный регистр все взлетело.
2) ИМХО, должно работать.
На остальные вопросы, вроде, уже ответили.
А как это у Вас получилось на одну шину 4 устройства, там же всего 1 или 2 /CS?
А что за SRAM была? Я бы посмотрел на нее документацию.
Dron_Gus
Dec 15 2011, 09:38
Снаружи на А20 и А21 навесили 74HC139, ему на вход CS (PD7). С него получили 4 CS'а. Но с тех пор я стараюсь избегать таких извращений. Ибо что PQFP 100 + soic16 + 2 x SOIC20, что PQFP144 знанимают одинаково места на плате.
maksimp
Dec 15 2011, 10:29
Цитата(Dron_Gus @ Dec 15 2011, 12:38)

Снаружи на А20 и А21 навесили 74HC139, ему на вход CS (PD7). С него получили 4 CS'а. Ибо что PQFP 100 + soic16 + 2 x SOIC20, что PQFP144 знанимают одинаково места на плате.
Как вы всё это разводите по печатной плате?
У STM32 по непонятной причине выводы FSMC расположены по всему периметру корпуса. Нет бы сделать их всех с одного бока...
Dron_Gus
Dec 15 2011, 17:31
У многих процессоров так сделано. Разводится на 4 слойке нормально (2 слоя сигнальных, 2 питания, в крайних случаях сигналы по слоям питания)
Goodvin
Dec 17 2011, 18:33
Dron_Gus и все же, какая память у Вас стояла? Хочу посмотреть ее временные диаграммы. И еще, правильно ли мы друг друга поняли, что у Вас мультиплексировались именно линии адреса и данных (не только ИС)?
Dron_Gus
Dec 18 2011, 12:24
Стояли R1LV1616HSA, K9WAG08U1A х 3. Мультиплексировались DA[15:0]. Защелки управлялись сигналом NADV.
Шаманъ
Dec 18 2011, 15:57
Цитата(Goodvin @ Dec 14 2011, 14:47)

1) Можно ли писать во внешнюю память посредством DMA? Т.е. у DMA использовать решим MEM2MEM, а в качестве адреса назначения указать адрес внешней памяти так чтобы данные подхватил FSMC и записал во внешнюю память.
Можно, только нужно помнить про возможные проблемы при "multimaster FSMC access" (по крайней мере на STM32F101/103) - следите чтобы два мастера не пытались получить доступ к FSMC одновременно (например, не следует писать/читать во внешнюю память при активном DMA работающем с внешней памятью).
Goodvin
Dec 18 2011, 19:19
Спасибо, Шаманъ. Я об этом как раз и размышлял. Думаю, что придется организовывать что-то типа контроллера доступа к внешней памяти, т.к. у меня есть данные, которые должны автоматом лететь в нее и будет простое обращение к памяти. Первые данные - периодично появляются и довольно часто остальные реже. Вот планирую освобождать FSMC к моменту появления первых данных, а со вторыми работать в промежутках. Скажите, а в других сериях STM можно работать в режиме "multimaster FSMC access"? К стати, откуда эту фразу взяли, в DataSheet'е ее не заметил?
Сейчас мучаюсь с тем, что не могу выбрать какой МК использовать. В МК с 144 пинами полноценный FSMC, а в 100 пиновом нет. Уважаемые люди говорят, что дружили 100 пиновый МК с SRAM памятью (у меня FM28V100), но я сомневаюсь. Вроде по временным диаграммам должно работать, но я все равно сомневаюсь. Ставить МК с 144 пинами расточительно - много места занимает, дороже, куча ног просто висеть будет. Эхх.
Dron_Gus
Dec 18 2011, 20:12
Если вы будете ставить демультиплексор на регистрах, то по площади то на то и выходит. Ставьте 144 ногий. От лишних ног никому плохо не было.
Goodvin
Dec 18 2011, 20:47
А зачем мне ставить демультиплексор? У меня на FSMC будет висеть только одна SRAM'оподобная FRAM память. Вопрос в том, насколько реально прикрутить ее к 100-пиновому МК. Там FSMC можно включить в режиме NOR multiplexed, тогда, как Вы и писали, будут мультиплексироваться DA[15:0]. Вот я переживаю о том, как FSMC отработает и понравиться ли это памяти. По хорошему, для этого нужно провести эксперимент, но времени маловато. Конечно, больше склоняюсь к более надежному варианту, но красиво тоже хочется сделать.
Шаманъ
Dec 19 2011, 08:15
Цитата(Goodvin @ Dec 18 2011, 21:19)

К стати, откуда эту фразу взяли, в DataSheet'е ее не заметил?
Из erratы
Вот:
2.12 Multimaster access on the FSMC memory map
Description
When multimaster accesses are performed on the FSMC memory map (address space from
0x6000 0000 to 0xA000 0FFF), an error could be generated, leading to either a bus fault or
a DMA transfer error.
A multimaster can be:
● DMA1 and DMA2
● DMA1 and CPU
● DMA2 and CPU
Workaround
If multimaster accesses are required on the FSMC address space, the software must
ensure that accesses are performed one at a time, and not at the same time.В других сериях не знаю, возможно в более новых ревизиях чипов это уже пофиксили...
Dron_Gus
Dec 19 2011, 08:41
Цитата(Goodvin @ Dec 18 2011, 23:47)

А зачем мне ставить демультиплексор? У меня на FSMC будет висеть только одна SRAM'оподобная FRAM память. Вопрос в том, насколько реально прикрутить ее к 100-пиновому МК. Там FSMC можно включить в режиме NOR multiplexed, тогда, как Вы и писали, будут мультиплексироваться DA[15:0]. Вот я переживаю о том, как FSMC отработает и понравиться ли это памяти. По хорошему, для этого нужно провести эксперимент, но времени маловато. Конечно, больше склоняюсь к более надежному варианту, но красиво тоже хочется сделать.
Под демультиплексором я подразумевал защелку адреса на DA[15:0]. Как без этого подключить SRAM память я не вижу.
neo333
Feb 15 2012, 07:55
Цитата(Dron_Gus @ Dec 14 2011, 22:20)

Немного прокололись с регистром на младшую часть адреса - для нашей SRAM был нужен "прозрачный" при низком Addres Valid (или как он называется у STM). Мы же вначале поставили тот, что защелкивает (и выставляет данные на выход) по положительному фронту. И словили кучу чудес. При замене на правильный регистр все взлетело.
Скажите, пожалуйста, что за такая защелка? С прозрачностью на низком уровне никак не найду. Уже все перечитал:
74хх373 и 573 - прозрачность же на высоком?
74хх374 и 574 - защелкивают по положительному фронту.
Остальные регистры-защелки , что нашел, - вариации первых на 16 бит и др.
PS. Интерес не праздный, хочу к Discovery на STM32F407V подключить память и опасаюсь граблей с выбором правильных регистров.
А почему всё-таки не SPI? Там вроде до 40МГц обещается. Или такие большие требования к скорости потока?
Евгений_Юрьевич
Jun 8 2016, 21:26
Цитата(Dron_Gus @ Dec 14 2011, 22:20)

3) SRAM к 100-ногому цепляли. И еще три NAND'ины. Немного прокололись с регитром на младшую часть адреса - для нашей SRAM был нужен "прозрачный" при низком Addres Valid (или как он называется у STM). Мы же вначале поставили тот, что защелкивает (и выставляет данные на выход) по положительному фронту. И словили кучу чудес. При замене на правильный регистр все взлетело.
2) ИМХО, должно работать.
На остальные вопросы, вроде, уже ответили.
А как называется этот регистр защелка с прозрачный при низком значении защелкивающий адрес . Все 573 и 373 по высокому защелкиваются .
Цитата(Goodvin @ Dec 19 2011, 01:19)

Вот планирую освобождать FSMC к моменту появления первых данных, а со вторыми работать в промежутках. Скажите, а в других сериях STM можно работать в режиме "multimaster FSMC access"? К стати, откуда эту фразу взяли, в DataSheet'е ее не заметил?
Жесть какая. Костыли.
Цитата(Goodvin @ Dec 19 2011, 01:19)

Сейчас мучаюсь с тем, что не могу выбрать какой МК использовать.
Используйте что-нить из LPC. Зачем мазохизмом с этим FSMC заниматься если он такой кривой?
В LPC таких проблем нет - хоть сколько мастеров с внешней памятью работают и DMA ещё параллельно - нет проблем.
Есть проект на LPC1788 с кучей параллельных задач и тяжёлыми вычислениями на больших массивах во внешней SDRAM (одна задача читает/пишет через DMA во внешнюю SDRAM, другая читает через DMA из неё же, третья (декодер MP3) читает/пишет туда-же и ещё несколько задач у которых есть данные там же; и значительная часть кода в это же время выполняется из этой же SDRAM) - даже и не заморачивался никогда ни с какими проблемами доступа.
Да и вообще - нужна-ли Вам реально параллельная FRAM? Может достаточно SPI-ной?
Если надо быстро - можно повесить на quad-SPI. Если надо чтобы была в адресном пространстве CPU - можно повесить на SPIFI.
esaulenka
Jun 9 2016, 15:56
Цитата(jcxz @ Jun 9 2016, 06:15)

Используйте что-нить из LPC. Зачем мазохизмом с этим FSMC заниматься если он такой кривой?
Я конечно понимаю, что у Вас с STM какие-то особо личные отношения, с технической частью вопроса никак не связанные.
Но справедливости ради, "мазохизм с этим FSMC" был только на самой первой линейке этих процессоров. Уже лет 8 прошло с тех пор, можно смело использовать любую другую линейку STM. Там и другие ошибки поправили, кстати (errata на ту серию - аж на 40 с лишним страниц).
Цитата(esaulenka @ Jun 9 2016, 21:56)

Уже лет 8 прошло с тех пор, можно смело использовать любую другую линейку STM.
Сорри, не распознал некропостера. Посмотрел только на дату последнего
SasaVitebsk
Jun 10 2016, 07:31
В stm32f407 есть BackUp память. Там 4 килобайта от батарейки часовой. +1 мкА при отключенном питании. Вполне приемлемо.
Я для сохранения контекста использую FLASH память. Работал двумя способами.
1. Свал питания.
а) Завожу сигнал входного питания, (отделяю диодом от входного накопительного кондёра) на АЦП. Благо в АЦП есть режим типа компаратора, с прерыванием
б) В одном устройстве делал даже динамическое определение начала свала (если входное напряжение может меняться в значительных пределах. Например +12/ +24)
в) По прерыванию о свале питания, останавливаю работу, отключаю потребляющие цепи (например подсветку дисплея), завершаю незаконченные текущие транзакции по флэш памяти.
г) Сохраняю текущее состояние важных переменных (областей памяти) С контрольной суммой.
д) Повисаю до выключения / либо рестарта.
2. Текущая работа.
а) периодически сохраняю файловым способом важные данные, указывая текущее время сохранки ...
б) по свалу (PVD) сохраняю время выключения.
в) при подаче питания, ищу последнюю актуальную запись, и восстанавливаюсь по ней.
Цитата(SasaVitebsk @ Jun 10 2016, 13:31)

В stm32f407 есть BackUp память. Там 4 килобайта от батарейки часовой. +1 мкА при отключенном питании. Вполне приемлемо.
Я для сохранения контекста использую FLASH память. Работал двумя способами.
1. Свал питания.
а) Завожу сигнал входного питания, (отделяю диодом от входного накопительного кондёра) на АЦП. Благо в АЦП есть режим типа компаратора, с прерыванием
...
Пытались как-то делать мы подобным образом (думали отказаться от FRAM).
В реальной эксплуатации выявились проблемы: иногда стали происходить потери данных (т.е. вроде была перезагрузка, но сохранения данных не было, так как не было сигнала срабатывания монитора питания).
То ли это были перезагрузки из-за каких-то багов в ПО, то ли срабатывания сторожевика, то-ли возникали сигналы сброса из-за аппаратных помех (срабатывания супервизора питания по низкой части (сигнал монитора формировался высокой частью - +12 или +24В, после которого стоял вторичный понижающий DC-DC до 3.3В с супервизором)) то ли ещё чего. Так и не разобрались, так как происходило это очень редко и на столе не проявлялось, а только на реальном объекте.
В общем - если будут причины формирования сброса после высоковольтной части, то будут потери данных.
В результате отказались от такого решения и вернулись к надёжному решению на FRAM.
SasaVitebsk
Jun 10 2016, 10:25
В текущей версии у меня и вариант 1 и вариант 2. Данные восстановятся даже если произойдёт рестарт процессора. Более того, будет осуществлён "догон" на время выключенного состояния, по последним значениям.
Диагностируется причина (выключение питания/ рестарт) и выводится сообщение об этом.
Прибор выходит из любых висов. Определяю даже количество и частоту рестартов. Мониторю сети, статистику собираю. Пока существенных проблем не наблюдал. Пару лет выпускается.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.