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

 
 
> STM32F2xx - как покрасивее считывать внешнее АЦП черз SPI, с DMA и желательно в автомате
Сергей Борщ
сообщение May 8 2012, 09:29
Сообщение #1


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Есть внешнее 16-битное АЦП с выходом SPI (конкретно LTC2383). Я выходом capture таймера генерю ему сигнал "начать преобразование". В ответ оно выставляет сигнал BUSY. После преобразования оно снимает сигнал BUSY и готово отдать мне 16 бит по SPI. Так вот вопрос - а можно ли, используя периферию STM32F2xx, сделать так, чтобы по этому сигналу BUSY автоматом, т.е. без участия программы, активизировался обмен по SPI? Из SPI данные будут забираться через DMA. Читал документацию, но ничего лучше чем "повесить BUSY на вход внешнего прерывания и в обработчике кидать фиктивный байт в SPI" пока не придумал. АЦП шустрое, не хотелось бы скакать в прерывание после каждого преобразования. Есть еще одна идея, но не буду ее пока излагать чтобы не ограничивать полет фантазии. Что можно намутить более хитрого?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение May 16 2012, 19:23
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



В общем родил я такую стратегию:

TIM4_CH1 формирует короткие положительные импульсы запуска АЦП (CNV). Сигнал READY АЦП завел на TIM3_CH2. Канал №2 захвата/сравнения таймера 3 настраиваю на захват, спадающий фронт. TS таймера 3 настраиваю на TI2FP, Slave mode = Trigger, ARR = 35 (32 такта на выдачу 16 импульсов, 3 такта задержка модуля сравнения), OPM = 1. Канал №1 настраиваю в режим PWM2, он выдает импульс OC1REF длительностью 32 такта, этот канал делаю выходом TRGO. У таймера 2 настраиваю TS на ITR2 (TIM3_TRGO), Slave mode = Gated, ARR=1, Канал №3 захвата/сравнения настраиваю в режим PWM2, TIM2_CCR3 = 1, его выход внешней перемычкой завожу на вход SLK АЦП и на SPI3_SCK. Выход данных АЦП завожу на SPI3_MOSI. SPI3 настраиваю в режим SLAVE, RX_ONLY, DFF=1 (16бит).

Как я вижу работу этого клубка: По спадающему фронту сигнала BUSY на TIM2_CH2 запускается TIM3, который формирует одиночный импульс OC1REF длительностью 32 такта. Во время этого импульса разрешается работа TIM2, который успевает сформировать 16 импульсов на выходе TIM2_CH3. Эти импульсы тактируют SPI, из АЦП "высасываются 16 бит. После приема 16 бит инициируется транзакция DMA. После приема нужного количества отсчетов по прерыванию окончания пересылки DMA отключаю TIM4_CH1, преобразования прекращаются.

Что скажут специалисты, подводные камни есть?

P.S. можно было, наверное, обойтись без внешней перемычки, но мне было удобно по разводке подключаться именно к этим ногам.

Кстати, на будущее, такой вопрос - по картинке из даташита входы периферии подключены к портам всегда. Я правильно понимаю, что настроив SPI в режим slave я могу переключив GPIO_AFR порта SCK на другую периферию (скажем, таймер) формировать этой периферией на ножке сигналы и эти сигналы будут поступать на SCK? Ан нет - он же должен выбрать, с какой из ног, на которых возможно включение SCK, принимать этот сигнал. Значит и входы подключены только когда выбрана AF. Значит без внешней перемычки никак.
Хм. А почему тогда есть AF push-pull и AF open drain, но нет AF input?
Добавлено: разобрался - "The output buffer is driven by the signal coming from the peripheral (transmitter enable and data)". Т.е. направление определяется режимом периферии.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SBE
сообщение May 17 2012, 13:50
Сообщение #3


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

Группа: Участник
Сообщений: 108
Регистрация: 8-09-05
Пользователь №: 8 384



Цитата(Сергей Борщ @ May 16 2012, 23:23) *
В общем родил я такую стратегию:

