реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> SPI с аппаратныи NSS
amiller
сообщение Jun 1 2016, 06:38
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612



Возникла проблема:
Есть плата с контроллером STM32F437ZGT6. На этой же плате находятся два цапа DAC8581 с интерфейсом SPI, на которые нужно слать 16-битные данные с частотой примерно 2,3МГц. Каждый ЦАП подключен к своему каналу SPI, данные загружаются в SPI посредством DMA.
Чтобы ЦАП принимал данные, в начале каждого сеанса связи ему нужно дергать ногой /CS.
Соответственно, исходя из скорости обмена, это нужно делать аппаратно.
Но выяснилось, что в режиме мастера SPI дергает этой ногой только один раз, а потом держит этот вывод в активном состоянии до отключения интерфейса.
И единственный режим, когда SPI правильно дергает ногой NSS, - это так называемый TI mode. Но есть одна проблема - в этом режиме невозможно изменить полярность и фазу тактовых импульсов.
И оказалось, что несмотря на то, что режим называется TI mode, полярность импульсов у него строго противоположна полярности импульсов, требуемых ЦАПу, который родом из Техаса.
Тактовая частота интерфейса установлена 42МГц, т.е. близка к максимально возможной.
Если тактовые импульсы чуть задержать, например с помощью конденсатора, то интерфейс работает нормально. Но такое решение является нестабильным и температурно-зависимым, так как работа интерфейса зависит от скорости нарастания двух фронтов, данных и тактов.
Если инвертировать сигнал SCK с помощью внешнего быстрого логического инвертора, то интерфейс работает нормально на этой частоте.
Прикрепленное изображение
Прикрепленное изображение

Вопросы: Есть ли какой нибудь способ обойтись без внешнего инвертора? Может быть я чего то недопонял в настройках интерфейса? Есть у кого положительный опыт аппаратного управления NSS?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 1 2016, 06:43
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(amiller @ Jun 1 2016, 09:38) *
Вопросы: Есть ли какой нибудь способ обойтись без внешнего инвертора?

Конечно. Формировать сигнал CS таймером.
Go to the top of the page
 
+Quote Post
amiller
сообщение Jun 1 2016, 06:59
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612



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

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

Сообщение отредактировал amiller - Jun 1 2016, 07:05
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 11:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01431 секунд с 7
ELECTRONIX ©2004-2016