在测试 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 明白了, 串口再发一次确实没有响应了,