Урок 46
Часть 6
I2S AUDIO
В предыдущей части урока мы продолжили и практически закончили писать инициализацию Аудио ЦАП и написали ещё некоторые немаловажные функции для работы с данной микросхемой.
Напишем следующую нужную функцию
//——————————————————
uint32_t cs43l22_Play(uint16_t DeviceAddr)
{
uint32_t counter = 0;
if(Is_cs43l22_Stop == 1)
{
/* Enable the digital soft ramp */
counter += CODEC_IO_Write(DeviceAddr, CS43L22_REG_MISC_CTL, 0x06);
/* Enable Output device */
counter += cs43l22_SetMute(DeviceAddr, AUDIO_MUTE_OFF);
/* Power on the Codec */
counter += CODEC_IO_Write(DeviceAddr, 0x02, 0x9E);
Is_cs43l22_Stop = 0;
}
return counter;
}
//————————————————-
Здесь мы сначала передаем шестёрку в регистр 0x0E, тем самым мы отключим программный ramp. Я, к сожалению, пока не понял, что это и зачем, но сделать так надо. Затем мы отключаем приглушение звука функцией, только что рассмотренной выше. Затем во 2 регистр ЦАПа мы заносим значение 0x9E. С данным регистром мы уже работали в самом начале. Там мы отключили ЦАП, чтобы не заниматься инициализацией в его включенном состоянии. Значением 0x9E мы уже включаем ЦАП.
Продолжим писать код функции AudioPlay_Start
CurrentPos = 0;
if(cs43l22_Play(AUDIO_I2C_ADDRESS) != 0)
{
Error();
}
else
{
HAL_I2S_Transmit_DMA(&hi2s3, (uint16_t*)&Audio_Buffer[0], DMA_MAX(AUDIO_BUFFER_SIZE/AUDIODATA_SIZE));
}
/* Check if the device is connected.*/
while((AudioRemSize != 0) && (Appli_state != APPLICATION_IDLE))
{
if(buffer_offset == BUFFER_OFFSET_HALF)
{
f_read(&WavFile, &Audio_Buffer[0], AUDIO_BUFFER_SIZE/2, (void *)&bytesread);
buffer_offset = BUFFER_OFFSET_NONE;
AudioRemSize -= bytesread;
dur = (waveformat->FileSize-AudioRemSize) / waveformat->ByteRate;
sprintf((char *)str2, «%02d:%02d «, (int)(dur/60), (int)(dur%60));
dur = AudioRemSize / waveformat->ByteRate;
sprintf((char *)str3, «%02d:%02d», (int)(dur/60), (int)(dur%60));
}
if(buffer_offset == BUFFER_OFFSET_FULL)
{
f_read(&WavFile, &Audio_Buffer[AUDIO_BUFFER_SIZE/2], AUDIO_BUFFER_SIZE/2, (void *)&bytesread);
buffer_offset = BUFFER_OFFSET_NONE;
AudioRemSize -= bytesread;
}
if(AudioRemSize<0)
{
AudioRemSize = 0;
dur = 0;
sprintf((char *)str3, «%02d:%02d», (int)(dur/60), (int)(dur%60));
}
LCD_SetPos(0, 3);
LCD_String(str2);
LCD_String(str3);
}
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);
Напишем вот такую функцию:
//————————————————-
uint32_t cs43l22_Stop(uint16_t DeviceAddr)
{
uint32_t counter = 0;
/* Mute the output first */
counter += cs43l22_SetMute(DeviceAddr, AUDIO_MUTE_ON);
/* Power down the DAC and the speaker (PMDAC and PMSPK bits)*/
counter += CODEC_IO_Write(DeviceAddr, 0x02, 0x9F);
Is_cs43l22_Stop = 1;
return counter;
}
//——————————————————
Здесь мы соответственно сначала приглушим звук, а затем отключим ЦАП
Теперь такую:
//————————————————-
void AudioPlay_Stop(void)
{
HAL_Delay(1);
HAL_I2S_DMAStop(&hi2s3);
HAL_Delay(1);
cs43l22_Stop(AUDIO_I2C_ADDRESS);
}
//————————————————-
Вызовем её в AudioPlay_Start
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);
AudioPlay_Stop();
}
В следующей части нашего урока мы исправим ошибки прошлой части занятия, напишем ещё кое-какие функции и наконец-то завершим тему урока.
Предыдущая часть Программирование МК STM32 Следующая часть
Техническая документация на Аудио ЦАП CS43L22
Отладочную плату и дисплей можно приобрести здесь:
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Добавить комментарий