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



Урок 46

 

Часть 5

 

I2S AUDIO

 

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

Продолжаем дальше функцию cs43l22_Init

 

  counter += CODEC_IO_Write(DeviceAddr, 0x06, CODEC_STANDARD);

  /* Set the Master volume */

  counter += cs43l22_SetVolume(DeviceAddr, Volume);

 

  /* If the Speaker is enabled, set the Mono mode and volume attenuation level */

  if(OutputDevice != OUTPUT_DEVICE_HEADPHONE)

  {

    /* Set the Speaker Mono mode */  

    counter += CODEC_IO_Write(DeviceAddr, 0x0F , 0x06);

   

    /* Set the Speaker attenuation level */  

    counter += CODEC_IO_Write(DeviceAddr, 0x24, 0x00);

    counter += CODEC_IO_Write(DeviceAddr, 0x25, 0x00);

  }

  /* Disable the analog soft ramp */

  counter += CODEC_IO_Write(DeviceAddr, 0x0A, 0x00);

  /* Disable the digital soft ramp */

  counter += CODEC_IO_Write(DeviceAddr, 0x0E, 0x04);

  /* Disable the limiter attack level */

  counter += CODEC_IO_Write(DeviceAddr, 0x27, 0x00);

  /* Adjust Bass and Treble levels */

  counter += CODEC_IO_Write(DeviceAddr, 0x1F, 0x0F);

  /* Adjust PCM volume level */

  counter += CODEC_IO_Write(DeviceAddr, 0x1A, 0x0A);

  counter += CODEC_IO_Write(DeviceAddr, 0x1B, 0x0A);

  return counter;

 

 

Здесь, в принципе, нам обо всём расскажут комментарии.

Вот сколько мы уже кода написали, а к теме нашего занятия – к шине I2S мы ещё даже не прикасались. Ну наконец-то настал этот час! Напишем новую функцию для инициализации данной шины.

 

//——————————————————

static void I2S3_Init(uint32_t AudioFreq)

{

        hi2s3.Instance = I2S3;

         /* Disable I2S block */

  __HAL_I2S_DISABLE(&hi2s3);

  hi2s3.Init.AudioFreq   = AudioFreq;

  hi2s3.Init.Standard    = I2S_STANDARD;

        HAL_I2S_DeInit(&hi2s3);

  if (HAL_I2S_Init(&hi2s3) != HAL_OK)

        {

                        Error();

        }

}

//——————————————————

 

И вызовем её в функции cs43l22_Init

 

  counter += CODEC_IO_Write(DeviceAddr, 0x1B, 0x0A);

  I2S3_Init(AudioFreq);        

  return counter;

 

Ещё раз соберём код, прошьём контроллер и убедимся, что у нас нет ошибок и что не загорелся красный светодиод.

 

 

Ну, можно сказать, инициализацию мы завершили.

Теперь потихонечку начнем писать отправку аудиопотока.

 

Добавим ещё одну новую функцию начала воспроизведения звукового файла

 

//————————————————-//————————————————-

void AudioPlay_Start(uint32_t AudioFreq)

{

        offsetpos=44;

        cnt=0;

  UINT bytesread = 0;

        AudioTotalSize = waveformat->FileSize;  

          /* Get Data from USB Flash Disk */

  WaveDataLength = waveformat->FileSize;

  f_lseek(&WavFile, 0);

  f_read (&WavFile, &Audio_Buffer[0], AUDIO_BUFFER_SIZE, &bytesread);

  AudioRemSize = WaveDataLength — bytesread;

  CurrentPos = 0;

}

//————————————————-

 

Добавим в заголовочный файл audioplay.h прототип на данную функцию

 

void AudioPlay_Init(uint32_t AudioFreq);

void AudioPlay_Start(uint32_t AudioFreq);

//————————————————        

 

И вызовем её в main.c в функции , добавив туда кроме этого ещё некоторый код

 

                        case AUDIO_PLAYBACK:

                                WaveDataLength = waveformat->FileSize;

                                if(f_open(&WavFile, FileName, FA_OPEN_EXISTING | FA_READ) == FR_OK)

                                {

                                        AudioPlay_Start(waveformat->SampleRate);

                                        f_close(&WavFile);

                                }

                                LCD_Clear();

                                sprintf(FileName,»Track2.wav»);

                                Audio.state = AUDIO_IDLE;

                                break;

 

В файле audioplay.c добавим ещё одну функцию

 

//——————————————————

uint32_t cs43l22_SetMute(uint16_t DeviceAddr, uint32_t Cmd)

{

        uint32_t counter = 0;

  /* Set the Mute mode */

  if(Cmd == AUDIO_MUTE_ON)

  {

    counter += CODEC_IO_Write(DeviceAddr, 0x04, 0xFF);

  }

          else /* AUDIO_MUTE_OFF Disable the Mute */

  {

    counter += CODEC_IO_Write(DeviceAddr, 0x04, OutputDev);

  }

  return counter;

}

//——————————————————

 

Здесь мы опять работаем с четвертым регистром. Если мы решим отключить звук, то мы передаем во все его биты единицы, тем самым отключая все каналы, а если наоборот какие-то включить, то в соответствующие каналам биты мы передаем нули.

 

В следующей части нашего занятия мы продолжим писать функцию воспроизведения звука, напишем функцию остановки воспроизведения.

 

 

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

 

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

 

 

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

STM32F4-DISCOVERY

Дисплей LCD 20×4

 

 

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

 

STM32 I2S AUDIO

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

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

*