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: