關於STM32的硬體IIC使用問題解決方案
最近公司上STM32,對新的東西不太熟悉。直接上手,平臺配置啥的都還算順利,畢竟八位機平臺的東西在。到硬體IIC的時候就出大問題了,剛剛上板子的PCF8563(RTC),我也懶,直接就用ST官方給的庫。剛剛開始幾次可以讀寫PCF8563,後來直接就杯具。查了兩天,發現連STAR訊號都發不出來,直接卡在IIC時鐘使能那個地方。匯流排永遠是忙!實在沒辦法。。。
求助 幾個朋友,其中一種說法是:STM32的抗干擾問題,導致IIC匯流排有動作,讓IIC器件認為忙。要在VDD和VSS,接近管腳的地方加104的電容。有可能是這種原因,不過我手頭板子限制,我沒辦法加電容,我沒有試,要不誰試一下。
然後到網上一搜,乖乖,原來不只是我碰到這個問題,N多人都碰到這個問題,官方也出了一個修定基本承認這是一個硬體BUG。杯具了,很多人都直接用IO直接模擬了。我的日程安排也打算,再弄一個早止,如果不成我也直接用IO模擬了。
繼續調,繼續搜。在一個BLOG(實在對不起,由於大量的檢視網頁,我實不記得那部落格是哪的了)裡看到有這麼一個說法:首先是,應用時序不完全標準。其次是,IIC自動ACK的問題。受這個啟發我從新整理IIC的時序。
由於是匯流排一開始就是忙,那我在配置IO的時候,就先更改IO狀態,讓IO先全部拉高。想當於強制釋放匯流排,然後再配置IO和IIC。一看,嘿嘿,IIC不忙了。大喜!!!理所當然,接下來的寫函式也正確了,至少沒有出現STAR發不出的情況。到讀資料,杯具又出現了!又當在了發STAR的時候,我都無語了。鬱悶過後,仔細跟蹤進去發現:第一次讀資料是正確的,而第二次讀資料的時候才出現了STAR不能發的情況。我又從新組織一個讀的IO配置程式,無果。又陷入無語。能讀出第一個資料,那麼我的讀時序肯定是沒有問題的,可為啥第二次讀的時候就杯具呢?我單步進入函式,更驚奇的發現竟然單步讀資料能讀出來!!會不會真的是傳說中的自動ACK設定的問題呢?我測試了一下,無解。然後,想想單步和全速的區別,難道還真是速度?加了一個延時函式在每一次讀的後面,OK,世界就這麼清淨了!
我承認,期間我問候了ST很多工程師的家人,實在不好意思。
總結(其實我硬體電路基礎很垃圾,我就YY一下,不對的歡迎指正):
1.匯流排總是忙的問題,這個我覺得可能和IO結構和IIC狀態機有關。不知道ST怎麼弄的,感覺這個IO像是能“記憶”一樣,把過去的值和干擾都記住了,死活不忘掉。
2.至於後面的ACK,這個可能與它的IIC狀態機有關。狀態機剛剛應ACK,就直接置標誌,而實際上ACK遠沒有結束,而使用者直接就進行下一步操作,這當然杯具。同樣的地況在MSP430裡的UART一德行。