STM Урок 46. I2S AUDIO. Часть 2

 

 

 

Урок 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;

 

Попробуем собрать код и прошить контроллер, чтобы посмотреть, открылся ли у нас файл

 

image19

 

Мы видим на дисплее, что файл открылся, видим его частоту сэмплирования, длину в байтах и секундах.

В следующей части урока мы продолжим инициализацию микросхемы Аудио ЦАП и напишем функцию считывания идентификатора данной микросхемы по шине I2C.

 

Предыдущая часть Программирование МК STM32 Следующая часть

 

Техническая документация на Аудио ЦАП CS43L22

 

 

Отладочную плату и дисплей можно приобрести здесь:

STM32F4-DISCOVERY

Дисплей LCD 20×4

 

 

Смотреть ВИДЕОУРОК

 

STM32 I2S AUDIO

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*