最近在做关于音频的项目,项目是这样的和ath8809通信,用sai接口,时钟频率为256k,采样率为8k,stm32f767做为从设备,采用pcm短帧格式,单声道,发现通信一段时间,出现帧滞后的现象,不知道我哪配置的不对,下面是我的代码,哪位大佬可以指点我一下,谢谢啦(通过示波器抓取ath8809给我发来的数据,是一帧32位,只有前16位有效,后面全是0)
HAL_SAI_DeInit(&sai1b_handler);
sai1b_handler.Instance = SAI1_Block_B;
sai1b_handler.Init.AudioMode = SAI_MODESLAVE_RX;
sai1b_handler.Init.Synchro = SAI_SYNCHRONOUS;
sai1b_handler.Init.OutputDrive = SAI_OUTPUTDRIVE_DISABLE;
sai1b_handler.Init.NoDivider = SAI_MASTERDIVIDER_DISABLE;
sai1b_handler.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_1QF;
sai1b_handler.Init.MonoStereoMode = SAI_MONOMODE;
sai1b_handler.Init.Protocol = SAI_FREE_PROTOCOL;
sai1b_handler.Init.DataSize = SAI_DATASIZE_16;
sai1b_handler.Init.FirstBit = SAI_FIRSTBIT_MSB;
sai1b_handler.Init.ClockStrobing = SAI_CLOCKSTROBING_RISINGEDGE;
sai1b_handler.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_8K;
sai1b_handler.FrameInit.FrameLength = 32;
sai1b_handler.FrameInit.ActiveFrameLength = 1;
sai1b_handler.FrameInit.FSDefinition = SAI_FS_STARTFRAME;
sai1b_handler.FrameInit.FSPolarity = SAI_FS_ACTIVE_HIGH;
sai1b_handler.FrameInit.FSOffset = SAI_FS_BEFOREFIRSTBIT;
sai1b_handler.SlotInit.FirstBitOffset = 0;
sai1b_handler.SlotInit.SlotSize = SAI_SLOTSIZE_16B;
sai1b_handler.SlotInit.SlotNumber = 2;
sai1b_handler.SlotInit.SlotActive = SAI_SLOTACTIVE_0|SAI_SLOTACTIVE_1;
HAL_SAI_Init(&sai1b_handler);
saib_dma_enable();
// __HAL_SAI_CLEAR_FLAG(&sai1b_handler,SAI_FLAG_AFSDET);
// __HAL_SAI_CLEAR_FLAG(&sai1b_handler,SAI_FLAG_LFSDET);
HAL_SAI_DeInit(&sai1a_handler);
sai1a_handler.Instance = SAI1_Block_A;
sai1a_handler.Init.AudioMode = SAI_MODESLAVE_TX;
sai1a_handler.Init.Synchro = SAI_ASYNCHRONOUS;
sai1a_handler.Init.OutputDrive = SAI_OUTPUTDRIVE_DISABLE;
sai1a_handler.Init.NoDivider = SAI_MASTERDIVIDER_DISABLE;
sai1a_handler.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_1QF;
sai1a_handler.Init.MonoStereoMode = SAI_MONOMODE;
sai1a_handler.Init.Protocol = SAI_FREE_PROTOCOL;
sai1a_handler.Init.DataSize = SAI_DATASIZE_16;
sai1a_handler.Init.FirstBit = SAI_FIRSTBIT_MSB;
sai1a_handler.Init.ClockStrobing = SAI_CLOCKSTROBING_RISINGEDGE;
sai1a_handler.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_8K;
sai1a_handler.FrameInit.FrameLength = 32;
sai1a_handler.FrameInit.ActiveFrameLength = 1;
sai1a_handler.FrameInit.FSDefinition = SAI_FS_STARTFRAME;
sai1a_handler.FrameInit.FSPolarity = SAI_FS_ACTIVE_HIGH;
sai1a_handler.FrameInit.FSOffset = SAI_FS_BEFOREFIRSTBIT;
sai1a_handler.SlotInit.FirstBitOffset = 0;
sai1a_handler.SlotInit.SlotSize = SAI_SLOTSIZE_16B
sai1a_handler.SlotInit.SlotNumber = 2;
sai1a_handler.SlotInit.SlotActive = SAI_SLOTACTIVE_0|SAI_SLOTACTIVE_1;
HAL_SAI_Init(&sai1a_handler);
saia_dma_enable();
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
那你直接用8809接DAC试试?
DMA的FIFO 是硬件控制的,不会覆盖,但是你必须有目标地址,他会自动搬运到目标地址
一周热门 更多>