Урок 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 (нажмите на картинку для увеличения размера)
Вообщем, по этому адресу, добавив к нему два нуля, мы и будем работать с шиной I2C микросхемы. Хранится данный ID по адресу 0x01. На следующем рисунке мы увидим это, а также какой именно ID мы должны считать (нажмите на картинку для увеличения размера)
Вызовем функцию 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
Отладочную плату и дисплей можно приобрести здесь:
Смотреть ВИДЕОУРОК
Добавить комментарий