ZHCT966 August 2025 DS90UB936-Q1
DS90UB936-Q1是一款車載級FPD-LINK III攝像頭端解串器芯片,其可支持兩個串行器同時傳輸數據,每個端口最大支持3Gbps的傳輸速率。在汽車領域中,其被廣泛應用于電子后視鏡以及環視攝像頭等相關應用上。本文主要針對在系統調試時無法正常看到顯示的情況,從硬件設計、信號鏈路、電源管理及軟件配置多維度排查,并提供對應的解決方法。
在實際應用案例中,出現問題的狀況主要表現為后級SoC無法正確顯示攝像頭端傳輸過來的畫面。出現這個問題的情況應當從硬件方向和軟件方向考慮,逐步排查并確認具體問題點。
圖 1 系統框圖
圖 2 DS90UB936-Q1框圖如下圖所示,DS90UB936-Q1對上電時序有詳細要求。可通過示波器探測所有的供電是否符合時序要求。其中需要重點排查的是:PDB是否在VDD18/VDDIO后上電。DS90UB936-Q1有兩種上電方式:
圖 3 DS90UB936-Q1
上電時序a
圖 4 DS90UB936-Q1
上電時序b除了不同電壓軌之間的時序,還需要注意每個電壓軌的上電時間是否滿足要求。如VDD18要求上電時間不得低于0.05ms,過快的上電時間可能引起內部模塊錯誤。
圖 5 DS90UB936-Q1電源上電時序要求 排查時需要注意除了對應的時序,還需要檢查各個電源軌是否電壓工作正常,如VDD18是否達到1.8V或在要求的范圍內。VDD18主要為內部LDO及輸出模塊供電,因此VDD18的紋波要求是50mV。VDD11主要為數字模塊供電,如果VDD11采用外部供電的方式,則要求25mV以內的紋波。在實際應用中, VDD18最大需要279mA,建議由LDO供電(如TPS745-Q1);為避免VDD11的紋波過大對數字模塊造成影響,VDD11建議由內部LDO供電。對應電源電壓如表3。
圖 6 DS90UB936-Q1電源電壓及紋波要求請通過示波器確認VDD供電均符合電壓范圍和紋波要求,當電壓范圍和紋波不符合要求時,內部模塊可能會工作于不正常的狀態,進而導致輸出異常。
DS90UB936-Q1要求有穩定的時鐘信號輸入。時鐘源可以選擇有源晶振,也可以選擇無源晶體。DS90UB936-Q1對于時鐘信號有精準度和誤差要求,如表3所示。如果時鐘源是晶振,請注意晶振電路輸出的高低電平。當VDDIO設置為3.3V時,要求時鐘信號的高電平大于2V,低電平小于0.8V。且占空比應為40%-60%之間。錯誤的時鐘信號會導致CSI輸出異常或沒有輸出。
圖 7 DS90UB936-Q1 時鐘信號要求當問題出現時,可以使用DS90UB936-Q1的pattern模式排查DS90UB936-Q1至SoC段的問題。請通過DS90UB936-Q1的上位機軟件ALP開啟pattern模式,如圖4所示。當參數設置好以后,既可以通過SoC接收端確認信號是否正常,也可以通過專用的CSI軟件監控信號流是否正常。
圖 8 DS90UB936-Q1 上位機 ALP
進入 pattern 模式如果pattern模式正常,應該能看到屏幕顯示彩條畫面。如果沒有畫面,請排查SoC接收端的設置是否與pattern的設置匹配。在硬件排查上,請使用高速示波器(帶寬大于2G)來測試CSI時鐘信號(PIN11/PIN12),若設置為CSI時鐘為800MHz,應在示波器中看到400MHz頻率的時鐘信號,如圖5所示。如果沒有類似的信號,請通過寄存器確認DS90UB936-Q1是否有接收到穩定的時鐘信號,并排查時鐘電路。
圖 9 DS90UB936-Q1
CSI時鐘測試在pattern模式正常顯示以后,由于部分串行器本身不支持pattern模式,通常會直接接上攝像頭進行完整測試。在文末附件中,給出一份DS90UB936-Q1的配置代碼,可以根據實際需求調整代碼參數。接下來主要介紹代碼中的配置重點:
從Sensor到串行器,以及從解串器到SoC都需要協商好協議后再進行數據傳輸,否則接收端無法正確接收數據。對于DS90UB936-Q1來說,則需要配置其與SoC之間的具體協議,圖6中給出所有協議對應的數據格式。將該數據格式填入到圖7當中的寄存器中,如果sensor和串行器的數據格式是RAW10,則將圖6的數據格式填入到RAW10寄存器中。如果是RAW12或CSI-2格式,則應分別填入到RAW12或CSI-2寄存器中,如圖7所示。
舉個例子,Sensor通過RAW10格式將數據傳輸給DS90UB933-Q1,再讓DS90UB936-Q1通過YUV422 10BIT格式傳輸到SoC,則應該在DS90UB936-Q1的0x70寄存器寫入0x1F。如果Sensor是通過CSI-2格式傳輸到DS90UB935-Q1,則只需根據實際需求調整0x72寄存器。
錯誤的寄存器配置同樣會導致SoC無法正常接收信號。
圖 10 圖像傳輸數據格式
圖 11 數據格式對應寄存器在實際使用中,可能會有輸入為10bit格式,而輸出為8bit格式的可能。舉個例子,如Sensor通過RAW10格式將數據傳輸給DS90UB933-Q1,再讓DS90UB936-Q1通過YUV422 8BIT格式傳輸到SoC。此時輸入格式是10bit,而輸出格式是8bit,這意味著在DS90UB936-Q1需要將10bit格式轉為8bit格式輸出。在這種情況下,需要前級的Sensor確認傳輸的10bit中是高8bit有效還是低8bit有效,再對應去修改DS90UB936-Q1中的0x7C寄存器。設置為10是高8bit有效,設置為11是低8bit有效。
圖 12 x7C寄存器串行器如果是DS90UB933-Q1,Sensor可能會輸入Hsync/Vsync信號。部分Sensor的Hsync/Vsync是高有效,部分則是低有效。對于該設置,應該在DS90UB936-Q1的0x7C寄存器中進行設置,如圖7所示。bit1/bit0設置對應的有效電平。LV_POLARITY對應Hsync,FV_POLARITY對應Vsync,這兩個位都是設置為1是低有效,設置為0是高有效。設置錯誤會導致無輸出。
當DS90UB936-Q1完全設置正確以后,可以檢查DS90UB936-Q1的LINE_COUNT寄存器和LINE_LEN寄存器,如圖8所示。LINE_COUNT表示了DS90UB936-Q1接收到一幀內的有效行數,LINE_LEN寄存器表示DS90UB936-Q1接收到一行內的有效長度。當這兩個數與Sensor傳過來的數據保持一致時,即證明DS90UB936-Q1能夠接收到有效數據并進行輸出。
如果此時還是沒有看到正常畫面,應排查SoC接收端的配置是否符合要求:接收端設置的長度和寬度應與實際值完全吻合,接收端設置的數據格式應與DS90UB936-Q1的設置完全一致。
圖 13 LINE_COUNT寄存器和LINE_LEN寄存器本文分析了DS90UB936-Q1在應用過程中出現黑屏的原因,并且從硬件和軟件方向提出了故障排查指南,并給出相應的解決措施,有助于工程師更快排查問題。另外,給出一個實際配置代碼供參考。
DS90UB936-Q1 Dual 3 Gbps FPD-Link III Deserializer Hub With MIPI CSI-2 Outputs datasheet (Rev. C)
//CSI setting
Board.writeI2C(DESaddr, 0x4C, 0x01); //port0 select
Board.writeI2C(DESaddr, 0x33, 0x00); //disable CSI
Board.writeI2C(DESaddr, 0x1F, 0x0E); //CSI datarate: 800Mbps
Board.writeI2C(DESaddr, 0x20, 0x20);//Enable RX port0; if both ports are used, set to 0x30;
Board.writeI2C(DESaddr, 0x70, 0x1E); // CSI format setting: YUV422 8bit
Board.writeI2C(DESaddr, 0x7C, 0xE3); // RAW10 to 8bit setting: lower 8 bits; LineValid(Hsync) low, FrameValid(Vsync) low
//Framesync setting(unnecessary for only port0)
Board.writeI2C(DESaddr, 0x4C, 0x01); //port0 select
Board.writeI2C(DESaddr, 0x6E, 0xAA); //BC GPIO1/0 value 1
Board.writeI2C(DESaddr, 0x4C, 0x12); //port1 select
Board.writeI2C(DESaddr, 0x6E, 0xAA); //BC GPIO1/0 value 1
Board.writeI2C(DESaddr, 0x4C, 0x01); //port0 select
Board.writeI2C(DESaddr, 0x10, 0x1A);// GPIO0 setting
Board.writeI2C(DESaddr, 0x19, 0x0A);//FS_HIGH_TIME
Board.writeI2C(DESaddr, 0x1A, 0xD9) );//FS_HIGH_TIME
Board.writeI2C(DESaddr, 0x1B, 0x61) );//FS_LOW_TIME
Board.writeI2C(DESaddr, 0x1C, 0xA7) );//FS_HIGH_TIME
Board.writeI2C(DESaddr, 0x18, 0x01);//Enable Framesync
//GPIO setting
Board.writeI2C(DESaddr, 0x0F, 0x0E); //GPIO0 output Enable;
Board.writeI2C(DESaddr, 0x10, 0x01); //GPIO0 link to forward channel received GPIO0 from RX port0 SER;
//Enable CSI
Board.writeI2C(DESaddr, 0x33, 0x03); //Enable CSI(remember to enable CSI even if you use pattern mode)