Ребята помогите! Не могу воспроизвести 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] - для короткого