STM32 I2C 總線佔用問題解析

这几天解决 STM32 MCU的I2C 总线占用(bus BUSY) 问题,觉得是不错的学习,从文中可得知I2C问题的思考逻辑逻,文末并指出经常出错的问题点,在此分享给大家。

问题描述

  1. STM32F207 MCU有三组I2C,I2C1~I2C3,此项目的初版硬件使用I2C1接三颗chip (DSP/Codec/EEPROM),运作良好。
  2. 但新硬件把Codec/EEPROM移到I2C3,DSP还是留在I2C1,发现I2C3有机会传输失败,失败時log打总线占用(Bus BUSY)
  3. 查MCU datasheet,BUSY意思为register I2C3_SR2[bit1]=1,代表SCL/SDA曾经 low而且没出现 stop condition,导致MCU无法开始传资料

  4. I2C3 BUSY和时序有关,在程序加个delay就莫名PASS,再加delay又莫名BUSY。有些程序造成I2C3 100% BUSY,有些程序是60% BUSY

分析方向

  1. 观察I2C3 SCL/SDA波形
  2. I2C3在初版硬件没用过,初始化是否有问题?
  3. 观察BUSY时机,何时开始,何时结束
  4. 和chip有关?将 Codec和Flash断开
  5. 和I2C bus有关?将Codec接到 I2C1测试
  6. 为何初版硬件没问题?

分析過程

  1. 剛開始不太穩定,莫名的連續一直BUSY,有時一直PASS,而且LED時亮時暗
    > 量電壓發現VDD3.3V不穩,high > low > high > low 震盪
    > 加大LDO之後VDD3.3V穩定了(Solution1),但I2C3還是BUSY
  2. 東改西改,發現一版100% PASS的軟件,和另一版100% FAIL的軟件,只差在delay,應該還有其他問題
  3. 量波形,I2C1(DSP)很正常,I2C1 init之後一直FREE,只有傳資料期間才BUSY
  4. 100% BUSY的軟件,在I2C3 初始化之後SCL/SDA停在2.6V,當VDD3.3V ON 後才升到3.3V
  5. 100% PASS的軟件,波形同上,但之後開LED時因為LDO供電不足,SCL/SDA被短暫下拉,馬上回到3.3V

    應是因為SCL/SDA短暫下拉,誤打誤撞造成SCL/SDA high > low > high離開BUSY,有兩個證據
    證據一,如果沒下拉,I2C3就一直BUSY:
    a. 斷開小板(上面有LED) 以降低VDD3.3V電流,不會短暫下拉 > 100% PASS的軟件變成100% FAIL
    b. 斷開小版LED以降低VDD3.3V電流,不會短暫下拉 > 100% PASS的軟件變成100% FAIL
    c. 軟件關閉LED以降低VDD3.3V電流,不會短暫下拉 > 100% PASS的軟件變成100% FAIL
    證據二,如果有下拉,I2C3從BUSY恢復成FREE:
    a. BUSY時設SCL/SDA為GPIO out,拉low > high > low > high,重新初始化SCL/SDA (workaround) > 離開BUSY並可傳I2C指令
    b. BUSY時手動把SCL拉電線接地 ? 離開BUSY並可傳I2C指令
    c. 100% BUSY軟件就是因為沒下拉波形才會100% FAIL
    PS: 開LED造成電流超出LDO負荷也是問題,須加大LED電阻或更換LDO
  6. SCL/SDA短暫下拉不是造成BUSY的原因,重點在SCL/SDA有0.8s處於2.6V不正常電壓,原因可能有:
    - flash/codec去拉SCL/SDA
    - MCU去拉SCL/SDA
    - SCL/SDA上拉電阻不正確
    - SCL/SDA的上拉電路接在stby3.3v,可能stby3.3v不穩


  7. 斷開flash還是BUSY,而且SCL/SDA還是有0.8秒被下拉到2.6v
    > 和flash無關
  8. 斷開codec後,SCL/SDA不會下拉到2.6v,但I2C3還是BUSY
    > 懷疑Codec供電不正確,檢查I2C3初始化當下的VDD3.3v (供給Codec電壓),發現VDD3.3V本應處於無電狀態(0V),但實際量得2.7V,對codec是不正常電壓,可能造成工作異常
    > MCU將VDD3.3V提早開電(得到3.3V),確保I2c3初始化時Codec正常工作,SCL/SDA下拉電壓消失 (Solution2)
    > I2C3還是BUSY,其實還需要下個Solution

  9. 比較I2C1和I2C3初始化,發現重要差異:
    I2C1 pins(PB7, PB6)都在GPIO group B,共用一組GPIO register,填一次register可初始化兩根pin
    I2C3 pins(PA8, PC9)分在GPIO group A和C,必須分兩次初始化,先SDA再SDL
    > 懷疑初始化順序錯誤,因此改成讓I2C3先初始化SCL再SDA,終於PASS!(Solution3)

