|
XMEGA - воспроизведение речи с DataFlash, Посредсвом DMA |
|
|
|
Apr 1 2013, 16:45
|

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

|
Все доброго времени суток!
Встала задача воспроизводить (заранее записанную на внешнюю МС памяти с SPI-интерфейсом) речь на МК XMEGA. Оцифровка 16 бит Х 16 кГц Х моно. Решил воплотить задачу используя DMA. Накидал программку, прогнал в AVRStudio 4 - вроде все работает... Но, блин что то не очень нравится собственное решение. Опишу алгоритм.
1. В качестве последовательного интерфейса для DataFlash используется один из USART в режиме MASTER SPI. Перед началом воспроизведения программно пишется команда чтения со всеми нужными атрибутами. 2. Для чтения сэмпла использую таймер с частотой переполнения 32 кГц. 3. Для инициализации передачи по SPI использую канал DMA (назовем его A). Канал стартует по переполнению таймера в режиме SIngleShort. Т.е. одно переполнение - трансфер одного байта в DATA регистр USART. В счетчик канала, перед началом воспроизведения, пишется количество байт воспроизводимого файла. В качестве источника данных используется байт в памяти данных, в который записано нулевое значение. Прерывание окончания передачи разрешено. 4. Для передачи байта из регистра DATA USART в регистр данных DAC использую второй канал DMA (Назовем его В). В счетчике данных канала всегда 2, включен режим повтора, счетчик повторов равен 0, т.е. неограниченное число повторов. Адрес источника - регистра DATA USART - фиксированый, Адрес приемника - регистр DATA канала DAC, адрес инкрементируется, обновляется после передачи блока данных (2 байт). Прерывание окончания передачи запрещено.
Прерывания: 1. По переполнению таймера - только для того, чтобы снять флаг прерывания. Если это прерывание не разрешить, то канал DMA А пуляет ноль в USART без остановки! Это и понятно - флаг прерывания по переполнению не обнуляется.
2. Прерывание по окончанию передачи по каналу DMA A - нужно, чтобы разрешить прерывание от последней передачи канала DMA B.
3. Прерывание по окончанию передачи канала DMA B. Останавливает таймер, запрещает работу обеих каналов DMA, вызывает CallBack-функцию, которая генерирует команду чтения следующего файла либо останавливает полностью воспроизведение.
Во всей этой схеме не нравится три прерывания, особенно первое - от таймера. Может есть более изящные способы, чем мой? Рад любым высказываниям. Спасибо!
--------------------
|
|
|
|
|
 |
Ответов
|
Apr 6 2013, 02:13
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 17-09-06
Пользователь №: 20 471

|
Цитата(prottoss @ Apr 1 2013, 21:45)  Во всей этой схеме не нравится три прерывания, особенно первое - от таймера. Может есть более изящные способы, чем мой? Рад любым высказываниям. Спасибо! Между таймером и DMA воткните канал событий. Переполнение таймера через канал событий будет запускать передачу по DMA.
|
|
|
|
|
Apr 6 2013, 17:15
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 17-09-06
Пользователь №: 20 471

|
Цитата(prottoss @ Apr 6 2013, 20:04)  Я думал об этом, но не стал пробовать, потому что не нашел описания поведения канала событий - флаг переполнения таймера сбрасывается только по прерыванию либо вручную. Завтра попробую и отпишусь. Использую подобный алгоритм . Работает. Канал событий срабатывает когда счетчик переполняется. На флаг не смотрите...он вроде все время установлен.
|
|
|
|
|
Apr 26 2013, 13:40
|

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

|
Цитата(prottoss @ Apr 7 2013, 18:23)  Сделал. Проверил в AVRStudio - работает. Спасибо за совет. На железе проверю позже. Сегодня проверил на железе - работает. Выводит WAV-файл на динамик. Но, блин, шум фоновый просто страшный. По схеме - с выхода DAC сигнал подается на транзистор, включенный по схеме ОЭ. В цепи коллектора - 8 Ом динамик последовательно с резистором 330 Ом. Понятно, что необходим ФНЧ, но все же я ожидал более приемлемого звучания. Осциллографа, к сожалению, под рукой не будет все выходные. Может кто нибудь подскажет, в чем может быть проблема? Я задаю вопрос с упором на программную часть и с надеждой на тех, кто уже это проделывал.
--------------------
|
|
|
|
Сообщений в этой теме
prottoss XMEGA - воспроизведение речи с DataFlash Apr 1 2013, 16:45     zombi Цитата(prottoss @ Apr 26 2013, 16:40) шум... Apr 26 2013, 20:43      prottoss Цитата(zombi @ Apr 27 2013, 02:43) Удалос... Apr 27 2013, 09:46       adnega Цитата(prottoss @ Apr 27 2013, 13:46) Мож... Apr 27 2013, 09:51       zombi Цитата(prottoss @ Apr 27 2013, 12:46) 2. ... Apr 27 2013, 16:49 bob1 Тут посмотрите. Apr 26 2013, 15:31 prottoss Померил осциллографом и офигел - сигнал на выходе ... Apr 27 2013, 12:31 prottoss Все, решил проблему. Перед загрузкой в ДатаФлэш, п... Apr 27 2013, 17:04
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|