В общем родил я такую стратегию:
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)
|