今天來討論一個I2C走線問題,過程是通過用ST提供的IBIS模型,從SI的角度出發,做SI仿真來評估STM32的I2C信號和確定Layout走線到底能走多長。
這里我選擇了STM32F765XX-LQFP144封裝的IBIS模式來實驗,在Hyperlynx上把Layout模型電路畫好如下圖所示,U1使用STM32的PF0腳作為發送端,這個腳可以復用為SDA信號,U2使用STM32的PF0作為接收端,TL1、TL2分別為10in(25.4厘米)和1in(2.54厘米)的微帶線走線,R1為上拉電阻。
圖1. 使用STM32F765系列LQFP144封裝的IBIS模型搭建的電路
搭建好Layout電路后,打開Model Selector給U1和U2賦予對應的IBIS模型,可以看到,ST提供的STM32 IO有四種速度等級,和帶或不帶上下拉電阻幾種,如下。
圖2. IO有4中速度等級模型,每種又分帶或不帶上下拉電阻
上圖中可以看到,IO內置的上拉電阻比較大,實際使用中一般不用內置電阻,都是外掛上拉電阻,所以我們 先選擇最低速度SPEED0不帶上下拉的模型驗證 。
設置好模型后運行仿真,設置仿真條件為Oscillator模式,速率400K,IC modeling為Fast-Strong模式,模擬I2C以400K時鐘速率運行,查看接收端波形如下圖所示,可以看到波形很好,沒有什么比較嚴重的過沖啥的,沒啥問題。
圖3. 速度等級為SPEED0,Layout走線11in(29.29厘米),400K速率運行波形正常
現在對標我們平時的產品設計,有時I2C會繞板子不止28.29厘米這么長,那我們試試把長度拉大到50厘米,設置TL1為20in(長度50厘米多),然后再運行仿真得到如下圖結果。
圖3. 速度等級為SPEED0,Layout走線21in(53.34厘米),400K速率運行波形有過沖
可以看到這時對于接收端接收到的波形,過沖有點嚴重了,因為STM32的IO可以兼容5V電平,所以這里高電平的過沖還沒超過5V,我們就先不管。但是低電平時的下沖有318.7mV了。那到底要不要管呢?首先我們去翻下規格書,在規格書中找到電壓特性表如下所示。
可以看到對于輸入下沖信號,最小電壓值是VSS-0.3V,即所選STM32的IO能接受的下沖最大為-0.3V,不能超過-0.3V。現在再看上面仿真的下沖電壓,顯然已經越過這個值。
芯片如果長時間在這樣的條件下工作,可能一段時間后,IO就損壞失效,這也是我們很多產品在客戶現場使用,一段時間后芯片的某個IO損壞的原因之一,就是Layout處理不好,有過沖、下沖超過IO極限值導致。當然,也有可能是其他原因導致,比如ESD之類的。
圖4. STM32規格書中的IO輸入電壓極限值
那對于STM32的I2C Layout走線多長適合呢? 這里我嘗試了不同長度仿真分析,總結為,對于STM32F7系列的芯片來說,IO速度等級為慢速,I2C Layout走線不建議超過45厘米 。其他系列的可以參考這個信息輕微浮動,如果可以的話,盡可能使用IBIS模型仿真評估。
那是不是得到這樣的結論后我們就可以結束了呢?不,其實還有一大堆坑。上面我特別的去強調我使用的IO的速度等級是SPEED0,慢速等級。圖2中我們看到還有3種速度等級可以選用,實際中我們也可以代碼配置為另外的3種速度等級,那如果我們更改下速度等級會不會有影響呢?這里我馬上做了嘗試,保持Layout走線長度為上面結論的45厘米長,把輸出IO的速度等級換為SPEED1,運行仿真得到結果如下。從結果可以看到,速度等級升高后,上面的結論就不成立了,此時高電平的過沖仍然還在可接受范圍內,但下沖就不是那么友善了,都-905.4mV了,這樣搞,芯片不壞都天理難容。
圖5. 把IO速度等級換為SPEED1,Layout走線長度保存45厘米,仿真有嚴重過沖
從上面這個步驟來看,速度等級增加后,會使過沖變得嚴重,那這樣的話,我們就不嘗試SPEED2了,直接看SPEED3,看看最高速度等級到底會糟糕成什么樣。同樣保持Layout走線長度為45厘米不變,IO速度等級調整為SPEED3,運行仿真得到結果如下。嗯,看起來還好,沒有糟糕到可以炸板,相對SPEED1來說,高電平過沖也還在可接受范圍,下沖多了幾個mV。
圖6. 把IO速度等級換為SPEED3,Layout走線長度保存45厘米,過沖情況跟SPEED1差不多
實驗到這里我突然好奇,現在ST主推用CubeMX來自動生成配置代碼,用戶在使用I2C時,它的IO會默認配置為什么樣的速度等級?于是我馬上打開CubeMX做了個嘗試,很快就得到了答案,不過看完我傻眼了,默認配置為SPEED3,如下圖所示。
根據上面仿真情況,我想了想,要是哪天哪位冤種用這配置代碼放在一個主控到I2C從機設備線纜比較長的產品中,要是出問題了,估計加班排查好久都不一定查出來。
圖7. CubeMX對于I2C的IO速度等級默認配置為SPEED3
說到上面的大冤種情形,想起2年前做的一個產品,產品也是主板上通過線纜把I2C信號拉到子板上配置子板的芯片,線纜有50厘米長。當時I2C主機總會莫名其妙的把子板芯片搞掛,最后發數據沒ACK,需要重新給子板上電后才能恢復正常,但過一會又不行,當時搞得也是頭疼。當時使用的主控是Altera的FPGA,排查無果后我倒回去重新看FPGA的規格書,在IO特性里發現IO的上升下降沿都比較陡,當時就覺得是遇到SI的問題了,然后就馬上調了FPGA的IBIS模型搭模型電路仿真,結果跟猜測一樣。
理論、仿真分析確認問題點后,因為FPGA的IO特性就那樣,沒辦法去改變,想了想后就找了顆上升、下降沿沒那么陡的電平轉換芯片,放在FPGA IO和子板芯片IO之間做緩沖,最后問題解決。
嘮嗑完大冤種后,我們再來看看使用SPEED3時,留給Layout的走線長度裕量還有多少。經過反復嘗試,最終定下來對于我使用的STM32F765XX-LQFP144這顆芯片,使用I2C外設,如果IO速度等級配置為SPEED3模式的話,保險Layout走線長度建議控制在0.6in(1.524厘米)內,下圖為控制長度為0.6in的仿真結果,長了就下沖厲害。
圖8. IO速度等級為SPEED3時,控制Layout走線在0.6in時的仿真結果
驚訝吧!1.524厘米長,把這個約束給Layout工程師估計會被打死,所以對于STM32的I2C Layout要求,硬件設計時可以使用前面建議的45厘米長度約****束,但必須注意要求軟件把IO速度等級配正確 ,不然大家都得加班查Bug。
原理講解
現在我們經過一波仿真實操驗證后,知道了STM32的I2C Layout最大走線長度的參考,那究竟是什么原因導致我們的Layout走線沒法再增長呢?下面我簡單解釋下。
首先對于我們看到的Layout走線,細化去看的話,可以等效為下圖所示的電路模型,由寄生電感和寄生電容構成。信號在上面傳輸時,如果電平翻轉的上升、下降沿比較陡,那么在接收端接收到的電壓不再等于輸出端的電壓,而是V=L*di/dt。
從這個公式可以看到,影響電壓V的就是寄生電感L和IO的上升、下降沿dt,所以解決V不過度變化大的方法就是要么讓L盡可能小,要么就是讓上升、下降沿增大。L變小就是走線盡可能短,IO上升、下降沿增大一般就是找電平轉換芯片來做做緩沖改善。
圖9. Layout走線的寄生電路模型
如果對于上面的理論還是難以理解,那沒問題,我們直接來搭一個電路仿真看看也可以。參考上面電路模型我們搭一個電路和仿真如下,電路設置輸出周期15ns,50%占空比的波形,上升沿、下降沿設置為3ns,可以看到,輸出波形震蕩過沖和下沖還是比較大。
圖10. 搭建Layout走線電路模型,設置上升、下降沿為3ns仿真波形
我們再把上升、下降沿時間縮小到1ns看看,仿真結果如下,可以看到過沖、下沖更大,所以這也驗證了上面的理論解釋。
圖11. 搭建Layout走線電路模型,設置上升、下降沿為1ns仿真波形
同樣為了論證減小L帶來的改善,在上圖11的基礎上,把寄生電感縮小為0.1nH,運行仿真,從仿真結果來看,已幾乎不再有過沖、下沖,也符合我們理論解釋情況。
圖11. 搭建Layout走線電路模型,設置寄生電感為0.1nH的仿真波形
-
STM32
+關注
關注
2270文章
10896瀏覽量
355781 -
I2C總線
+關注
關注
8文章
390瀏覽量
60917 -
寄生電感
+關注
關注
1文章
155瀏覽量
14595 -
FPGA芯片
+關注
關注
3文章
246瀏覽量
39795 -
LQFP封裝
+關注
關注
0文章
10瀏覽量
7391
發布評論請先 登錄
相關推薦
評論