amaora 25 1 октября, 2023 Опубликовано 1 октября, 2023 · Жалоба Есть такая известная проблема у 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 Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 1 октября, 2023 Опубликовано 1 октября, 2023 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 1 октября, 2023 Опубликовано 1 октября, 2023 · Жалоба 47 минут назад, jcxz сказал: Запустить синхронно два-три таймера (если нет аппаратной поддержки такой функции) - наверное не получится... В STM32 таймеры можно объединять в цепочки, где один таймер будет управлять поведением другого (подчиненного): сбросом, счетом, запуском. Вот это тоже можно использовать при желании. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 1 октября, 2023 Опубликовано 1 октября, 2023 · Жалоба 13 минут назад, Arlleex сказал: В STM32 таймеры можно объединять в цепочки, где один таймер будет управлять поведением другого (подчиненного) Это понятно. Но думаю - это не нужно в задаче ТС. При программном совместном запуске, несинхронность будет несущественная для задачи ТС - около 2-3 тактов (если конечно частота шина APB таймеров не сильно просажена относительно частоты CPU). Она будет совершенно незаметна на фоне несинхронности (джиттера), вызываемой задержками доступа каналов DMA к шине. Там болтанка будет больше. А лучше вообще для всего использовать один из таймеров, в которых 4 CCR. Тогда от него единственного можно все события сформировать (в том числе и irq0). Но надо смотреть - можно ли им генерить события для разных каналов DMA? Если нет - придётся использовать разные таймеры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 1 октября, 2023 Опубликовано 1 октября, 2023 · Жалоба 1 час назад, amaora сказал: Есть такая известная проблема у STM32 (в частности F4 и F7), что не умеет модуль SPI работать с NSS сигналом. Какая проблема? Перечитал errata, ничего про NSS не нашел. STM32 умеет дергать NSS на каждую посылку и умеет посылки по 16 бит, как раз то, что вам и нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 1 октября, 2023 Опубликовано 1 октября, 2023 · Жалоба 2 минуты назад, Сергей Борщ сказал: STM32 умеет дергать NSS на каждую посылку... о_О Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 1 октября, 2023 Опубликовано 1 октября, 2023 · Жалоба TI-режим SPI. Только по времянкам не совпадет с тем, как надо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 1 октября, 2023 Опубликовано 1 октября, 2023 · Жалоба 12 минут назад, EdgeAligned сказал: TI-режим SPI. Только по времянкам не совпадет с тем, как надо В обычном режиме тоже: Это ли не то, что нужно автору темы? Вот если нужно N байтов "обрамить" - тогда да, только врукопашную. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 1 октября, 2023 Опубликовано 1 октября, 2023 · Жалоба Оно то оно, только не работает CS аппаратно. Всегда GPIO-шкой настраивали да рулили. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 1 октября, 2023 Опубликовано 1 октября, 2023 · Жалоба 5 минут назад, Arlleex сказал: Всегда GPIO-шкой настраивали да рулили. Это если больше 2 байтов в посылке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 1 октября, 2023 Опубликовано 1 октября, 2023 · Жалоба CS аппаратно РАБОТАЕТ 🙂 просто чтобы он заработал, нужно включать-выключать модуль SPI. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 1 октября, 2023 Опубликовано 1 октября, 2023 · Жалоба 45 минут назад, Сергей Борщ сказал: Это если больше 2 байтов в посылке. Если Вы имеете в виду вот это 32 минуты назад, EdgeAligned сказал: просто чтобы он заработал, нужно включать-выключать модуль SPI. то это очень кривой способ, как по мне. Случайно выуженная опытным путем "особенность" в виде ухода CS вверх при выключении SPI - просто капля меда в бочку дегтя, под названием "SPI в STM32". Управление включением/выключением SPI-блока не дает ровно никаких преимуществ по сравнению с дерганием CS через регистры GPIO в данном случае. Единственное, когда запущена транзакция и в регистре управления снимается бит включения SPI, транзакция аппаратно завершится (не прервется). Вот только выключенный SPI вряд ли сформирует флажки прерываний/запросы на DMA об окончании транзакции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 1 октября, 2023 Опубликовано 1 октября, 2023 · Жалоба 2 hours ago, amaora said: приоритетное прерывание, которое срабатывает с частотой 20-30 кГц а его обработка может длиться до 30 мкс Выходит на частоте 30кгц период прерывания аж 33.3мкс, на остальную работу остается буквально нищие 3.3 мкс. Т.е. проц находится в прерывании аж 90% Это что ж за прерывание такое, что оно делает ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 1 октября, 2023 Опубликовано 1 октября, 2023 · Жалоба 1 минуту назад, Arlleex сказал: Если Вы имеете в виду вот это Нет, я имел ввиду то, что показано на картинке в документации. В errata отклонений от этой картинки не описано, значит должно работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 1 октября, 2023 Опубликовано 1 октября, 2023 · Жалоба 6 минут назад, Forger сказал: Это что ж за прерывание такое, что оно делает ? А что Вас так сильно удивляет?)) Вполне нормальное явление у тех, кто электроприводом и преобразователями занимается (на самом деле - не только). 2 минуты назад, Сергей Борщ сказал: В errata отклонений от этой картинки не описано, значит должно работать. А Вы пробовали? Этот баг, ведь, лет 10 минимум находится в разряде классических перлов STM32... 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться