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



Урок 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 мы уже включаем ЦАП.

 

image16

 

 

Продолжим писать код функции 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;    

}

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

 

Здесь мы соответственно сначала приглушим звук, а затем отключим ЦАП

 

image17

 

Теперь такую:

 

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

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

 

 

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

STM32F4-DISCOVERY

Дисплей LCD 20×4

 

 

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

 

STM32 I2S AUDIO

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

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

*