Урок 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
Отладочную плату и дисплей можно приобрести здесь:
Смотреть ВИДЕОУРОК
Добавить комментарий