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

Переходник I2C to LCD можно приобрести здесьI2C to LCD1602 2004

 

 

Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)

STM32 I2S AUDIO

 

Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)

STM32 I2S AUDIO

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

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

*