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



Урок 46

 

Часть 3

 

I2S AUDIO

 

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

Напишем ещё некоторый код в функцию AudioOut_Init файла audioplay.c

 

  uint8_t index = 0, freqindex = 0xFF;

  for(index = 0; index < 8; index++)

  {

    if(I2SFreq[index] == AudioFreq)

    {

      freqindex = index;

    }

  }

  /* Enable PLLI2S clock */

  HAL_RCCEx_GetPeriphCLKConfig(&rccclkinit);

  /* PLLI2S_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */

  if ((freqindex & 0x7) == 0)

  {

    /* I2S clock config

    PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) X (PLLI2SN/PLLM)

    I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */

    rccclkinit.PeriphClockSelection = RCC_PERIPHCLK_I2S;

    rccclkinit.PLLI2S.PLLI2SN = I2SPLLN[freqindex];

    rccclkinit.PLLI2S.PLLI2SR = I2SPLLR[freqindex];

    HAL_RCCEx_PeriphCLKConfig(&rccclkinit);

  }

  else

  {

    /* I2S clock config

    PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) X (PLLI2SN/PLLM)

    I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */

    rccclkinit.PeriphClockSelection = RCC_PERIPHCLK_I2S;

    rccclkinit.PLLI2S.PLLI2SN = 258;

    rccclkinit.PLLI2S.PLLI2SR = 3;

    HAL_RCCEx_PeriphCLKConfig(&rccclkinit);

  }

        HAL_GPIO_WritePin(AUDIO_RESET_GPIO, AUDIO_RESET_PIN, GPIO_PIN_RESET);

  /* Wait for a delay to insure registers erasing */

  HAL_Delay(5);

  /* Power on the codec */

  HAL_GPIO_WritePin(AUDIO_RESET_GPIO, AUDIO_RESET_PIN, GPIO_PIN_SET);

  /* Wait for a delay to insure registers erasing */

  HAL_Delay(5);

}

 

В этом коде в основном находится повторная инициализация шины в зависимости от определённой частоты сэмплирования.

 

 

Добавим в этот же файл функцию для чтения идентификатора микросхемы

 

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

uint32_t cs43l22_ReadID(uint16_t DeviceAddr)

{

  HAL_StatusTypeDef status = HAL_OK;

  uint8_t value = 0;

  status = HAL_I2C_Mem_Read(&hi2c1, DeviceAddr, (uint16_t)CS43L22_CHIPID_ADDR, I2C_MEMADD_SIZE_8BIT, &value, 1,0×1000);

  if(status == HAL_OK)

  {

                value = (value & CS43L22_ID_MASK);

                  return ((uint32_t)value);

        }

        return 0;

}

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

 

А здесь мы пытаемся считать идентификатор микросхемы. Во-первых, чтобы его считать, мы должны как-то общаться с микросехомй. А для этого нам нужен адрес I2C. Найдем его в даташите на странице 33 (нажмите на картинку для увеличения размера)

 

image11_0500

 

Вообщем, по этому адресу, добавив к нему два нуля, мы и будем работать с шиной I2C микросхемы. Хранится данный ID по адресу 0x01. На следующем рисунке мы увидим это, а также какой именно ID мы должны считать (нажмите на картинку для увеличения размера)

 

image09_0500

 

 

Вызовем функцию cs43l22_ReadID в функции AudioOut_Init

 

  HAL_Delay(5);

  deviceid = cs43l22_ReadID(AUDIO_I2C_ADDRESS);

  if((deviceid & CS43L22_ID_MASK) == CS43L22_ID)

  {

    ret = AUDIO_OK;

   }

        return ret;

}

 

Соберем код, прошьём контроллер и если на дисплее всё нормально, файл считан, ID считан и если не зажёгся красный светодиод, то мы смело можем быть уверенными в том, что мы работаем именно с этой микросхемой и что файлы у нас читаются и распознаются.

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

 

 

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

 

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

 

 

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

STM32F4-DISCOVERY

Дисплей LCD 20×4

 

 

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

 

STM32 I2S AUDIO

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

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

*