其他實驗

  1. 基本電路檢查: SCL/SDA pull high電阻都是4.7KR,Stby3.3v是穩定3.3V,SCL/SDA沒接反,Codec的25Mhz clock穩定
  2. 將Codec從I2C3移到I2C1,可正常傳輸 > 被誤導以為和Codec無關

結論

  1. BUSY問題需要三個Solution. 
    a. 加大LDO讓VDD3.3V穩定供電
    b. I2C3先初始化SCL再SDA。雖然datasheet沒寫此限制,但sample code確實依照此順序執行初始化。
    c. 為確保Codec在I2C3 初始化時有正常電壓(VDD3.3v=3.3v),將VDD3.3V移到I2C3初始化之前
  2. 及一個workaround 
    - 為確保BUSY時可恢復,當BUSY時將SCL/SDA設為GPIO out,然後pull low > high > low > high,再重新初始化I2C3
    舊硬件沒問題是因為
    a. 舊硬件 LDO較強力,無供電問題
    b. 舊硬件VDD3.3v無法由MCU開關,而是由stby3.3v穩定供電,因此無SCL/SDA 2.7V問題
    舊硬件只用I2C1,沒用I2C3。I2C1兩根pin在同一個GPIO group,無SCL/SDA初始化順序問題

以後I2C問題可檢查

    1. 電路:pull high電阻,pull high電壓,slave device供電
    2. 軟件:I2C SCL/SDA初始化,slave device初始化timing
    3. SCL/SDA檢查:SCL是否穩定,SCL/SDA電壓,slave device有回ACK? 傳輸資料是否正確
    4. 斷開I2C3 chip做測試
    5. 量測slave device期望的时序和MCU送出得是否一樣
时间: 2024-12-20 01:19:40

STM32 I2C 總線佔用問題解析的相关文章

BT觀念分享和常見問題彙整

一. TCP/IP基本觀念 1. IP : 每台在TCP/IP網路上的電腦必須具備的一個代表號或一個地址.IP又分為private IP(192.168.x.x /10.x.x.x /172.16.x.x~172.31.x.x)和public IP(除了少數特殊IP,只要不是private IP就是public IP). 2. port : port可視為TCP/IP網路中電腦提供的某種服務的門牌號碼,號碼(port的數值)是多少不重要,號碼代表的服務才重要.例如: port80代表web的服務

[亂數] <細說> C/C++ 亂數基本使用與常見問題

陸陸續續寫了 EA  一.二年,以前亂數引導文回頭看時才發現,怎麼有這麼多細節的錯誤.沒系統. 這篇文章主要引導初學者使用亂數,同時附上常被翻出來討論的議題,C/C++適用,唯以 C 語言撰之. 也由於是引導初學者,所以在某些用詞上會較不正確, 像 compiler.IDE 會故意混為一談. 另外亂數原理也全都跳過 < 重點是亂數的產生原理也不只一種 >. 另本文附程式碼,不附執行結果,有興趣自己跑一遍. 最後請注意本文在區間表達裡,開區間與閉區間 括號的使用,也就是, [a, b]  ,  

解決數據質量問題是大數據應用的關鍵

