Danis 0 28 октября, 2010 Опубликовано 28 октября, 2010 (изменено) · Жалоба Привет уважаемые форумчане. Вот такая задача перед мной. Имеется некое ведомое SPI устройство, со своим протоколом, подключено к STM32F. Неудобство в том, что нужно обеспечить сигнал LE, на N-ном клоке DCLK. Аппаратной возможности у SPI STM32F по моему нет. Частота SPI 4 MHz. Все что в голову приходи сейчас – задействовать таймер/счетчик и считать импульсы DCLK через внешний пин таймера, потом при достижении счетчика генерить прерывание и программно устанавливать LE. Хочу услышат Ваши предложения, может что получше придумать можно? И если есть у кого пример использования таймера подобным образом (счет импульсов на пине), дайте примерчик пожалуйста, буду очень благодарен. Изменено 28 октября, 2010 пользователем Danis Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Petr_I 0 28 октября, 2010 Опубликовано 28 октября, 2010 · Жалоба Какова временная зависимость LE и DCLK? Если LE асинхронный - то можно дергать программно и без всяких счетчиков (SPI тоже прерывания генерить умеет). А если синхронный (жестко привязан к фронтам DCLK) - то надо доп. схемку городить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Danis 0 28 октября, 2010 Опубликовано 28 октября, 2010 · Жалоба Какова временная зависимость LE и DCLK? обведена красными кружками, там не много свободы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 28 октября, 2010 Опубликовано 28 октября, 2010 · Жалоба Если по прерыванию от считающего CLK таймера удастся вовремя сгенерировать LE, то это довольно медленный SPI получается. В таком случае, на мой взгляд, софтовый SPI с генерацией LE когда нужно — может оказаться проще и даже быстрее будет прогружать регистр. p.s. что-то в духе MBI5039? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Danis 0 28 октября, 2010 Опубликовано 28 октября, 2010 (изменено) · Жалоба p.s. что-то в духе MBI5039? Почти в точку!, - MBI5030 Изменено 29 октября, 2010 пользователем Danis Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 28 октября, 2010 Опубликовано 28 октября, 2010 · Жалоба Ишшо один p.s. — поизучайте времянки апаратного выхода NSS контроллера SPI и попробуйте фокус с подачей этого NSS на вход запуска таймера, который будет генерировать импульс нужной длины и на нужном расстоянии от спада NSS (One-pulse mode). Может весьма недурственно получиться — и скорость SPI высокая, и строб формируется аппаратно когда нужно. . . . . . . . . . да, вроде бы должно получиться. У этих STM32 такие таймера... на них можно такое засобчачить, что ни одной ксюше не снилось. (все имена вымышленные, все совпадения случайные) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Danis 0 3 ноября, 2010 Опубликовано 3 ноября, 2010 (изменено) · Жалоба Ишшо один p.s. — поизучайте времянки апаратного выхода NSS контроллера SPI и попробуйте фокус с подачей этого NSS на вход запуска таймера..... . . . . . . . . . да, вроде бы должно получиться. У этих STM32 такие таймера... на них можно такое засобчачить, что ни одной ксюше не снилось. Конечно кривенько, но реализовал. От аппаратной ноги NSS плясать не получилось (и не получиться), ею управляю программно, перед передачей данных по SPI ее низ устанавливаю. К этой ноге подключаю аппаратный пин таймера T4 который по спаду внешнего сигнала генерит одиночный импульс на другой аппаратной ноге (применил режим One-pulse mode) заданной длинны и с заданной начальной задержкой. Так что, можно сказать все , решилось. Был бы NSS аппаратный, я б вообще счастлив был! Если кому нужны исходники, могу скинуть… Изменено 3 ноября, 2010 пользователем Danis Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 17 апреля, 2012 Опубликовано 17 апреля, 2012 · Жалоба Помогите разобратся с SPI1 в STM32L151. После того как включаю SPI битом SPE , сбрасывается бит мастера MSTR. Понимаю что какой-то конфликт сигналов, но не понимаю где. На картинке ниже нарисовано , что Alternative Functiun 5 порта это одновременно SPI1 и SPI1 . Но как при этом два SPI смогут не конфликтовать, если мне надо включить оба на разных портах ? GPIOA->MODER &= ~GPIO_MODER_MODER5; GPIOA->MODER |= GPIO_MODER_MODER5_1; GPIOA->MODER &= ~GPIO_MODER_MODER6; GPIOA->MODER |= GPIO_MODER_MODER6_1; GPIOA->MODER &= ~GPIO_MODER_MODER7; GPIOA->MODER |= GPIO_MODER_MODER7_1; //Выбираем на пинах 5 6 7 альтернативную функцию GPIOA->AFR[0]|=(5<<20); GPIOA->AFR[0]|=(5<<24); GPIOA->AFR[0]|=(5<<28); // Выбираем на пинах 5 6 7альтернативную функцию 5 SPI1->CR1|=SPI_CR1_MSTR; // мастер SPI1->CR1|=SPI_CR1_SPE; //включаем SPI //// тут бит MSTR сбрасывается сам Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 17 апреля, 2012 Опубликовано 17 апреля, 2012 · Жалоба Помогите разобратся с SPI1 в STM32L151. После того как включаю SPI битом SPE , сбрасывается бит мастера MSTR. Если бы это был АВР, то можно было бы заключить что SS сконфигурён на вход. Но тут наверное всё по другому. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lead_seller 0 18 апреля, 2012 Опубликовано 18 апреля, 2012 · Жалоба Проверьте настройки аппаратной ноги NSS. Для мастера аппаратное управление ногой NSS должно быть либо выключено ( и тогда NSS управляем програмно), либо NSS должно быть сконфигурировано как выход. Сейчас это похоже на то, что у вас NSS настроен на вход и на нем висит "0". Раздача портов ВВ под периферию управляется двумя механизмами - включением тактирования периферии в RCC (например, если на одних ногах в режиме AF висят SPI1 и SPI2, включаем тактирование SPI1 и не включаем SPI2 - никакого конфликта нет, или включаем тактирование обоих SPI но для одного из них применяем Remap, и этот модуль подключается к другому порту ВВ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 10 мая, 2012 Опубликовано 10 мая, 2012 · Жалоба Вопрос : Работаю с SPI в STM32L151, SPI настроен как мастер Отправляю что-то вот таким кодом. Так вот , если небольшая задержка в цикле есть, то всё хорошо. А если её нет, то процессор перезагружается . Интересно , почему ? Прерывания об ошибке ERRIE не происходит. while(1) { while(!(SPI1->SR & SPI_SR_TXE)){} SPI1->DR=data; while(!(SPI1->SR & SPI_SR_RXNE)){} for(k=0;k<1;k++){} //без этой задержки процессор почему-то перезагружается data=SPI1->DR; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться