STC32G144K246的IIS做从机的时候,数据不定时出现不对齐问题
使用STC32G144K246的IIS做从机接收数据的时候,随机出现数据不对齐问题,表现为上电有时候正常,有时候不正常,都是断电重启后,上电正常后续就都正常,上电不正常,后续就都不正常。 void DMA_I2SR_ISR(void) interrupt DMA_I2SR_VECTOR{
if (DMA_I2SR_STA & 0x01) // 传输完成中断
{
DMA_I2SR_STA &= 0xfe; // 清中断标志
if (I2SSR & 0x40)// FRE 位
{ // 帧错误,溢出错误,记录或触发一个 GPIO 翻转
P44 = ~P44;//
I2SSR = 0;
}
ready_buffer_index = current_fill_index; // 当前缓冲区填充完成,标记为就绪
current_fill_index ^= 1; // 切换到另一个缓冲区继续填充
I2SR_DMA_Start((u8*)audio_buffer, I2S_DMA_BUFFER_SIZE);// 重新启动 DMA 传输,填充另一个缓冲区
}
}DMA一直提示帧错误
https://www.stcaimcu.com/data/download/Datasheet/STC32G144K246.pdf
有没有可能电源问题 狂热主宰 发表于 2026-6-1 10:21
有没有可能电源问题
{:shuai:}也不太确定是啥问题。我现在一直认为是第一个字节没对齐,后面DMA怎么样都对齐不了了,尝试过在初始化的时候同步一下,但是解决不了。
// 6. ★ 等待 LRCK 下降沿(飞利浦 I2S 左声道开始标志)
// 先确保 LRCK 为高电平(空闲状态),再等待下降沿
P22 = 1; //
while (!P22); // 等待高电平(避免已处于低电平)
while (P22); // 等待下降沿(高→低)
// 7. 使能 I2S 模块
I2SCFGH |= I2S_ENABLE;
// 8. 启动 DMA 传输(从缓冲区 0 开始)
I2SR_DMA_Start((u8*)audio_buffer, I2S_DMA_BUFFER_SIZE);
suqeqylr 发表于 2026-6-1 10:27
也不太确定是啥问题。我现在一直认为是第一个字节没对齐,后面DMA怎么样都对齐不了了,尝试过在初始化的时 ...
供电初期可能有波动
延时启动外设看看
排查可能的问题
狂热主宰 发表于 2026-6-1 10:31
供电初期可能有波动
延时启动外设看看
排查可能的问题
意思是开机启动前延时一下?我目前是有延时50MS等待电源稳定的,可以试试加大一点看看。之前AI8051也遇到过这个问题,最后解决是改成主机模式,但是现在只能用从机模式。 不正常时声音怎么表现? 做好输出一个1Khz的正弦波来评估。我没有遇到过异常的。
电源纹波不要太大,最好小于100mV。
I2S接口的连接线要尽量短,要尽量等长。 梁工 发表于 2026-6-1 14:43
不正常时声音怎么表现? 做好输出一个1Khz的正弦波来评估。我没有遇到过异常的。
电源纹波不要太大,最好 ...
正常时啥都没问题,不正常也是有时候还能听到一点声音,有时候声音都听不出来!电源纹波肯定是有点大了,因为设备是只用一个USB口供电,电流达到600~700MA{:shuai:}等会我找个其他的东西,看看能不能输入一个正弦测试一下 梁工 发表于 2026-6-1 14:43
不正常时声音怎么表现? 做好输出一个1Khz的正弦波来评估。我没有遇到过异常的。
电源纹波不要太大,最好 ...
梁工您好,我刚才又测试了一下,AI8051U和STC32G144K246是一样的情况,就是做为从机接收的时候,声音时好时坏。我已经在系统启动后延迟1S后才初始化IIS外设,IIS输出一个1K正弦波测试了,正弦波每次重新上电都不一样,主机模式就不会这样,也不懂是不是哪里没有设置好,从机全部设置为高阻输入了 suqeqylr 发表于 2026-6-1 15:21
梁工您好,我刚才又测试了一下,AI8051U和STC32G144K246是一样的情况,就是做为从机接收的时候,声音时好 ...
我用过这么多I2S的方案,从没遇到过出问题的。
I2S是一个同步数字接口,输出声音时,工作于主机方式,会稳定的输出数据流,输入声音时,工作于从机方式,会稳定的输入数据流,不会出现时好时坏的。
你看一下数据标准是不是没设置对?常用标准有:
0: I2S飞利浦标准,
1: MSB左对齐标准,
你试下这两种标准。
直接查表输出一个1KHz正弦波测试,以此为评估标准。
I2S1、I2S2双通道同时录放音可以参考我下面的帖子:
录音 / 放音,I2S 接口的应用, 全自动:STC32G144K246-实验箱, 复读机-A率-存储在SRAM
https://www.stcaimcu.com/thread-20751-1-1.html
梁工 发表于 2026-6-1 16:09
我用过这么多I2S的方案,从没遇到过出问题的。
I2S是一个同步数字接口,输出声音时,工作于主机方式,会稳 ...
我看过您写的这个的代码了,我现在示波器实测就是主机的时候BCK会优先一点一点比LRCK跳变,作为从机的时候外部设备输出的时钟LRCK和BCK同时跳变的,不知道是不是这个时序问题导致,主要是从机的时候才有这个问题。AI8051U没有I2SINSEL 这个寄存器先,我使用的AI8051/stc32+6686,6686内部就能输出一个标准的正弦波,配置也改过了,CKCON也配置成1了,文档提到可能会出现DMA竞争。{:shuai:}现在用别的设备改不了IIS的工作模式,不然我就直接改成主机模式就不会那么烦恼了
页:
[1]
2