Перейти к содержанию
    

Есть такая известная проблема у STM32 (в частности F4 и F7), что не умеет модуль SPI работать с NSS сигналом. Мне нужно опрашивать AS5047 по SPI, для этого надо два раза отправить фрейм длиной 16 бит с паузой и поднятием уровня на NSS. В системе есть приоритетное прерывание, которое срабатывает с частотой 20-30 кГц а его обработка может длиться до 30 мкс. Поэтому, переключать NSS через GPIO по таймеру плохой вариант. Нужно один раз за период настраивать передачу по SPI и забирать предыдущие данные а пока идёт работа в приоритетном прерывании пусть SPI как-то работает независимо. DMA я бы задействовал, это понятно, но, что делать с NSS? Настраивать таймер на выдачу ШИМ подходящей формы, но как его гарантированно синхронно запустить вместе с SPI?

 

|=========================================-------|---------------
|                                         |      |
irq0                                  irq0_end   irq0 ...
       SPI_frame1 -- SPI_frame2 -----------|
                                           SPI poll

 

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

25 минут назад, amaora сказал:

DMA я бы задействовал, это понятно, но, что делать с NSS? Настраивать таймер на выдачу ШИМ подходящей формы, но как его гарантированно синхронно запустить вместе с SPI?

CS - формировать таймером или ШИМ; 2 передачи по SPI стартовать с помощью двух событий от того же таймера (или же от одного-двух других таймеров, но работающих с таким же периодом, как у первого таймера) - пинать ими один или два канала DMA, которые будут делать пересылку память->регистр_данных_SPI.

Запустить синхронно два-три таймера (если нет аппаратной поддержки такой функции) - наверное не получится, но так вам и не надо прям синхронно до такта. Достаточно: запретить прерывания; инструкция барьера; две-три записи, одна за другой, в регистры управления таймерами, запускающие эти таймеры. Несинхронность таймеров будет в пределах нескольких тактов. Таймеры лучше выбрать сидящие на одной и той же APB.

Но, как писал выше: если использовать таймер, имеющий не менее 3-х регистров CCR, то можно обойтись одним этим таймером. И тогда вообще не будет существовать проблема с несинхронностью 3-х таймеров. Формирователь CS-сигнала - на одном CCR, пинание DMA - на двух других. Период - общий (равный частоте вашего прерывания irq0). А лучше (если irq0 формируется таймером) - на тот же таймер все эти функции и повесить. Таймер с несколькими CCR.

События пинаний двух каналов DMA нужно разнести с запасом - для компенсации джиттера, вызываемого задержками доступа DMA к шине памяти. DMA-каналы нужно использовать с буферизацией (режим DIRECT должен быть выключен) - для минимизации этого джиттера.

 

PS: Ничего сложного нет. В одном проекте у меня как раз так всё и работает. Правда на LPC1758. Но у него похожие проблемы по аппаратному формированию CS.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

47 минут назад, jcxz сказал:

Запустить синхронно два-три таймера (если нет аппаратной поддержки такой функции) - наверное не получится...

В STM32 таймеры можно объединять в цепочки, где один таймер будет управлять поведением другого (подчиненного): сбросом, счетом, запуском. Вот это тоже можно использовать при желании.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, Arlleex сказал:

В STM32 таймеры можно объединять в цепочки, где один таймер будет управлять поведением другого (подчиненного)

Это понятно. Но думаю - это не нужно в задаче ТС. При программном совместном запуске, несинхронность будет несущественная для задачи ТС - около 2-3 тактов (если конечно частота шина APB таймеров не сильно просажена относительно частоты CPU). Она будет совершенно незаметна на фоне несинхронности (джиттера), вызываемой задержками доступа каналов DMA к шине. Там болтанка будет больше.

А лучше вообще для всего использовать один из таймеров, в которых 4 CCR. Тогда от него единственного можно все события сформировать (в том числе и irq0). Но надо смотреть - можно ли им генерить события для разных каналов DMA? Если нет - придётся использовать разные таймеры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, amaora сказал:

Есть такая известная проблема у STM32 (в частности F4 и F7), что не умеет модуль SPI работать с NSS сигналом.

Какая проблема? Перечитал errata, ничего про NSS не нашел. STM32 умеет дергать NSS на каждую посылку и умеет посылки по 16 бит, как раз то, что вам и нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, Сергей Борщ сказал:

STM32 умеет дергать NSS на каждую посылку...

о_О

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, EdgeAligned сказал:

TI-режим SPI. Только по времянкам не совпадет с тем, как надо

В обычном режиме тоже:
image.thumb.png.e50368d2f09c541b984051d958e8c395.png

Это ли не то, что нужно автору темы?

 

Вот если нужно N байтов "обрамить" - тогда да, только врукопашную.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Оно то оно, только не работает CS аппаратно. Всегда GPIO-шкой настраивали да рулили.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, Arlleex сказал:

Всегда GPIO-шкой настраивали да рулили.

Это если больше 2 байтов в посылке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

CS аппаратно РАБОТАЕТ 🙂 просто чтобы он заработал, нужно включать-выключать модуль SPI.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

45 минут назад, Сергей Борщ сказал:

Это если больше 2 байтов в посылке.

Если Вы имеете в виду вот это

32 минуты назад, EdgeAligned сказал:

просто чтобы он заработал, нужно включать-выключать модуль SPI.

то это очень кривой способ, как по мне. Случайно выуженная опытным путем "особенность" в виде ухода CS вверх при выключении SPI - просто капля меда в бочку дегтя, под названием "SPI в STM32". Управление включением/выключением SPI-блока не дает ровно никаких преимуществ по сравнению с дерганием CS через регистры GPIO в данном случае. Единственное, когда запущена транзакция и в регистре управления снимается бит включения SPI, транзакция аппаратно завершится (не прервется). Вот только выключенный SPI вряд ли сформирует флажки прерываний/запросы на DMA об окончании транзакции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, amaora said:

приоритетное прерывание, которое срабатывает с частотой 20-30 кГц а его обработка может длиться до 30 мкс

Выходит на частоте 30кгц период прерывания аж 33.3мкс, на остальную работу остается буквально нищие 3.3 мкс. Т.е. проц находится в прерывании аж 90% :shok:

Это что ж за прерывание такое, что оно делает ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Arlleex сказал:

Если Вы имеете в виду вот это

Нет, я имел ввиду то, что показано на картинке в документации. В errata отклонений от этой картинки не описано, значит должно работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, Forger сказал:

Это что ж за прерывание такое, что оно делает ?

А что Вас так сильно удивляет?)) Вполне нормальное явление у тех, кто электроприводом и преобразователями занимается (на самом деле - не только).
 

2 минуты назад, Сергей Борщ сказал:

В errata отклонений от этой картинки не описано, значит должно работать.

А Вы пробовали?:smile: Этот баг, ведь, лет 10 минимум находится в разряде классических перлов STM32...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...