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

 
 
> Использование DMA для SPI в STM32F10x, Переполнение - прием не успевает?
KnightIgor
сообщение Sep 13 2013, 11:52
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Может кто сталкивался.

SPI передает и принимает с использованием DMA.
Очевидно, что для приема надо передавать хоть что-то (суть SPI), что я делаю с помощью двух каналов DMA:
- каналы приема (RX) и передачи (TX) взводятся, при этом в оба загружаются, естественно, одинаковые счетчики.
- толкается DMA TX.
- ожидается завершение DMA RX.

Так вот, иногда (не воспроизводимо и спорадически) из цикла ожидания можно и не выйти, а если прервать, то наблюдается следующее состояние:
- канал TX выплюнул всё (его счетчик 0).
- канал RX еще ждет, т.к. его счетчик равен 1,
- в SPI установлен бит переполнения по приему.

Из этого я делаю вывод, что приемный DMA в какой-то момент не успел выбрать байт из RX, а очередная передача успела напихать ему следующий байт. Я предполагал такую ситуацию, почему и повысил приоритет приемного канала (в экспериментах - даже до максимально возможного) относительно передающего, но спорадически зависание-таки имеет место.

Частота процессора: от 24 до 48MHz (переключаю выше, когда подсоединяется USB), частота SPI1 12MHz или 24MHz соответственно. SPI работает с SPI flash, которая может от 25MHz и выше.

Есть идеи?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
prottoss
сообщение Sep 13 2013, 14:48
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



А на какой частоте работает ДМА выясняли?



--------------------
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Sep 13 2013, 21:57
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(prottoss @ Sep 13 2013, 15:48) *
А на какой частоте работает ДМА выясняли?

Я ее не мерял, но судя по схеме в документации (стр. 90 Doc ID 13902 Rev 12 для STM32F10x) они тактируются частотой AHB, то есть ядра. В моем случае это 24 или 48MHz.


Цитата(_Pasha @ Sep 13 2013, 14:29) *
А на <12MHZ работает?

Имеется ввиду SPI? Нет, не понижал. Однако наверняка будет работать стабильней, т.к. частота ошибки растет с увеличением частоты SPI (как я писал, SPI у меня - половина такта процессора). Но понижение частоты - не решение, пока не разобрался с первопричиной.

Думаю, adnega здесь привел самую разумную гипотезу с первоначальной задержкой DMA. Потому и отличие всего в один байт в итоге. Ведь и готовность приема возникает на один SPI такт позже, чем готовность передатчика. То есть, SPI уже начала передачу второго байта, а флаг RXNE только взводится. То есть, при 24MHz SPI остается всего 292нс (7 битов) на то, чтобы вычитать принятый байт, пока он не затерся новым. У меня в системе есть еще другой DMA, который обслуживает ADC. Он тоже на шину лезет, хотя приоритет его и ниже читающего из SPI. Но ведь и на арбитраж время нужно...

Вот походил, подумал о work around. Если изначально загрузить в TX DMA счетчик 1, разрешить прерывание по TC, пихнуть DMA и в прерывании дозагрузить счетчик N-1, то этим можно ввести паузу между первым и последующими байтами.

Сообщение отредактировал KnightIgor - Sep 13 2013, 22:13
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Sep 14 2013, 04:16
Сообщение #4


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(KnightIgor @ Sep 14 2013, 00:57) *
Думаю, adnega здесь привел самую разумную гипотезу с первоначальной задержкой DMA. Потому и отличие всего в один байт в итоге.

Ага, щаз. Сколько пройдет тактов при передаче байта? Правильно, 16. sm.gif
Т.е. 4 такта на собсна fetching все-же есть. А пробовали заглушить АЦП-DMA?
ЗЫ я имею ввиду - если толкать DMA таким образом
Код
DMA1_Channel5->CMAR = (uint32_t) buffer + 1;
DMA1_Channel5->CNDTR = size-1;
SPI2->DR = *buffer;
DMA1_Channel5->CCR |= DMA_CCR5_EN;


Сообщение отредактировал _Pasha - Sep 14 2013, 04:24
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 14 2013, 11:17
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(_Pasha @ Sep 14 2013, 08:16) *
Ага, щаз. Сколько пройдет тактов при передаче байта? Правильно, 16. sm.gif
Т.е. 4 такта на собсна fetching все-же есть. А пробовали заглушить АЦП-DMA?

Чаще всего 12 тактов, но иногда и больше.
Делал светодиодное табло с динамической индикацией: видеопамять с помощью таймеров (каскадное соединение), SPI и DMA передавалась
в светодиодную панель. И вроде все хорошо и согласуется с теорией, но иногда были не то проблескивания, не то сдвиги столбцов и строк...
Очень редко, очень неуловимо, но когда понял что к чему, оказалось что есть задержка 12 тактов, но иногда (и именно в этих случаях были проблемы) больше 12. DMA был настроен на SPI_TX. Необходимые стробы формировались таймером. Задержка в первом байте на 12 тактов могла означать сдвиг на фиксированное число точек (в моем случае на 1) и легко фиксилось программно, но в случаях задержки более 12 тактов - были сбои. DMA с наивысшим приоритетом и использовался только канал SPI_TX.
Недано на скорую руку делал титровалку (наложение текста на видеосигнал) на STM32F373 при скорости SPI близкой к частоте ядра опять те же
проблемы. Увеличил BR для SPI (да горизонтальное разрешение упало, но мне не критично) и артефакты пропали.

Добавлено:
Да, совсем забыл - очень помогает уйти от 8 битных посылок SPI к 16 битным.
Go to the top of the page
 
+Quote Post
alexdos
сообщение Sep 15 2013, 09:31
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856



Цитата(adnega @ Sep 14 2013, 14:17) *
Делал светодиодное табло с динамической индикацией: видеопамять с помощью таймеров (каскадное соединение),

А это как, на таймерах видеопамять ?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- KnightIgor   Использование DMA для SPI в STM32F10x   Sep 13 2013, 11:52
- - _Pasha   А на <12MHZ работает?   Sep 13 2013, 13:29
- - adnega   Цитата(KnightIgor @ Sep 13 2013, 15:52) Е...   Sep 13 2013, 15:20
- - nx6310   Я для приема по spi через dma просто перевожу spi ...   Sep 14 2013, 05:46
|- - KnightIgor   Цитата(nx6310 @ Sep 14 2013, 06:46) Я для...   Sep 15 2013, 08:57
- - nx6310   Я останавливаю прием в прерывании от dma. Код RCC-...   Sep 15 2013, 10:40
|- - KnightIgor   Цитата(nx6310 @ Sep 15 2013, 11:40) Я ост...   Sep 15 2013, 10:49
- - adnega   Цитата(KnightIgor @ Sep 15 2013, 12:57) М...   Sep 15 2013, 13:01
- - nx6310   В моем случае глюков не замечалось. обшаюсь через ...   Sep 15 2013, 14:20
- - Golikov A.   а при 16 битной посылке байты местами поменяются.....   Sep 15 2013, 16:55
|- - SavageForest   Цитата(Golikov A. @ Sep 15 2013, 20:55) а...   Oct 25 2013, 06:12
- - SavageForest   обычно, в таких случаях, делают 2 буфера приёма ра...   Oct 22 2013, 07:39


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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 14:21
Рейтинг@Mail.ru


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