I am trying to run TLV320AIC3110 on my board with STM32F7 on board
In the debugger, I see that all the registers were successfully written to TLV320AIC3110 during initialization
Data is visible on the oscilloscope, but TLV320AIC3110 is silent
Here is my code:
void Application::Init() {
BoardSupportPackage::Init();
auto audio = TLV320AIC3110(Peripheral::hi2c1);
audio.CodecReset();
audio.SetFrequenciesSetting(48000);
audio.ConfigureAudio();
audio.ConfigureMic();
audio.AudioVolumeControl(30);
audio.CodecUnmute();
audio.CodecMute();
int16 signal[46876];
int nsamples = sizeof(signal) / sizeof(signal[0]);
int i = 0;
while(i < nsamples) {
double t = ((double)i / 2.0) / (double)nsamples;
signal[i] = 32767 * sin(100.0 * (2.0 * 3.14159265358979323846) * t); // left
signal[i + 1] = signal[i]; // right
i += 2;
}
while(1) {
auto res = HAL_SAI_Transmit(&Peripheral::hsai_BlockA2, (uint8*)signal, nsamples, HAL_MAX_DELAY);
if(res != HAL_OK) {
Peripheral::CriticalError();
}
}
}
STM32 SAI HAL:
hsai_BlockA2.Instance = SAI2_Block_A; hsai_BlockA2.Init.Protocol = SAI_FREE_PROTOCOL; hsai_BlockA2.Init.AudioMode = SAI_MODEMASTER_TX; hsai_BlockA2.Init.DataSize = SAI_DATASIZE_16; // -- hsai_BlockA2.Init.FirstBit = SAI_FIRSTBIT_MSB; hsai_BlockA2.Init.ClockStrobing = SAI_CLOCKSTROBING_FALLINGEDGE; hsai_BlockA2.Init.Synchro = SAI_ASYNCHRONOUS; hsai_BlockA2.Init.OutputDrive = SAI_OUTPUTDRIVE_ENABLE; hsai_BlockA2.Init.NoDivider = SAI_MASTERDIVIDER_ENABLE; hsai_BlockA2.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_1QF; hsai_BlockA2.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_48K; hsai_BlockA2.Init.SynchroExt = SAI_SYNCEXT_DISABLE; hsai_BlockA2.Init.MonoStereoMode = SAI_STEREOMODE; hsai_BlockA2.Init.CompandingMode = SAI_NOCOMPANDING; hsai_BlockA2.Init.TriState = SAI_OUTPUT_NOTRELEASED; hsai_BlockA2.FrameInit.FrameLength = 64; // -- hsai_BlockA2.FrameInit.ActiveFrameLength = 32; // -- hsai_BlockA2.FrameInit.FSDefinition = SAI_FS_CHANNEL_IDENTIFICATION; // -- hsai_BlockA2.FrameInit.FSPolarity = SAI_FS_ACTIVE_LOW; // -- hsai_BlockA2.FrameInit.FSOffset = SAI_FS_BEFOREFIRSTBIT; // -- hsai_BlockA2.SlotInit.FirstBitOffset = 0; hsai_BlockA2.SlotInit.SlotSize = SAI_SLOTSIZE_DATASIZE; hsai_BlockA2.SlotInit.SlotNumber = 2; hsai_BlockA2.SlotInit.SlotActive = SAI_SLOTACTIVE_0 | SAI_SLOTACTIVE_1;
My scheme:
The library that I rewrote from the Linux driver:
