在测试I2S时,我改动wm_demo.h,只留下i2s相关的命令。
执行以下命令,使能I2S相关的引脚、使能I2S外设时钟:
t-i2sioinit
执行以下命令,启动I2S发送,进行简单测试代码(最后一个参数=0走中断,=1走DMA):
t-i2s=(0,1,44100,16,0,0)
串口调试工具结果如下:
t-i2s命令对应于demo/wm_i2s_demo.c文件里的tls_i2s_demo函数。
结合串口工具分析发现,它调用 tls_i2s_tx_int_demo();函数完成数据发送,因为我在它之前加了个printf("i2s tx int.n");函数。它执行完确实会打印send:xxx的信息。
在tls_i2s_tx_int_demo函数的结尾,对于中断,会执行收发关闭操作。代码如下:
if (WM_I2S_MODE_INT == mode)
{
wm_i2s_tx_rx_stop();
tls_dma_free(tx_channel);
tls_dma_stop(ch);
tls_dma_free(rx_channel);
printf("\ntest done.\n");
}
经过调试发现,卡死在tls_dma_free()函数。如果只开启中断,那就没有打开DMA。那么为什么要释放DMA?在DMA stop函数里,忙等DMA是否结束。然后一直卡死!你们也有这个问题吗。请进行检查。还是只有我这样。
可能我没表达清楚。他们都有波形出来。但是前者(末尾参数为0,走中断),你再次发送命令,串口无输出。你的第二个图,如果你在发一次,串口还是有输出的。也就是说,走中断的方式,第一次波形产生成功,然后就卡死在wm_i2s_tx_rx_stop()函数里,这个函数关闭I2S,关闭DMA,DMA都没开,参数是0x3FFF,然后忙等这个参数变为0,可能吗?
t-i2s=(0,1,44100,16,0,0)
这句话你发一次,串口有输出。你再发一次,串口还有输出吗?我这里是没有的。debug排查是卡死在关DMA那里。我这里代码都屏蔽了关DMA的两行,就好了。
@haoronMango 明白了,串口再发一次确实没有响应了,