Residual Voltage on I2C Bus that Could Lead to Logic Fail


前言: 本來計畫是想每週更新, 但一不小心怠惰就欠了好多債.. 這周末要來認真還債了!
-------------------------------------------------------------------------------------------------------------------------

今天遇到一個有趣的I2C問題:所設計的HDMI port外接螢幕時出現相容性問題,有些螢幕可以認到,有些卻不行。勾了DDC (Basically same as I2C)波型發現有些不正常的地方:


0. 這是HDMI HPD偵測到後的第一個I2C packet
1. 發現在5V domain,I2C Host無法下拉到0V,而是仍有~1.2V殘壓 => 造成Device端可能無法辨認到Logic low (V_IL, max = 0.3 * 5V = 1.5V),進而不同外接螢幕產生相容性問題。
2. 但第9個Bit (ACK from the device)看起來就可以被拉到接近0V,表示說只有在Host端Open-drain (OD) driver工作時會產生殘壓現象!?
3. 其實是後來才發現的第三點:在1V8 domain每個Falling edge其實起初都有往下拉,但又被快速充電回到約~0.35V (關鍵)

於是開始檢查起線路:這是個簡單用單顆NMOS做成的Level Shift
當Host output low (OD on)時,應該要將Bus左側(1v8 domain)拉到接近0V,而此時NMOS因VGS > VGS_th (max. ~1.5V in this case)而D-S導通將右側(5V domain)也下拉。就在此時突然發現上述第3點,其實起初Level Shift是正常運作下拉卻又被充電。原來是NMOS導通後從右側5V端多出個Sink current (Id_sink)須經由Host端流到地,但此時這Id_sink會對路線上的Cbus充電,結果充電造成NMOS VGS下降!
當VGS持續下降至無法滿足VGS > VGS_th時,NMOS兩側就無法再導通。左側bus上的電壓又會再經由OD被釋放而下拉(缺乏右側5V Id_sink的火力支援 lol),直到NMOS兩側再次被導通。

來回拉扯的結果就是左側殘壓被動態平衡在1.8V - 1.5V (VGS_th) = 0.3V的位置,而右側殘壓則取決於NMOS的on time!

最終解決的方法有二個:
1. 使用VGS_th較低的NMOS以增加on time,讓5V端可以有足夠的時間將殘壓宣洩掉
2. 在5V端使用較大的Pull-up電阻,降低Id_sink進而讓1V8端Bus充電較慢就不容易頂到NMOS VGS_th!


PS1. 9th Bit (ACK) 因為是由右側Device端下拉,即使NMOS D-S不導通左側電流也可經由NMOS body diode宣洩掉,因此幾乎不會有殘壓。
PS2. Pull-up電阻的使用需要詳細的規劃,細節可以參考此連結(寫得非常詳細!)

留言

這個網誌中的熱門文章

High Speed Transmission - Channel loss budget

High Speed Transmission - Intro.

High Speed Transmission - Fiber Weave Effect