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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> STM32F407 Непонятки с SAI
Genadi Zawidowsk...
сообщение Nov 8 2015, 11:10
Сообщение #16


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(Tarbal @ Nov 8 2015, 04:47) *
Спасибо, уже дышит.

Ну и хорошо...
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Nov 8 2015, 12:48
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Genadi Zawidowski @ Nov 8 2015, 15:10) *
Ну и хорошо...

Но вопросы не кончились.

Отчего-то нет фрейм сигнала. Насколько я понимаю если DMA подключено, то железке уже пофиг, что я не считываю из DMA. Хотя прерывания от DMA тоже не возникает.
Хотя то, что я не записываю ничего может быть и проблема. Надо еще с DMA разобраться.

В первый раз надо готовить буфер и активировать DMA или достаточно сделать все в обработчике прерывания и он сразу вызовет прерывание, когда все готово и прерывание разрешено? Другими словами по какому условию вызывается прерывание:
- передача завершена
- передача не обработана (как буфер пуст в UART)

FIFO и DMA как я понимаю разные устройства. FIFO встроено в SAI, а DMA отдельный модуль. При передаче DMA берет данные из области памяти и запихивает в FIFO. На этом обо всем можно забыть до следующей транзакции -- работает железо.

Сообщение отредактировал Tarbal - Nov 8 2015, 14:11
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Nov 8 2015, 14:10
Сообщение #18


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Посмотрите как я делаю... первый буфер подставляется DMA ещё при инициализации.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Nov 8 2015, 14:21
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Genadi Zawidowski @ Nov 8 2015, 18:10) *
Посмотрите как я делаю... первый буфер подставляется DMA ещё при инициализации.

__DSB(); это что?


Это?
http://infocenter.arm.com/help/index.jsp?t...ar01s02s04.html
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Nov 8 2015, 16:36
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Добавил старт ПДП (DMA) и все начало работать. Появился сигнал синхронизации фрейма. Спасибо Генадий за помощь.
Сейчас соединю дату с выхода SAIA со входом SAIB и попробую скопировать буфер через SAI.
Теперь еще USB прикрутить надо будет, но понемногу концепция куба становится понятной и с каждым шагом легче использовать.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Feb 28 2016, 21:04
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Наконец дошел до организации потока данных через SAI. Сделал по простому. Оба DMA (в оба направления) с кольцевыми буферами. В прерывании конца передачи DMA читаю принятый буфер и заполняю буфер на передачу при помощи memcpy(). Поскольку оба канала синхронны, то полагаю, что оба копирования могу делать в одном и том же обработчике прерывания. Но судя по результату я чего-то не понимаю. Может нужны какие-то процедуры, о которых я не подозреваю? Подскажите люди добрые.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Mar 1 2016, 12:21
Сообщение #22


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Решил несколько проблем. Осталась по видимому одна. Отчего-то нет синхронизации положения в данных буфере со слотом PCM.
У меня 16 слотов. Сначала я использовал циклический буфер DMA, но теперь перезапускаю прием и передачу в соответствующем прерывании каждый раз. Разнес прерывания на окончание приема и окончание передачи.
Может что-то надо переустановить в DMA?

Кажется понял. Надо из кеша выдувать данные в железо сразу после записи. На чтение вроде нет такой проблемы. Или я неправ?

Нашел, что и на чтение надо тоже произвести обмен с кэшем. Осталось найти как.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Mar 1 2016, 22:26
Сообщение #23


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



В stm32f429 нет data cache, который было бы нужно как-то пинать.
В Вашем случае, возможно надо double buffer использовать ("качели") - у Вас будет время на обработку одного буфера, пока другой заполняется.
В случае же циклического такой возможности нет.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Mar 2 2016, 14:53
Сообщение #24


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Genadi Zawidowski @ Mar 2 2016, 02:26) *
В stm32f429 нет data cache, который было бы нужно как-то пинать.
В Вашем случае, возможно надо double buffer использовать ("качели") - у Вас будет время на обработку одного буфера, пока другой заполняется.
В случае же циклического такой возможности нет.


