1. 程式人生 > >關於STM32的I2S通訊飛利浦協議和MSB協議

關於STM32的I2S通訊飛利浦協議和MSB協議

最近公司一個專案要用到CODEC晶片來做語音的採集和輸出,驅動是用的STM32F405的I2S介面。之前沒有深入的瞭解過I2S的知識,只是大概的知道它是一種用於傳輸音訊資料的匯流排。本來以為沒什麼難的,實際用下來其實也沒感覺有有什麼特別的。但是還是在使用的過程中把自己坑了一把。 
CODEC晶片型號是MAX9867,主要的應用場合是手機和助聽器之類的。要實現STM32驅動的程式碼我首先是看MAX9867的資料,CODEC晶片的資料上並沒有說知否支援I2S的飛利浦協議,只是把每一種配置的時序圖表示了出來。我配置的時序如下圖所示:

@MAX9867 配置的通訊時序圖

然後繼續看STM32的手冊上是否有和這個時序匹配的通訊配置,STM32支援的通訊協議有4種。

@支援的通訊協議

@I2S Philips 標準
我們看到這兩種時序圖表示方法不同,一個是上升沿鎖存資料,一個是下降沿改變資料,但是本質是一樣的。然後都是左聲道在前,並且用低電平表示左聲道。既然時鐘極性和聲道控制都相同,而且這個配置也是CODEC晶片的預設配置,而且也是STM32的第一個配置。然後我就按照這個方式來配置CODEC晶片和STM32驅動,並且也實現了MIC聲音採集並通過喇叭播放的功能。到這裡我當然不會認為通訊有什麼問題,因為這如果有問題語音資料是不可能做到採集和播放的。 
但是後邊問題來了,由於播放MIC採集的聲音有雜音,為了定位問題出在什麼地方我就在FLASH中存了一段固定的語音用CODEC進行播放。結果播放出來的聲音基本上都被噪音蓋過去了,用示波器看輸出的音訊訊號非常雜亂。但是同樣的語音資料在ST的官方開發板上去播放就是很純淨的音樂聲。這個問題就讓我很不能理解了,不知道該如何去解決了。 
最後在同事的協助下再去檢視手冊,這才發現CODEC的時序和STM32的時序並不是匹配的。我們可以看到飛利浦協議第一個時鐘上升沿鎖存的資料是無效的,而CODEC晶片第一個上升沿鎖存的資料是有效的。這就造成STM32傳輸到CODEC的資料最高位會被損失掉,但是在同樣的MIC採集並播放的過程中由於採集和播放的協議是匹配的,所以語音就只是最後一位被損失掉了,並不會對聲音資料造成大的損失。 
既然問題找到了,那麼就要就決絕它了。我們看到STM32支援的協議中有一個叫MSB對其標準的,我們看這個時序圖和COEDC的時序圖是完全匹配的。修改STM32的配置,播放語音資料,聲音完美輸出。

@MSB 對齊標準

這個教訓還是比較深刻的,以後再遇到這種時序不太熟悉的協議時一定要把手冊認真的看完,要把協議的時序完全搞明白

轉自:

:http://blog.csdn.net/yedapeng2011/article/details/77075031?reload