Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Параллельный порт 8 бит и STM32
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Tronix286
Доброго,

Вопрос у меня такой - возможно ли на STM32 реализовать ведомый параллельный 8-битный порт? Например подключить STM32 к шине ISA-8bit? У PIC'ов есть классная штука под названием Parallel Slave Port (PSP) - если включить этот режим некоторые ноги становятся сигналами /WR, /RD,/CS и 8-битный PORTD сам в зависимости от состояния этих ног переходит из высокоимпедального состояния в режимы input или output или опять в hi-z. На порту есть встроенная защелка, поэтому особо не важно в какой момент времени произойдет чтение из порта, так как если до этого что-то туда (в порт) было положено - оно и прочитается из защелки. Ну и по прерыванию конечно можно обрабатывать события (запись/чтение).

Так вот, возвращаясь к STM32 - есть что-то подобное? Если дергать софтварно, успею ли я за пару наносекунд перевести порт из одного состояния в другой по событию? По грубым прикидкам, на 72Мгц не успею. Да и ARM - он же фиг его знает какие там префечи, кеши и вообще не понятно, за сколько исполнится какая инструкция. Закладываться на большую частоту, > 100 Мгц?

А если не софтварно, то как? Вот DCMI в принципе, но... Это ж не совсем то.
А может просто кто-то уже реализовывал?
Огурцов
407 может шину по типу i8085
Tronix286
Цитата(Огурцов @ Dec 29 2015, 20:34) *
407 может шину по типу i8085


Ясный пионер, что может. Любой микроконтроллер, который умеет дергать ногами, может прикинуться 8085. Вопрос встает не тогда, когда нужно кого то там дергать, а когда тебя (микроконтроллер) дергают. А именно, когда пришел сигнал чтения /RD, перевести восемь ног из hi z в output, выдать на них байт и уйти по спаду /RD быстренько опять в hi-z. Желательно за детерминированное время, а не как получится. Потому что пару раз может получится, а третий - нет.
ViKo
PSP не может, а по внешнему событию можно попробовать переслать содержимое порта в память. Надо посмотреть, возможны ли такие события для работы DMA.
Tronix286
Цитата(ViKo @ Dec 29 2015, 21:21) *
PSP не может, а по внешнему событию можно попробовать переслать содержимое порта в память. Надо посмотреть, возможны ли такие события для работы DMA.


Меня даже больше волнует не переслать содержимое по событию в память (запись /WR), а чтение, то есть переслать из памяти в порт, при этом успев сменить направление порта туда-обратно... Так то где-то на хабре была статейка, как STM цепляли к ISA для снифа данных между контроллером HDD и мамкой. Но там все просто - порт все время в режиме input, и как только ext int, то сохраняем содержимое порта в буфер.

Плюс, настроить DMA то можно GPIO <-> memory, но как настроить чтоб он еще при этом менял направление порта - вот это вопрос...

В общем склоняюсь, что надо вешать внешний регистр-защелку типа 555ИР23, потому что по другому в лоб не решается. А казалось бы, мегагерцы, DMA и вообще пальцы \w/
adnega
Цитата(Tronix286 @ Dec 29 2015, 21:38) *
В общем склоняюсь, что надо вешать внешний регистр-защелку типа 555ИР23, потому что по другому в лоб не решается. А казалось бы, мегагерцы, DMA и вообще пальцы \w/

Попахивает навязыванием задачи выбранному МК.
Обычно под задачу выбирают соответствующее решение.
Для ногодрыга и слейв-применений STM32, увы, не подходит.
Тут даже DCMI не выручит (ибо, требуется туда-сюда).

Нужно делать промежуточные буферы приема и передачи, например, на ПЛИС, если нужны большие скорости.
Или отказаться от наносекунд и сделать на прерываниях по фронту и спаду на пинах /CS, /RD, /WR.
toweroff
Порт держать всегда в состоянии IN
/CS завесить на какой-то внешний INT
в прерывании INT ждать /WR или /RD и быстренько, если нужно, перевести ноги куда нужно и выставить/прочитать пины данных
дождаться окончания /RD или /WR
перевести ноги обратно в IN режим
дождаться окончания /CS
прерыванию INT - наивысший приоритет