Спасибо. Я примерно так и сделал. На циклическом буфере двойной длины делаю прерывания на половине передачи и на полной. Качели и получаются.
Оказывается FIFO надо включать sm.gif. Разрешил FIFO (неважно на половине или на полном ставить порог слвания) и все заработало, но отчего-то строб сигнал фрейма FS приходитса на первый (старший) бит последнего байта фрейма. Вот преодолеваю. Поскольку надо мне все равно делать транспонирование при копировании между USB и PCM, пока вставлю в матрицу преобразования символа сдвиг для коррекции, а дальше посмотрим.

Причем сдвиг имеет место быть и при передаче без DMA.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Mar 3 2016, 06:05
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Tarbal @ Mar 2 2016, 18:53) *
Спасибо. Я примерно так и сделал. На циклическом буфере двойной длины делаю прерывания на половине передачи и на полной. Качели и получаются.
Оказывается FIFO надо включать sm.gif. Разрешил FIFO (неважно на половине или на полном ставить порог слвания) и все заработало, но отчего-то строб сигнал фрейма FS приходитса на первый (старший) бит последнего байта фрейма. Вот преодолеваю. Поскольку надо мне все равно делать транспонирование при копировании между USB и PCM, пока вставлю в матрицу преобразования символа сдвиг для коррекции, а дальше посмотрим.

Причем сдвиг имеет место быть и при передаче без DMA.


Не доволен результатом. Иногда попадает на ошибку DMA. и срывается синхронизация. Буду копать дальше.

Генадий, у меня одна проблема, которую я не могу никак понять.
Я использую все 16 слотов интерфейса.
Отчего-то импульс синхронизации не на первом бите (старшем) нулевого слота, а на первом бите последнего слота предыдущего фрейма.
Могу конечно в буфере подвинуть, но мне такое делать стыдно.

У вас нет никаких идей насчет этого?
Заранее спасибо.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Mar 3 2016, 14:28
Сообщение #26


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(Tarbal @ Mar 3 2016, 09:05) *
Не доволен результатом. Иногда попадает на ошибку DMA. и срывается синхронизация. Буду копать дальше.

Генадий, у меня одна проблема, которую я не могу никак понять.
Я использую все 16 слотов интерфейса.
Отчего-то импульс синхронизации не на первом бите (старшем) нулевого слота, а на первом бите последнего слота предыдущего фрейма.
Могу конечно в буфере подвинуть, но мне такое делать стыдно.

У вас нет никаких идей насчет этого?
Заранее спасибо.

а на первом бите последнего слота предыдущего фрейма - это I2S, смотрите 29.7.4 Frame synchronization offset
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Mar 3 2016, 19:51
Сообщение #27


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Genadi Zawidowski @ Mar 3 2016, 17:28) *
а на первом бите последнего слота предыдущего фрейма - это I2S, смотрите 29.7.4 Frame synchronization offset

Спасибо.
Посмотрел. Это сдвиг на один бит, а у меня сдвиг на байт. Причем я пробовал посылать без DMA. Не помогло. Точно также.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Mar 3 2016, 19:54
Сообщение #28


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



А Вы в референс мануал вообще заглядывали?
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Mar 3 2016, 19:58
Сообщение #29


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Genadi Zawidowski @ Mar 3 2016, 22:54) *
А Вы в референс мануал вообще заглядывали?


Заглядывал.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Mar 18 2016, 14:35
Сообщение #30


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Разобрался что происходит, но не было времени разобраться (вернее проверить как надо знаю sm.gif ) как грамотно решить проблему. Жесткий график проекта не давал продохнуть.
При старте SAI думает, что в FIFO уже есть один байт. Это и вызывает сдвиг. По хорошему перед вызовом функции куба передачи через DMA надо промыть (flush) FIFO, но не было времени проверять.
Go to the top of the page
 
+Quote Post

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

 


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


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