Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SPI с аппаратныи NSS
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
amiller
Возникла проблема:
Есть плата с контроллером STM32F437ZGT6. На этой же плате находятся два цапа DAC8581 с интерфейсом SPI, на которые нужно слать 16-битные данные с частотой примерно 2,3МГц. Каждый ЦАП подключен к своему каналу SPI, данные загружаются в SPI посредством DMA.
Чтобы ЦАП принимал данные, в начале каждого сеанса связи ему нужно дергать ногой /CS.
Соответственно, исходя из скорости обмена, это нужно делать аппаратно.
Но выяснилось, что в режиме мастера SPI дергает этой ногой только один раз, а потом держит этот вывод в активном состоянии до отключения интерфейса.
И единственный режим, когда SPI правильно дергает ногой NSS, - это так называемый TI mode. Но есть одна проблема - в этом режиме невозможно изменить полярность и фазу тактовых импульсов.
И оказалось, что несмотря на то, что режим называется TI mode, полярность импульсов у него строго противоположна полярности импульсов, требуемых ЦАПу, который родом из Техаса.
Тактовая частота интерфейса установлена 42МГц, т.е. близка к максимально возможной.
Если тактовые импульсы чуть задержать, например с помощью конденсатора, то интерфейс работает нормально. Но такое решение является нестабильным и температурно-зависимым, так как работа интерфейса зависит от скорости нарастания двух фронтов, данных и тактов.
Если инвертировать сигнал SCK с помощью внешнего быстрого логического инвертора, то интерфейс работает нормально на этой частоте.
Нажмите для просмотра прикрепленного файлаНажмите для просмотра прикрепленного файла
Вопросы: Есть ли какой нибудь способ обойтись без внешнего инвертора? Может быть я чего то недопонял в настройках интерфейса? Есть у кого положительный опыт аппаратного управления NSS?
scifi
Цитата(amiller @ Jun 1 2016, 09:38) *
Вопросы: Есть ли какой нибудь способ обойтись без внешнего инвертора?

Конечно. Формировать сигнал CS таймером.
amiller
Цитата(scifi @ Jun 1 2016, 10:43) *
Конечно. Формировать сигнал CS таймером.

Вот блин, слона то я и не приметил. А так как синхронизация DMA идёт также от таймера, то попасть в нужный момент времени может оказаться вполне реальным. И даже на одну из разведенных ног CS можно замапить выход таймера, а на вторую придётся перемычку пробросить. Но это всё равно проще инвертора.
Правда есть одно сомнение: В этом кристалле каналы DMA довольно активно используются. Если произойдёт задержка, то можно не попасть таймером в нужный момент времени. Нужно уложиться в допуск 25 нсек примерно. Вероятно получится, что то мне подсказывает, что DMA занимает шину гораздо меньше времени.
А программно точно не получится?
P.S.: Если наплевать на TI mode, то жестких временных интервалов и нет. Можно выставлять CS одновременно с евентом для DMA, а снимать с некоторым запасом на все возможные задержки. Вполне живой вариант.
Спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.