что там будет по таймингам - черт ее знает sm.gif
Огурцов
что будет - 200 мгц стм против 2 мгц исы - порвет как тузик грелку
adnega
Цитата(Tronix286 @ Dec 29 2015, 21:38) *
а чтение, то есть переслать из памяти в порт, при этом успев сменить направление порта туда-обратно...

Кста, шину адреса нужно анализировать или читаем всегда из одного и того же адреса?
И записываем всегда в один и тот же адрес (с позиций ISA)?
Огурцов
ну да, а еще там бизи есть - завернул за облако, поставил на ручник и стоишь-куришь
jcxz
Цитата(adnega @ Dec 30 2015, 02:04) *
Попахивает навязыванием задачи выбранному МК.
Обычно под задачу выбирают соответствующее решение.

С этим полностью согласен - это правильный ответ на эту тему.

А если охота поизвращаться, то например на LPC43xx настраиваем один DMA-канал на чтение данных из GPIO-порта по фронту/спаду WR (тоже обычный GPIO-пин), другой DMA-канал - на запись данных в регистр управления направлением GPIO-порта по фронту/спаду OE (GPIO-пин). Не знаю как в STM32, но в LPC-шках, при желании и умении читать даташиты, никто не мешает настроить работу DMA по событиям на внешних пинах. Без всяких прерываний.
Valentine Loginov
Не знаток st-шек, а fsmc не то?
Tronix286
Цитата(adnega @ Dec 29 2015, 23:38) *
Кста, шину адреса нужно анализировать или читаем всегда из одного и того же адреса?
И записываем всегда в один и тот же адрес (с позиций ISA)?


Шину адреса не нужно. С этим пусть аппаратный дешифратор справляется. Имхо никакой микроконтроллер с дешифрацией не справится, если он только не на паре гигагерц работает.

Цитата(jcxz @ Dec 30 2015, 07:16) *
С этим полностью согласен - это правильный ответ на эту тему.

Навязывание значит... Ну не просто оно так, навязывание-то, а из-за более - менее вменяемого USB OTG у STM'ов. Вот и хотелось красиво обойтись одним МК, а не россыпью мелко-логики из защелок и триггеров, что-бы лишь параллельную шину обслужить.

Цитата(Valentine Loginov @ Dec 30 2015, 09:51) *
Не знаток st-шек, а fsmc не то?

Не то. Оно типа как ведущее, то есть STM32 может чем-то управлять по этой шине (памятью, дисплеем или чем еще). А им управлять не могут.

Цитата(Огурцов @ Dec 29 2015, 23:26) *
что будет - 200 мгц стм против 2 мгц исы - порвет как тузик грелку


Ага, порвет, хостовую систему, когда случится коллизия на шине данных. BTW, ISA 8 Mhz
esaulenka
Цитата(Tronix286 @ Dec 30 2015, 10:10) *
Ну не просто оно так, навязывание-то, а из-за более - менее вменяемого USB OTG у STM'ов.


До LPC43xx я так и не добрался, а вот в LPC17xx USB был лучше, чем ST'шный.
Хост так и вовсе стандартный, можно в сети накопать несколько реализаций.
ViKo
Использовать два порта, с одного читать, в другой записывать? Может, так проще?
Tronix286
Цитата(ViKo @ Dec 30 2015, 11:05) *
Использовать два порта, с одного читать, в другой записывать? Может, так проще?


Ну как проще.... Для стм - проще, а для шины данных все равно защелку ставить.
ViKo
Извращаясь:
Порт работает постоянно на ввод, по фронту /RD записывает IDR в память через DMA. С инкрементом или без, как надо.
В момент среза /WR в MODE по DMA из переменной в памяти записывается режим Выход. В момент фронта /WR по DMA из другой переменной в памяти записывается режим Вход. По одному из этих фронтов в ODR записываются нужные данные по DMA. С инкрементом или без.
Но гда взять столько каналов DMA?
Огурцов
Цитата(Tronix286 @ Dec 30 2015, 08:10) *
8 Mhz

и 4 такта на цикл - даже аврка справится

Цитата(ViKo @ Dec 30 2015, 09:05) *
Использовать два портаывать?

лучше 8 spi
jcxz
Цитата(Огурцов @ Dec 30 2015, 15:45) *
лучше 8 spi

