|
|
  |
STM32F407 Непонятки с SAI |
|
|
|
Nov 8 2015, 12:48
|
Профессионал
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Mar 2 2016, 14:53
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(Genadi Zawidowski @ Mar 2 2016, 02:26)  В stm32f429 нет data cache, который было бы нужно как-то пинать. В Вашем случае, возможно надо double buffer использовать ("качели") - у Вас будет время на обработку одного буфера, пока другой заполняется. В случае же циклического такой возможности нет. Спасибо. Я примерно так и сделал. На циклическом буфере двойной длины делаю прерывания на половине передачи и на полной. Качели и получаются. Оказывается FIFO надо включать  . Разрешил FIFO (неважно на половине или на полном ставить порог слвания) и все заработало, но отчего-то строб сигнал фрейма FS приходитса на первый (старший) бит последнего байта фрейма. Вот преодолеваю. Поскольку надо мне все равно делать транспонирование при копировании между USB и PCM, пока вставлю в матрицу преобразования символа сдвиг для коррекции, а дальше посмотрим. Причем сдвиг имеет место быть и при передаче без DMA.
|
|
|
|
|
Mar 3 2016, 06:05
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(Tarbal @ Mar 2 2016, 18:53)  Спасибо. Я примерно так и сделал. На циклическом буфере двойной длины делаю прерывания на половине передачи и на полной. Качели и получаются. Оказывается FIFO надо включать  . Разрешил FIFO (неважно на половине или на полном ставить порог слвания) и все заработало, но отчего-то строб сигнал фрейма FS приходитса на первый (старший) бит последнего байта фрейма. Вот преодолеваю. Поскольку надо мне все равно делать транспонирование при копировании между USB и PCM, пока вставлю в матрицу преобразования символа сдвиг для коррекции, а дальше посмотрим. Причем сдвиг имеет место быть и при передаче без DMA. Не доволен результатом. Иногда попадает на ошибку DMA. и срывается синхронизация. Буду копать дальше. Генадий, у меня одна проблема, которую я не могу никак понять. Я использую все 16 слотов интерфейса. Отчего-то импульс синхронизации не на первом бите (старшем) нулевого слота, а на первом бите последнего слота предыдущего фрейма. Могу конечно в буфере подвинуть, но мне такое делать стыдно. У вас нет никаких идей насчет этого? Заранее спасибо.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|