|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 2:04 pm
|
Страница 1 от 1
|
[ 12 мнения ] |
|
| Автор |
Съобщение |
|
bobi13
Ранг: Минаващ
Регистриран на: Сря Авг 07, 2013 1:11 am Мнения: 41
|
 SPI, DMA
Здравейте, чета от едно външно АЦП, което има SPI интерфейс, данните от SPI ги прехвурлям към вътрешния буфер чрез DMA контролер. Данните които получавам са наред, но по някаква причина се появава допълнителен клок след като съм приключил с четенето. С други думи ако съм задал че искам да чета 4 sample, на изхода виждам 80 clock вместо 64 (в прикачения файл е резултата). Tози допълнителен clock не знам как да го премахна. Контролерът ми е stm32f746. Това са настройките на SPI и DMA  |  |  |  | Код: dma_handler_rx.Instance = DMA1_Stream3; dma_handler_rx.Init.Channel = DMA_CHANNEL_0; dma_handler_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; dma_handler_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; dma_handler_rx.Init.MemBurst = DMA_MBURST_SINGLE; dma_handler_rx.Init.PeriphBurst = DMA_PBURST_SINGLE; dma_handler_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; dma_handler_rx.Init.PeriphInc = DMA_PINC_DISABLE; dma_handler_rx.Init.MemInc = DMA_MINC_ENABLE; dma_handler_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; dma_handler_rx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; dma_handler_rx.Init.Mode = DMA_NORMAL; // The DMA circular mode cannot be used when the SPI is configured in this mode: Master 2Lines RxOnly dma_handler_rx.Init.Priority = DMA_PRIORITY_HIGH;
HAL_DMA_Init(&dma_handler_rx);
// Associate the initialized DMA handle to the the SPI handle __HAL_LINKDMA(hspi, hdmarx, dma_handler_rx);
// Set DMA1 stream 3 priority. // When 2 interrupts have same preemption priority, then he one who has higher sub priority will be execute first. // If both interrupts both have same preemption priority and sub priority, the one comes first will be execute first HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 1, 1); HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn);
// Set SPI2 receive priority. // When 2 interrupts have same preemption priority, then he one who has higher sub priority will be execute first. // If both interrupts both have same preemption priority and sub priority, the one comes first will be execute first HAL_NVIC_SetPriority(SPI2_IRQn, 1, 0); HAL_NVIC_EnableIRQ(SPI2_IRQn); |  |  |  |  |
|
| Вто Окт 11, 2016 1:02 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
 Re: SPI, DMA
Така както изглежда, четеш един семпъл повече, все едно трансфера ти е за 5 вместо 4 аксеса. Обаче в тоя отрязък от кода никъде не виждам къде зареждаш броя на трансферите. Виж там да не бъркаш нещо. Ако имаш дебъгер сложи прекъсване точно преди енейбъла на ДМА-то и виж в регистъра за броя трансфери какво имаш - 5 или 4.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Вто Окт 11, 2016 1:21 pm |
|
 |
|
bobi13
Ранг: Минаващ
Регистриран на: Сря Авг 07, 2013 1:11 am Мнения: 41
|
 Re: SPI, DMA
Извинявам се, така го зареждам
|
| Вто Окт 11, 2016 1:25 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
 Re: SPI, DMA
Не съм работил с 7ма серия, като за 4та изглежда ОК кода. Да няма някава особенност в ДМА-то на 7ма серия, ама едва ли.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Вто Окт 11, 2016 1:34 pm |
|
 |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
 Re: SPI, DMA
.
|
| Вто Окт 11, 2016 1:36 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: SPI, DMA
А дали са само това? Имаш някаква структура, на която просвояваш някои полета, ами другите полета каква стойност имат? Поне виж дали декларацията е статик или ауто, ако е ауто вземи я забърши тая структура щото простотиите на ST край нямат... А най-добре дето ти каза Цецо - слагаш един брейкпоинт и гледаш как се програмира и SPI и DMA-то.
|
| Вто Окт 11, 2016 1:51 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: SPI, DMA
Сори, не погледнах добре кода... той не е и за гледане, ама това е друга тема  Значи RX-Only режима на SPI е някакво безумие. В момента в който разрешиш периферията и тя тръгва да чете и така до откат. Няма значение какви дължини слагаш на DMA-то, те си важат само за DMA-то. Съветът ми е да не ползваш подобни щуротии. Сложи си го на нормален режим, нека си праща.. ти като не му програмиш MOSI никой няма да разбере че "праща"  За пращането пускаш ДМА без MINC, така ще прати едно и също нещо колкото пъти му кажеш и ще спре.
|
| Вто Окт 11, 2016 2:22 pm |
|
 |
|
bobi13
Ранг: Минаващ
Регистриран на: Сря Авг 07, 2013 1:11 am Мнения: 41
|
 Re: SPI, DMA
Добре, ще пробвам.
|
| Вто Окт 11, 2016 2:30 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
 Re: SPI, DMA
Да Миро е прав. Единствения проблем е, че губиш един канал на DMA-то залудо, а те в СТМ-а са малко кът.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Вто Окт 11, 2016 5:39 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: SPI, DMA
Ако има проблем с ДМА-то може да види как работи пущината. От картинката се вижда, че все пак спира. Въпросът е дали спира щото изключва SPI-a или той спира сам да изчака да му изпразниш DR-a. Ако е второто може да мине без пращане, само трябва да си пуска ДМА-то с един трансфер по-малко, а последните данни да си ги чете ръчно след като изчака да дойдат и спре животното. И друго дето се вижда от картинката - много криви сигнали... Не знам с какво е снимано и доколко е истина, ама сякаш трябва да се намали силата на драйверите или някаква серийна терминация, че така изглежда като радио Хоризонт 
|
| Сря Окт 12, 2016 9:06 am |
|
 |
|
bobi13
Ранг: Минаващ
Регистриран на: Сря Авг 07, 2013 1:11 am Мнения: 41
|
 Re: SPI, DMA
От осцилоскопа е. Сложих SPI в режим Rx/Tx и всичко се оправи. Все още ми е интересно къде е проблема, в хардуера или в самата библиотека. Благодаря за помощта.
|
| Чет Окт 13, 2016 12:31 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: SPI, DMA
Нямаш проблем, просто така си работи в RX only режим - още като го конфигурираш и тръгва автоматично и така докато може... Не е ясно само дали изкава да опразниш получените данни или не. Ако изчаква както казах по-горе, пускаш един трансфер по-малко и докато чака го спираш. Иначе в движение няма как да го спреш точно след определен брой трансфер, трябва да налучкваш времена и да играеш тото...
|
| Чет Окт 13, 2016 12:53 pm |
|
|
|
Страница 1 от 1
|
[ 12 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 6 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|