Или quad-SPI в Tiva, работающий вроде как до SCLK == 60 МГц.
Или 8 сериализаторов SGPIO в LPC43xx.
Или 8 сериализаторов McASP в TI-шных OMAP и DSP.
Вобщем - использовать что-то готовое и последовательное с полным аппаратным трактом FIFO+DMA.

PS: А скорей всего для задачи ТСа есть гораздо более простое решение, но он её не озвучивает, а кругозор его ограничен одним STM32, поэтому и нагромождает колхоз...
Тут мельком прозвучали фразы "8-разрядная шина" и "USB", так может достаточно будет CY7C68013A ? sm.gif
Огурцов
я бы начал с вопроса а где вообще сегодня взять ису
kovigor
Цитата(Огурцов @ Dec 30 2015, 13:25) *
я бы начал с вопроса а где вообще сегодня взять ису

Наверное, в каких-нибудь промышленных компьютерах. Пусть разъем не тот, что был в персоналках, но реализация та же. Называется "PC/104" ...
adnega
Всем любителям DMA повторю (ибо, не раз уже обсуждали): DMA хорош для больших кусков данных, где не важны задержки, а важна средняя скорость.
Для перекидывания одного байта, но часто и с минимальными задержками DMA не подходит, т.к. от момента инициализации DMA-транзакции, до самой пересылки данных может пройти время, порядка 12 тактов.

PS. Я тоже очень сильно люблю DMA и очень часто его использую.
Огурцов
pc104 не модно, в моде бананы с линухом
=L.A.=
Цитата(Tronix286 @ Dec 29 2015, 20:57) *
Вопрос встает не тогда, когда нужно кого то там дергать, а когда тебя (микроконтроллер) дергают. А именно, когда пришел сигнал чтения /RD, перевести восемь ног из hi z в output, выдать на них байт и уйти по спаду /RD быстренько опять в hi-z. Желательно за детерминированное время, а не как получится. Потому что пару раз может получится, а третий - нет.


Вдруг пригодится. Писал в песочнице, но там благодарности не последовало sm.gif

Настройки GPIOx семейства STM32F0xx
Если сконфигурировать ногу как выход open drain и подвесить к + питания, то функционирует и опрос ноги как входа,
например: GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_1)

Это может пригодиться тем, кто хочет смастерить, к примеру, шину MicroLAN или i2c
adnega
Цитата(=L.A.= @ Dec 31 2015, 03:47) *
Вдруг пригодится...

Копаюсь сейчас в закромах - нашел МК типа 80C42C.
Идеальное аппаратное решение для 8-битного слейва, правда, далеко не STM32, но какое-то 8-битное ядро содержит (скорее всего семейства MSC-48).
jcxz
Цитата(adnega @ Jan 8 2016, 23:56) *
Идеальное аппаратное решение для 8-битного слейва, правда, далеко не STM32, но какое-то 8-битное ядро содержит (скорее всего семейства MSC-48).

Идеальное решение: CY7C68013A
khach
А какая скорость шины параллельной? Делали набор регистров на параллельной шине, а STM32 забирал по ДМА. Можно было даже FIFO-шку 7202 поставить. Все равно 3.3 вольтовую шину STM надо согласовывать с 5 вольтовой параллельной шиной.
Кстати, такое извращение часто случается при модернизации древних приборов. К сожалению 5v-tolerant FPGA не осталось в природе и приходится заниматься мазохизмом. Вот недавно эмулятор Z80 на STM32 ваяли, но там параллеьная шина была ведущей со стороны STM32, так что было проще.
C одной очень скоростной шиной реализовали прием через DCMI- там скорости вообще запредельные для старого харда.
vad74
Чем в итоге закончились поиски варианта стыковки с ISA шиной? Стоит таже задача. Может нашли более подходящий проц чем STM32?
jcxz
Цитата(vad74 @ Jul 20 2016, 14:07) *
Чем в итоге закончились поиски варианта стыковки с ISA шиной? Стоит таже задача. Может нашли более подходящий проц чем STM32?

А чем Вас не устроили рекомендованные варианты?

Цитата(Огурцов @ Dec 30 2015, 02:26) *
что будет - 200 мгц стм против 2 мгц исы - порвет как тузик грелку

Или грелка тузика порвёт biggrin.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.