W tym poście chciałbym opisać sposób obsługi kodeka audio zamontowanego na płytce STM32F7 Discovery.
[Źródło: http://www.st.com/en/evaluation-tools/32f746gdiscovery.html]
Schemat podłączenia:
Na płycie zamontowano kodek audio firmy Cirrus WM8994ECS/R. Posiada on cztery kanały DAC oraz dwa kanały ADC podłączone do interfejsu SAI. Komunikacja z mikrokontrolerem odbywa się przez linię I2C współdzieloną z modułem kamery.
Przygotowaną bibliotekę oparłem o kod udostępniony przez firmę ST dla układu STM32F7.
Najpierw inicjalizacja kodeka, lista funkcji wygląda następująco:
Wszystkie wspomniane funkcje obsługują kodek audio. Przesyłają one dane przez I2C do układu.
Przygotowaną bibliotekę oparłem o kod udostępniony przez firmę ST dla układu STM32F7.
Program:
Najpierw inicjalizacja kodeka, lista funkcji wygląda następująco:
- uint32_t wm8994_audio_Init(uint16_t DeviceAddr, uint16_t OutputInputDevice, uint8_t Volume, uint32_t AudioFreq);
- void wm8994_audio_DeInit(void);
- uint32_t wm8994_audio_ReadID(uint16_t DeviceAddr);
- uint32_t wm8994_audio_Play(uint16_t DeviceAddr, uint16_t* pBuffer, uint16_t Size);
- uint32_t wm8994_audio_Pause(uint16_t DeviceAddr);
- uint32_t wm8994_audio_Resume(uint16_t DeviceAddr);
- uint32_t wm8994_audio_Stop(uint16_t DeviceAddr, uint32_t Cmd);
- uint32_t wm8994_audio_SetVolume(uint16_t DeviceAddr, uint8_t Volume);
- uint32_t wm8994_audio_SetMute(uint16_t DeviceAddr, uint32_t Cmd);
- uint32_t wm8994_audio_SetOutputMode(uint16_t DeviceAddr, uint8_t Output);
- uint32_t wm8994_audio_SetFrequency(uint16_t DeviceAddr, uint32_t AudioFreq);
- uint32_t wm8994_audio_Reset(uint16_t DeviceAddr);
Wszystkie wspomniane funkcje obsługują kodek audio. Przesyłają one dane przez I2C do układu.
Kolejna grupa funkcji odpowiada za inicjalizację, zapisywanie oraz odtwarzanie dźwięku to
- opStat_Typedef AudioOutputInit(uint16_t selectedDevice, uint8_t volValue, uint32_t audioFrequency);
- opStat_Typedef AudioOutputPlayArray(uint16_t* playBuffer, uint32_t bufSize);
- opStat_Typedef AudioOutputPlayWav(WAVStructure *wavFilePtr, uint16_t outputDeviceName, uint8_t volValue);
- opStat_Typedef AudioOutputStop(void);
- opStat_Typedef AudioOutputSetVolume(uint8_t volume);
- void AudioOutSetAudioFrameSlot(uint32_t AudioFrameSlot);
- opStat_Typedef AudioInputInit(uint16_t inputDevice, uint8_t volValue, uint32_t audioFreq);
- opStat_Typedef AudioInputRecordArray(uint16_t* pbuf, uint32_t size);
- opStat_Typedef AudioInputStop(void);
- opStat_Typedef AudioInputSetVolume(uint8_t volume);
- opStat_Typedef AudioInputOutputInit(uint16_t inputDevice, uint16_t outputDevice, uint8_t setVolume, uint32_t audioFrequency);
Tutaj podobnie jak poprzednio wykorzystuję strukturę z wskaźnikami do funkcji:
- typedef struct{
- opStat_Typedef (*OutputInit)(uint16_t, uint8_t, uint32_t);
- opStat_Typedef (*OutputPlayArray)(uint16_t*, uint32_t);
- opStat_Typedef (*OutputPlayWav)(WAVStructure*, uint16_t, uint8_t);
- opStat_Typedef (*OutputStop)(void);
- opStat_Typedef (*OutputSetVolume)(uint8_t);
- void(*OutSetAudioFrameSlot)(uint32_t);
- opStat_Typedef (*InputInit)(uint16_t, uint8_t, uint32_t);
- opStat_Typedef (*InputRecordArray)(uint16_t*, uint32_t);
- opStat_Typedef (*InputStop)(void);
- opStat_Typedef (*InputSetVolume)(uint8_t);
- opStat_Typedef (*InputOutputInit)(uint16_t, uint16_t, uint8_t, uint32_t);
- }stmAudio_Structure;
- stmAudio_Structure audioStruct ={
- AudioOutputInit,
- AudioOutputPlayArray,
- AudioOutputPlayWav,
- AudioOutputStop,
- AudioOutputSetVolume,
- AudioOutSetAudioFrameSlot,
- AudioInputInit,
- AudioInputRecordArray,
- AudioInputStop,
- AudioInputSetVolume,
- AudioInputOutputInit
- };
Biblioteki można pobrać z dysku Google pod tym linkiem.