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

 
 
> STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV, Непонятки с воспроизведением WAV
loreal1970
сообщение Apr 28 2015, 17:41
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 3-04-12
Пользователь №: 71 164



Ребята помогите! Не могу воспроизвести wav с карточки.
Хочу сказать фразу по нажатию кнопки.
Карта читается.
Проблема то ли с ЦАП-ом, то ли выводом данных. В общем лыжи наглухо в асфальте.
Вот инит ЦАПа:
CODE
void Init_Sound(void)
{
DAC_InitTypeDef DAC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC | RCC_APB1Periph_TIM6, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);

TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseStructure.TIM_Period = 72-1; //
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);

TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);

DMA_DeInit(DMA2_Channel3);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&DAC->DHR8R1;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32) &WAVBuffer[0];
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize =512;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA2_Channel3, &DMA_InitStructure);

DMA_Cmd(DMA2_Channel3, ENABLE);

DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = 0;
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
DAC_Init(DAC_Channel_1, &DAC_InitStructure);

DAC_Cmd(DAC_Channel_1, ENABLE);

DAC_DMACmd(DAC_Channel_1, ENABLE);

TIM_Cmd(TIM6, DISABLE);
}


Дальше в основном цикле.

Код
if(Kn_a==1)    // Kn_a находится в прерывании
{
   Init_Sound();
   load_header();   // Здесь читаются заголовки WAV и настраивается таймер
   sound();
   Kn_a=0;
}


А вот с функцией sound(); наверное проблемы.

Код
void sound(void)
{
   while(1)
      {
         TIM_Cmd(TIM6, ENABLE);
      while(!(DMA2->ISR & DMA_ISR_HTIF3)) {}  

     f_read (&fsrc, &WAVBuffer[0], 256, &rb);
       DAC_SetChannel1Data(DAC_Align_8b_R, WAVBuffer[0]);
  

     if(rb < 256) {TIM_Cmd(TIM6, DISABLE); break;}  

     while(!(DMA2->ISR & DMA_ISR_TCIF3)) {}

     f_read (&fsrc, &WAVBuffer[256], 256, &rb);
       DAC_SetChannel1Data(DAC_Align_8b_R, WAVBuffer[256]);

     if(rb < 256) {TIM_Cmd(TIM6, DISABLE); break;}
       }
}


В динамике треск и писк.
В общем мозги кипят.
Прошу помощи, кто знает. Нужно проиграть мелодию с карточки.

Сообщение отредактировал IgorKossak - Apr 29 2015, 15:54
Причина редактирования: [codebox] для длинного кода, [code] - для короткого
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
loreal1970
сообщение Apr 30 2015, 09:48
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 3-04-12
Пользователь №: 71 164



Хорошо. Вот так я читаю заголовок. Изменений никаких. В посте выше я просто переместил указатель на 44 байта.

CODE
static
DWORD load_header (void) /* 0:Invalid format, 1:I/O error, >1:Number of samples */
{

DWORD ChunkID, SamplingRate, sz, Length;
char str[20];

//------------------------------------------------
f_mount(0,&fs);
f_open( &fsrc, "200.wav", FA_READ );
//------------------------------------------------
GUI_SetColor(GUI_WHITE); //RED
GUI_SetFont(&GUI_Font24_1);
GUI_DispStringAt(">", 0, 50);

if (f_read(&fsrc, Buff, 12, &rb)) return 1; /* Load file header (12 bytes) */
if (rb != 12 || LD_DWORD(Buff+8) != FCC('W','A','V','E')) return 0;
GUI_DispNextLine(); GUI_DispString("WAV File found:");

while(1) {
f_read(&fsrc, Buff, 8, &rb); /* Get Chunk ID and size */
if (rb != 8) return 0;
ChunkID = LD_DWORD(&Buff[0]);
sz = LD_DWORD(&Buff[4]); /* Chunk size */
//------------------------------
sprintf(str, "%ld", sz);
GUI_DispNextLine();
GUI_DispString(str);
//------------------------------
switch (ChunkID) { /* FCC */
case fmt_chunk: /* 'fmt ' chunk */
if (sz > 100 || sz < 16) return 0; /* Check chunk size */
f_read(&fsrc, Buff, sz, &rb); /* Get content */
if (rb != sz) return 0;
if (Buff[0] != 1) return 0; /* Check coding type (PCM=1) */

NumChannels = Buff[2]; /* Get channel flag */
if (NumChannels != 1 && NumChannels != 2) /* Check channels (1/2) */
return 0;
if(NumChannels == 1) {GUI_DispNextLine(); GUI_DispString("Mono");}
else if(NumChannels == 2) {GUI_DispNextLine(); GUI_DispString("Stereo");}

BitsPerSample = Buff[14]; /* Resolution flag */
if (BitsPerSample != 8 && BitsPerSample != 16) /* Check resolution (8/16) */
return 0;
if(BitsPerSample == 8) {GUI_DispNextLine(); GUI_DispString("8-bits");}
else if(BitsPerSample == 16) {GUI_DispNextLine(); GUI_DispString("16-bits");}

SamplingRate = LD_DWORD(Buff+4);
// set_sampling_rate( SamplingRate ); /* Sampling freq */
sprintf(str, "%ldHz", SamplingRate);
GUI_DispNextLine(); GUI_DispString(str);
break;

case data_chunk: /* 'data' chunk (start to play) */
Length = sz / (SamplingRate * NumChannels * (BitsPerSample>>3) ); // length in seconds
sprintf(str, "%ld:%2ld min", (Length/60), (Length%60));
GUI_DispNextLine(); GUI_DispString(str);
return sz;

case LIST_chunk: /* 'LIST' chunk (skip) */

case fact_chunk: /* 'fact' chunk (skip) */
f_lseek(&fsrc, (fsrc.fptr + sz));

break;

default : /* Unknown chunk (error) */
return 0;
}
}
//return 0;
}


