在測試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 明白了,串口再發一次確實沒有響應了,