Урок 46
Часть 2
I2S AUDIO
В предыдущей части урока мы создали и настроили проект в Cube MX, создали каркас приложения, добавили все макросы и глобальные переменные, которые в процессе написания кода нам потребуются.
Также мы начали писать некоторые функции аудио-библиотеки.
Создадим ещё одну функцию инициализации и добавим также в неё несколько переменных
uint8_t AudioOut_Init(uint16_t OutputDevice, uint8_t Volume, uint32_t AudioFreq)
{
uint8_t ret = AUDIO_ERROR;
uint32_t deviceid = 0x00;
RCC_PeriphCLKInitTypeDef rccclkinit;
uint8_t index = 0, freqindex = 0xFF;
}
//——————————————————
void AudioPlay_Init(uint32_t AudioFreq)
Вызовем данную функцию в функции AudioPlay_Init
__IO uint8_t volume = 70;
if(AudioOut_Init(OUTPUT_DEVICE_AUTO, volume, samplerate)!=0)
{
Error();
}
}
В main.c в функции MenuProcess создадим некоторый каркас кода
void MenuProcess(void)
{
if(Appli_state == APPLICATION_READY)
{
switch(Audio.state)
{
case AUDIO_IDLE:
break;
case AUDIO_WAIT:
break;
case AUDIO_EXPLORE:
break;
case AUDIO_PLAYBACK:
break;
case AUDIO_IN:
break;
default:
break;
}
}
}
Начнём потихоньку данный каркас заполнять кодом:
case AUDIO_IDLE:
Audio.state = AUDIO_WAIT;
LCD_SetPos(0, 0);
LCD_String(«Stm32 Audio Player»);
break;
В файде usb_host.c в функции USBH_UserProcess поправим код к более стандартному виду
static void USBH_UserProcess (USBH_HandleTypeDef *phost, uint8_t id)
{
/* USER CODE BEGIN 2 */
switch(id)
{
case HOST_USER_SELECT_CONFIGURATION:
break;
case HOST_USER_DISCONNECTION:
Appli_state = APPLICATION_DISCONNECT;
break;
case HOST_USER_CLASS_ACTIVE:
Appli_state = APPLICATION_READY;
break;
case HOST_USER_CONNECTION:
Appli_state = APPLICATION_START;
break;
default:
break;
}
/* USER CODE END 2 */
}
В main.c добавим ещё одну функцию
/* USER CODE BEGIN 0 */
//————————————
void GetFileInfo(void)
{
if(f_open(&WavFile, FileName, FA_OPEN_EXISTING | FA_READ) == FR_OK)
{
uint32_t duration;
uint32_t bytesread;
if(f_read(&WavFile, info, 44, (void *)&bytesread) == FR_OK)
{
waveformat = (WAVE_FormatTypeDef*) info;
sprintf((char *)str, «%d», (int)(waveformat->SampleRate));
LCD_SetPos(0, 2);
LCD_String(str);
sprintf((char *)str, » %d», (int)(waveformat->NbrChannels));
LCD_String(str);
duration = waveformat->FileSize / waveformat->ByteRate;
sprintf((char *)str, » %d %02d:%02d», (int)(waveformat->FileSize/1024), (int)(duration/60), (int)(duration%60));
LCD_String(str);
}
f_close(&WavFile);
}
}
//————————————
Также добавим некоторый код в главной функции main()
LCD_Clear();
HAL_Delay(500);
sprintf(FileName,»Track1.wav»);
/* USER CODE END 2 */
Продолжим писать код функции MenuProcess
case AUDIO_WAIT:
LCD_SetPos(0, 1);
if((f_mount(&USBDISKFatFs, (TCHAR const*)USBH_Path, 0) != FR_OK))
{
LCD_String(«Can't Init FatFs!»);
}
else
{
LCD_String(«FatFs Initialized!»);
}
f_close(&WavFile);
GetFileInfo();
AudioPlay_Init(waveformat->SampleRate);
Audio.state = AUDIO_PLAYBACK;
break;
Попробуем собрать код и прошить контроллер, чтобы посмотреть, открылся ли у нас файл
Мы видим на дисплее, что файл открылся, видим его частоту сэмплирования, длину в байтах и секундах.
В следующей части урока мы продолжим инициализацию микросхемы Аудио ЦАП и напишем функцию считывания идентификатора данной микросхемы по шине I2C.
Предыдущая часть Программирование МК STM32 Следующая часть
Техническая документация на Аудио ЦАП CS43L22
Отладочную плату можно приобрести здесь STM32F4-DISCOVERY
Переходник I2C to LCD можно приобрести здесьI2C to LCD1602 2004
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Добавить комментарий