研究稱,整個人類文明所獲得的全部數據量,有90%是最近兩年內產生的.隨著移動互聯大潮的席捲,預計通過網路產生的數據量還將呈幾何級增長.龐大的數據資源蘊藏著無限的寶藏,過去的一年無論是企業.政府還是媒體,都在談論大數據.有人說大數據是黃金.是競爭力,然而在這一切談論的背後卻鮮有人關注數據質量這個最根本的問題.普元數據產品總監王軒認為,大數據處理的關鍵就是解決數據質量問題,規避數據錯誤.保障數據質量才能真正讓企業從大數據應用中獲得利益.保障數據質量成為大數據發揮價值的先決條件「企業做數據集成.數據處

網站優化遇到最常見的其中一個問題

就是遲遲都未有排名阿! 到底是什麼原因導致的呢? #1 robots.txt文件 Robots .txt文件對網站優化前期至關重要,設置得好網站優化排名周期縮短,弄得不好,連網站收錄都成問題.例如許多網站上線或者改版之後,常常會在百度快照上看到這樣的一句話“由於該網站的robots.txt文件存在限制指令,系統無法提供該頁面的內容描述”一般都不懂的新手們,都會以為搜索引擎抓取出問題了吧,怎麼搞的.其實,這明顯就是因為網站robots文件屏蔽操作導致的,對於這種情況,網站不收錄完全就是正常情況.

繁體字顯示問題

宋體筆畫設計簡單,加之hint的作用,所以實用性很高.MingLiU筆畫很有藝術性,hint不好做,所以必須用大字號才能看清楚其細節.因為電腦顯示技術的限制,導致其在普通字體大小下,筆畫基本上是貼在一起,非常不實用.日文有很多字體,主流是哪種我也不知道,不過總體的觀感就是既美觀又實用.簡體字設置成宋體13px,已經基本上能看清楚,正文是16px,效果更好,可以打80分.繁體字設置微軟正黑體,或者宋體,在16px就差強人意了.繁體字設置成MingLiU,如果要求筆畫不發虛,拐角能看清楚,則最少需要

大數據時代的不平等問題

一家國際著名保險公司與提供大數據的公司合作,推出一款針對不同駕車群體的保險計劃.這一計劃的要點是,由大數據公司對不同潛在客戶的駕車習慣進行分析,如果數據表明某位客戶是白天上班,路也近,而且所經過的地帶是安全路線,客戶駕車習慣良好,沒有特別情緒化舉動,那麼,給其所賣的保險可以打折:反之,如果數據表明某位客戶是上夜班,上班地點也遠,所經過的路線有風險,客戶駕車習慣也不好,常無法控制自己的行為,那麼,保險公司將提高其所繳納保費額度.從商業角度看,保險公司這樣做,是為了更精確地細分市場,賺取更高利潤,這

何解決 LinqToExcel 發生「無法載入檔案或組件」問題何解決 LinqToExcel 發生「無法載入檔案或組件」問題

在自己的主機上透過 Visual Studio 2013 與 IISExpress 開發與測試都還正常,但只要部署到測試機或正式機,就是沒辦法順利執行,卡關許久之後找我協助.我發現錯誤訊息確實很「一般」,訊息是:「 無法載入檔案或組件 'LinqToExcel' 或其相依性的其中之一. 試圖載入格式錯誤的程式. 」或是英文版的「 Could not load file or assembly 'LinqToExcel' or one of its dependencies. An attempt

[three.js] 解決貼圖無法重複的問題 Solving with Texture RepeatWrapping Fail Issue

有些东西,你想找的时侯,怎么也找不到, 而有些东西,不经意间,随处可见: 本以为这是生活中常见的事情, 然而在浩瀚的互联大海中,也是如此. 平时的积累是为了一时之需, 几分钟的投入, 积累起来, 也会成为汪洋大海, 载起一帆小舟, 不至搁浅. 平时注一入滴水, 需时拥有太平洋, 广告词很好, 然而它真正的意义又有几人能真正领悟呢! 附一个不错的 threejs 开源链接: https://github.com/rmx/threejs-collada [three.js] 解決貼圖無法重複的問題

安卓中級教程(4):ScrollView與ListView之間的高度問題

在scrollView中加插ListView是一個大難題.其中一個難題是Listview的高度難以計算,輸出效果往往強差人意,就讓我們看看當中的問題 . <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_pa