и дальше

Код
void sound(void)
{
f_read (&fsrc, &WAVBuffer[0], 512, &rb);
    
    while(1)  
        {
            while(!(DMA2->ISR & DMA_ISR_HTIF3)) {}
            f_read (&fsrc, &WAVBuffer[0], 256, &rb);
            DMA2->IFCR |= DMA_ISR_HTIF3;    
            if(rb < 256) {TIM_Cmd(TIM2, DISABLE); break;}
            
            while(!(DMA2->ISR & DMA_ISR_TCIF3)) {}
            f_read (&fsrc, &WAVBuffer[256], 256, &rb);    
            DMA2->IFCR |= DMA_ISR_HTIF3;
            if(rb < 256) {TIM_Cmd(TIM2, DISABLE); break;}
         }
}


Исправил
while(1)
{
while(!(DMA2->ISR & DMA_ISR_HTIF3)) {}
f_read (&fsrc, &WAVBuffer[0], 256, &rb);
DMA2->IFCR |= DMA_ISR_HTIF3;
if(rb < 256) {TIM_Cmd(TIM2, DISABLE); break;}

while(!(DMA2->ISR & DMA_ISR_TCIF3)) {}
f_read (&fsrc, &WAVBuffer[256], 256, &rb);
DMA2->IFCR |= DMA_ISR_TCIF3; //
if(rb < 256) {TIM_Cmd(TIM2, DISABLE); break;}
}

Все равно на экране беспорядочные значения


Сообщение отредактировал loreal1970 - Apr 30 2015, 10:38
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- loreal1970   STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV   Apr 28 2015, 17:41
- - jcxz   Вначале научитесь хотя-бы простой тональный сигнал...   Apr 29 2015, 04:07
- - loreal1970   Совет, конечно, хороший. Я с этого начинал. Выве...   Apr 29 2015, 12:01
|- - mantech   Цитата(loreal1970 @ Apr 29 2015, 15:01) С...   Apr 29 2015, 12:09
- - loreal1970   Благодарю mantech ! А можно по подробнее с на...   Apr 29 2015, 12:50
|- - mantech   Цитата(loreal1970 @ Apr 29 2015, 15:50) А...   Apr 29 2015, 17:23
- - loreal1970   В общем записал на карту синус (сформированный в п...   Apr 30 2015, 08:24
|- - AHTOXA   Так в wav-файле же не просто отсчёты для синуса, т...   Apr 30 2015, 08:56
|- - AHTOXA   Цитата(loreal1970 @ Apr 30 2015, 14:48) Х...   Apr 30 2015, 10:29
- - loreal1970   Так секундочку. Я чего то не понимаю. В заголовке ...   Apr 30 2015, 11:34
|- - adnega   Цитата(loreal1970 @ Apr 30 2015, 14:34) Т...   Apr 30 2015, 11:42
- - controller_m30   Пусть функция загрузки данных в DAC - укладывает в...   May 2 2015, 11:21
|- - MiklPolikov   Заголовок незачем читать, ели точно известно, в ка...   May 2 2015, 12:14
- - loreal1970   Да ребята. Вы правы. WAV у меня 16 битный. А преоб...   May 2 2015, 13:52
|- - adnega   Цитата(loreal1970 @ May 2 2015, 16:52) 4....   May 2 2015, 14:40
|- - Quasar   Цитата(loreal1970 @ May 2 2015, 16:52) Та...   May 6 2015, 18:53
- - Golikov A.   ЦитатаЕще в DMA есть режим с двумя буферами, Doubl...   May 7 2015, 05:21
|- - Quasar   Цитата(Golikov A. @ May 7 2015, 08:21) эт...   May 7 2015, 05:41
- - Golikov A.   А... только я не понял в чем бизнес. Ведь можно сд...   May 7 2015, 09:54
- - loreal1970   В общем пару дней отдохнул и доделал чтение WAV. ...   May 7 2015, 14:20


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

 


RSS Текстовая версия Сейчас: 24th August 2025 - 11:49
Рейтинг@Mail.ru


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