Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F4. Как правильно использовать FSMC?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
TolikG
Использую интерфейс внешней памяти для формирования сигналов выбора периферийных устройств подключенных к шине SPI. Сигналы формирует ПЛИС, а через FSMC засылается адрес устройства. Дешифратор адреса - комбинаторная схема, задержек практически не вносит. Псевдокод обращения к устройству по шине SPI:

*(uint16_t *)(SPI_CS_CONTROL) = 0x20; // запись адреса устройства в ПЛИС через FSMC
GPIOI->BSRRH |= GPIO_Pin_0 ; // устанавливаю чипселект в 0
mySPI_Write(data); // выдаю байт в шину SPI
....

Проверяю осциллографом сигналы на входах периферийного устройства. Иногда происходят сбои - синхроимпульсы появляются раньше чем установится низкий уровень чипселект.
Значит шина SPI начала выдачу данных, а FSMC еще не выдала адрес в дешифратор.
Подскажите как убедиться что FSMC отработала команду?
scifi
Там вроде бы есть FIFO. У банков 2, 3, 4 есть регистр, показывающий состояние FIFO - FSMC_SR.
sadat
Попробуйте "волшебные заклинания":
*(__IO uint16_t *)(SPI_CS_CONTROL) = 0x20; // запись адреса устройства в ПЛИС через FSMC
__DSB(); __ISB();__DMB();
GPIOI->BSRRH |= GPIO_Pin_0 ; // устанавливаю чипселект в 0
mySPI_Write(data); // выдаю байт в шину SPI

Если поможет, что-то одно выкинуть.... ;-)
scifi
Цитата(sadat @ Oct 14 2014, 13:44) *
Попробуйте "волшебные заклинания":

Если уж начинать плясать с бубном, то можно просто вставить задержку.
Но про volatile верно подмечено, оно там должно быть для порядка. Но скорее всего дело не в этом.
sadat
Осталось подождать ответа TolikG, помогли ему наши советы или нет ....
А задержка такая "вещь", что вот сейчас поставил - работает нормально, а затем начинаешь оптимизировать по скорости (через н-ное время) - "а зачем это здесь delay.... Удалить!" ;-)
TolikG
Цитата(sadat @ Oct 14 2014, 13:51) *
Осталось подождать ответа TolikG, помогли ему наши советы или нет ....
А задержка такая "вещь", что вот сейчас поставил - работает нормально, а затем начинаешь оптимизировать по скорости (через н-ное время) - "а зачем это здесь delay.... Удалить!" ;-)

Пока интернет висел - добавил строчку чтения из FSMC:
ret_val = *(uint16_t *)(SPI_CS_CONTROL);
После установки чипселект SPI начинает передавать через 4 микросекунды.
Сейчас попробую Ваши предложения.


Цитата(scifi @ Oct 14 2014, 09:43) *
Там вроде бы есть FIFO. У банков 2, 3, 4 есть регистр, показывающий состояние FIFO - FSMC_SR.

У меня используется 1-й банк

[quote name='sadat' date='Oct 14 2014, 12:44' post='1285192']
Попробуйте "волшебные заклинания":

Волшебные заклинания не работают - все без изменений


khach
SPI в мультимастер мод,
NSS output disabled (SSM = 0, SSOE = 0)
This configuration allows multimaster capability
NSS формировтаь в FPGA после того, как FSMC все пропишет. Иначе гонки на шинах с непредсказуемым результатом. Только с этим мультимастером проблемы были- не на всех ревизиях работало.
Ну или вообще старый костыль- оба устройства слейвы, а клок формирует FPGA. Учесть правильную полярность клока для приемника и передатчика.
Можно с FPGA дернуть триггер DMA, который прогрузит SPI и запустит передачу.
Короче, все с костылями, т.к задержки цикла на FSMC зависят от настройки FSMC, в том числе и других банков, а не только банка FPGA.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.