Проблема имет место быть. Встроенные АЦП обычно имеют сложные автоматы сбора, но ограниченное качество и разрядность. А с внешними появляются проблемы с сканированием и доставкой данных в МК без участия ЦПУ. Бывало ставил CPLD для этих целей.

Как-то сложно у тебя выглядит, не хватило духу разобраться. SPI в slave и в МК и в АЦП, с клоком от таймера? Круть.

На поверхностный взгляд по спаду BUSY можно сгенерировать событие триггера таймера с вывода внешнего триггера TIM _ETR или захвата TIM_CH1 для запроса к DMA, а этим DMA пулять в SPI на выход. SPI в STM32 позволяет иметь 16 битный фрейм, поэтому одного запроса к DMA для записи в Tx SPI достаточно, чтобы вытащить слово из АЦП (естественно другим каналом DMA на Rx).
Предположительно по внешнему перепаду можно заставить один таймер STM32 на автомате выдать 5 или даже 6 запросов на DMA через задаваемые разные интервалы. Хотел попробовать, но руки не доходят и лень.

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 22 2012, 17:28
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (SBE @ May 17 2012, 16:50) *
На поверхностный взгляд по спаду BUSY можно сгенерировать событие триггера таймера с вывода внешнего триггера TIM _ETR или захвата TIM_CH1 для запроса к DMA, а этим DMA пулять в SPI на выход.
Правильно ли я понимаю, что по захвату DMA может пульнуть байты никак не связанные с таймером? Как-то мутно у них в документации написано:
QUOTE
After an event, the peripheral sends a request signal to the DMA controller. The DMA
controller serves the request depending on the channel priorities. As soon as the DMA
controller accesses the peripheral, an Acknowledge signal is sent to the peripheral by the
DMA controller. The peripheral releases its request as soon as it gets the Acknowledge
signal from the DMA controller. Once the request has been deasserted by the peripheral
Вот и пойми их - в выделенных местах имеется ввиду одна и та же периферия, т.е. в данном случае - таймер, или разные?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Сергей Борщ   STM32F2xx - как покрасивее считывать внешнее АЦП черз SPI   May 8 2012, 09:29
- - AHTOXA   Для чтения SPI всяко надо два канала DMA - один дл...   May 8 2012, 11:46
- - _pv   sclk постоянно выдавать тоже с таймера, spi в слэй...   May 8 2012, 11:46
- - -JonnS-   Скрещивал STM32discovery с ADS8361 (20бит слово). ...   May 8 2012, 18:31
- - Vladimir_T   Я сделал так. Сигнал окончания преобразования DRDY...   May 11 2012, 10:24
|- - Сергей Борщ   QUOTE (Vladimir_T @ May 11 2012, 13:24) Т...   May 11 2012, 10:32
- - Vladimir_T   По приему всего блока данных DMA, может сгенерить ...   May 11 2012, 10:48
- - inventor   че та я не понимаю. у меня например ацп - ads1210 ...   May 11 2012, 12:15
- - Сергей Борщ   QUOTE (Vladimir_T @ May 11 2012, 13:48) П...   May 11 2012, 14:41
|- - Vladimir_T   Цитата(Сергей Борщ @ May 11 2012, 18:41) ...   May 12 2012, 03:47
|- - MrYuran   Цитата(Сергей Борщ @ May 11 2012, 18:41) ...   May 12 2012, 05:31
|- - Tolyaha   Цитата(Сергей Борщ @ May 11 2012, 17:41) ...   May 23 2012, 08:47
- - khach   Для запуска DMA для вычитки данных из внешеного АЦ...   May 12 2012, 10:50
|- - jcxz   Что-то у вас на одну задачу куча таймеров тратится...   May 17 2012, 02:37
|- - SBE   Цитата(Сергей Борщ @ May 22 2012, 21:28) ...   May 23 2012, 09:32
- - Сергей Борщ   Спасибо всем - да, до AN2548 я не добрался. Посмот...   May 23 2012, 09:55


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

 


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


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