試實(shí)戰(zhàn))
1. 從“MIPI LP RX”說起這個低功耗接收端到底在做什么第一次看到“MIPI LP RX”這個組合很多人會愣一下。MIPI我熟手機(jī)屏、攝像頭、FPGA開發(fā)板上到處都是LP我也認(rèn)識Low Power嘛。但把這兩個拼在一起再加上一個RX它指的到底是什么簡單說MIPI LP RX 指的是 MIPI D-PHY 物理層中的低功耗接收通路。MIPI D-PHY 是 MIPI 聯(lián)盟定義的物理層規(guī)范幾乎所有 MIPI CSI攝像頭和 DSI顯示接口的底層都跑在它上面。D-PHY 的每條數(shù)據(jù) lane 和時鐘 lane 都由兩根線組成這兩根線在不同工作模式下承擔(dān)完全不同的角色高速模式下它們是一對差分信號跑幾百 Mbps 到幾 Gbps低功耗模式下它們各自獨(dú)立變成兩根單端信號線用來傳控制命令和狀態(tài)。LP RX 就是接收端在低功耗模式下的那套邏輯。它要干的事包括識別 LP 的幾種不同狀態(tài)LP-00、LP-01、LP-10、LP-11檢測從 LP 到 HS 的切換請求解析 Stop 狀態(tài)、Escape 模式、Ultra-Low Power State 等。聽起來像是“低速輔助通道”但沒有它整條鏈路根本起不來——HS 高速傳輸?shù)倪M(jìn)入和退出全靠 LP 狀態(tài)機(jī)來握手。這篇文章適合誰看如果你在做 FPGA 驅(qū)動 MIPI 屏、調(diào)試嵌入式工業(yè)設(shè)備上的 MIPI 攝像頭、或者用示波器抓 MIPI 信號發(fā)現(xiàn)“怎么沒波形”那 LP RX 就是你繞不過去的一環(huán)。我會從協(xié)議原理講到實(shí)操調(diào)試把 LP 狀態(tài)機(jī)、時序參數(shù)、常見故障和排查方法都拆開說清楚。不管你是剛接觸 MIPI 的新手還是已經(jīng)調(diào)過幾塊屏的老手應(yīng)該都能從里面找到有用的東西。2. MIPI D-PHY 低功耗模式的核心機(jī)制拆解2.1 LP 和 HS 為什么必須共存要理解 LP RX先得理解 D-PHY 為什么要設(shè)計(jì)兩套完全不同的信號模式。這背后的邏輯其實(shí)很樸素高速傳輸費(fèi)電低速控制省電但兩者又必須無縫切換。想象一條高速公路。HS 模式就是高速行駛的車道車輛數(shù)據(jù)以極高速度通過但維持這個速度需要持續(xù)的動力功耗。LP 模式則是收費(fèi)站和服務(wù)區(qū)車速降下來功耗也降下來但車輛需要在這里完成繳費(fèi)、確認(rèn)路線、等待放行。沒有收費(fèi)站高速上的車就不知道什么時候該走、什么時候該停。具體到電氣層面HS 模式使用差分信號擺幅只有 100mV 到 300mV共模電壓約 200mV終端匹配 100 歐姆。這種小擺幅、差分傳輸?shù)姆绞竭m合高速但靜態(tài)功耗不低。LP 模式則使用單端信號電平是 0V 到 1.2V典型值擺幅大、速度低通常不超過 10Mbps但靜態(tài)功耗極低。D-PHY 規(guī)定每條 lane 在任意時刻要么處于 HS 模式要么處于 LP 模式不能混。LP RX 的職責(zé)就是在 LP 模式下正確接收和解析信號并在合適的時機(jī)觸發(fā)向 HS 模式的切換。2.2 LP 的四種基本狀態(tài)與電平組合LP 模式下每條 lane 的兩根線通常叫 Dp 和 Dn各自獨(dú)立取值組合出四種狀態(tài)狀態(tài)Dp 電平Dn 電平含義LP-0000橋接狀態(tài)常用于 Escape 模式入口LP-0101與 LP-10 配合表示不同控制含義LP-1010與 LP-01 配合表示不同控制含義LP-1111Stop 狀態(tài)鏈路空閑時的默認(rèn)狀態(tài)這四種狀態(tài)是 LP 層所有通信的基礎(chǔ)。比如從 LP-11 切換到 LP-01再切換到 LP-00最后進(jìn)入 HS 模式這是 HS 進(jìn)入的標(biāo)準(zhǔn)序列。反過來從 HS 退出時發(fā)送端會先發(fā)一個同步序列然后拉回 LP-11。LP RX 需要持續(xù)采樣這兩根線的電平識別出當(dāng)前處于哪個狀態(tài)并根據(jù)狀態(tài)跳變判斷發(fā)送端的意圖。這里的關(guān)鍵是采樣時鐘——LP 信號沒有隨路時鐘接收端必須自己用本地時鐘去采樣。通常采樣時鐘頻率是 LP 信號速率的 4 到 8 倍以保證足夠的裕量。2.3 Escape 模式與低功耗狀態(tài)解析除了基本的 Stop 狀態(tài)和 HS 切換LP 模式還定義了一套 Escape 模式用于傳輸?shù)退倜睢scape 模式的進(jìn)入方式是從 LP-11 切換到 LP-10再切換到 LP-00然后保持 LP-00 一段時間通常大于 100ns接收端檢測到這個序列后就知道要進(jìn)入 Escape 模式了。進(jìn)入 Escape 模式后發(fā)送端會發(fā)送一個 8 位的命令碼比如ULPSUltra-Low Power State命令碼 00011101用于請求進(jìn)入超低功耗狀態(tài)。此時 lane 會保持在 LP-00功耗降到極低。Remote Trigger用于觸發(fā)遠(yuǎn)端事件。Reset用于復(fù)位鏈路。LPDTLow-Power Data Transmission用于在 LP 模式下傳輸數(shù)據(jù)。LP RX 在 Escape 模式下需要正確解析這些命令碼并做出相應(yīng)動作。比如收到 ULPS 請求后接收端應(yīng)該確認(rèn)進(jìn)入 ULPS并等待發(fā)送端發(fā)出退出序列通常是 LP-10 到 LP-11 的跳變。這里有個容易踩的坑Escape 模式的命令碼是 LSB First 還是 MSB First不同廠商的 IP 核實(shí)現(xiàn)可能不一樣調(diào)試時必須對照具體手冊確認(rèn)。我遇到過因?yàn)槲恍蚋惴磳?dǎo)致 ULPS 命令解析錯誤的情況排查了大半天才發(fā)現(xiàn)是這個問題。2.4 LP RX 在協(xié)議棧中的位置從協(xié)議棧角度看MIPI D-PHY 位于最底層上面是 CSI 或 DSI 協(xié)議層。LP RX 屬于 D-PHY 的物理層功能但它又和協(xié)議層的狀態(tài)機(jī)有交互。比如 CSI 接收端在檢測到幀開始Frame Start時需要先通過 LP 模式完成一些握手然后才能進(jìn)入 HS 接收數(shù)據(jù)。在 FPGA 實(shí)現(xiàn)中LP RX 通常是一個獨(dú)立的模塊輸入是差分對經(jīng)過 IBUFDS 后的單端信號輸出是解析后的狀態(tài)信息和命令。這個模塊的時序約束非常關(guān)鍵因?yàn)?LP 信號的邊沿可能比較慢而采樣時鐘又需要足夠快。3. 從零搭建 LP RX 接收邏輯的關(guān)鍵細(xì)節(jié)3.1 信號采樣與去抖處理LP 信號的邊沿速率通常比 HS 慢很多典型上升/下降時間在幾十納秒量級。這意味著如果直接用高頻時鐘去采樣可能會在邊沿附近采到不確定的值。所以第一步要做的是同步和去抖。我的做法是用本地時鐘比如 200MHz對 Dp 和 Dn 分別打兩拍然后用一個簡單的數(shù)字濾波器——連續(xù)采樣到相同值超過 3 個周期才認(rèn)為狀態(tài)穩(wěn)定。這樣既能濾掉毛刺又不會引入太大延遲。// 簡單的去抖邏輯示例 reg [1:0] dp_sync, dn_sync; reg [2:0] dp_filter, dn_filter; always (posedge clk) begin dp_sync {dp_sync[0], dp_in}; dn_sync {dn_sync[0], dn_in}; if (dp_sync[1] dp_filter[2]) dp_filter dp_filter; else dp_filter {dp_filter[1:0], dp_sync[1]}; // dn 同理 end去抖的深度需要根據(jù)實(shí)際信號質(zhì)量調(diào)整。如果信號邊沿很慢可能需要更深的濾波如果信號干凈可以淺一些以減少延遲。3.2 LP 狀態(tài)機(jī)的狀態(tài)編碼與跳轉(zhuǎn)LP 狀態(tài)機(jī)的核心是識別四種基本狀態(tài)和它們之間的合法跳轉(zhuǎn)。我通常用兩個寄存器分別存 Dp 和 Dn 的穩(wěn)定值然后組合成狀態(tài)碼localparam LP_00 2b00; localparam LP_01 2b01; localparam LP_10 2b10; localparam LP_11 2b11; wire [1:0] lp_state {dp_stable, dn_stable};狀態(tài)跳轉(zhuǎn)的判斷需要結(jié)合時間信息。比如從 LP-11 到 LP-01 的跳轉(zhuǎn)如果只是瞬間抖動不應(yīng)該觸發(fā) HS 進(jìn)入序列。D-PHY 規(guī)范里定義了各種時序參數(shù)比如 TLPXLP 狀態(tài)之間的最小時間、THS-PREPAREHS 準(zhǔn)備時間等接收端需要根據(jù)這些參數(shù)來判斷跳轉(zhuǎn)是否合法。一個實(shí)用的做法是用計(jì)數(shù)器測量每個狀態(tài)的持續(xù)時間只有持續(xù)時間超過閾值才認(rèn)為狀態(tài)有效。閾值可以參考規(guī)范里的最小值再留一些裕量。3.3 HS 進(jìn)入檢測與握手時序HS 進(jìn)入序列是 LP RX 最關(guān)鍵的檢測邏輯之一。標(biāo)準(zhǔn)序列如下發(fā)送端從 LP-11 切換到 LP-01保持 LP-01 一段時間TLPX切換到 LP-00保持 LP-00 一段時間THS-PREPARE發(fā)送端開始驅(qū)動 HS 信號差分?jǐn)[幅接收端檢測到 HS 擺幅后進(jìn)入 HS 接收模式接收端需要檢測到 LP-01 到 LP-00 的跳轉(zhuǎn)并在 LP-00 持續(xù)時間超過 THS-PREPARE 后準(zhǔn)備切換到 HS 模式。這里有個細(xì)節(jié)HS 進(jìn)入時發(fā)送端會先發(fā)一個同步序列00011101接收端需要用 HS 時鐘去采樣這個序列確認(rèn)同步后再開始接收有效數(shù)據(jù)。在 FPGA 實(shí)現(xiàn)中HS 接收通常用 ISERDES 或 SelectIO 的差分輸入功能LP 接收則用普通 IO。兩者之間的切換需要仔細(xì)設(shè)計(jì)避免在切換瞬間丟失數(shù)據(jù)。3.4 時序參數(shù)計(jì)算與約束設(shè)置D-PHY 規(guī)范里定義了一系列時序參數(shù)接收端設(shè)計(jì)時需要確保自己的邏輯能滿足這些參數(shù)的要求。幾個關(guān)鍵的TLPXLP 狀態(tài)之間的最小時間典型值 50nsTHS-PREPAREHS 準(zhǔn)備時間典型值 40ns 4*UITHS-ZEROHS 零狀態(tài)時間典型值 105ns 6*UITHS-TRAILHS 尾部時間典型值 60ns 4*UI其中 UI 是 HS 傳輸?shù)膯挝婚g隔比如 1Gbps 時 UI1ns。接收端的采樣時鐘頻率決定了時間分辨率。假設(shè)采樣時鐘 200MHz周期 5ns那么 50ns 對應(yīng) 10 個周期。設(shè)計(jì)時可以用計(jì)數(shù)器來測量這些時間確保狀態(tài)跳轉(zhuǎn)判斷的準(zhǔn)確性。時序約束方面LP 信號的輸入延遲需要根據(jù) PCB 走線和 IO 緩沖延遲來設(shè)置。如果走線較長可能需要調(diào)整采樣時鐘的相位保證在信號穩(wěn)定區(qū)域采樣。4. 實(shí)操調(diào)試從示波器抓波形到問題定位4.1 調(diào)試環(huán)境搭建與初始檢查調(diào)試 MIPI LP RX 的第一步不是寫代碼而是確認(rèn)硬件連接和供電。我見過太多案例折騰半天發(fā)現(xiàn)是排線沒插緊或者供電電壓不對。檢查清單確認(rèn) MIPI 排線方向正確金手指沒有氧化測量 D-PHY 供電電壓通常是 1.2V 或 1.8V紋波要小確認(rèn)參考時鐘如果有頻率和電平正確用萬用表測 LP 信號線的直流電平Stop 狀態(tài)下應(yīng)該是 1.2V 左右如果這些都沒問題再上示波器。示波器帶寬建議不低于 1GHz探頭用差分探頭或者兩個單端探頭做數(shù)學(xué)運(yùn)算。先看 LP 信號有沒有波形再看 HS 信號有沒有差分?jǐn)[幅。4.2 常見故障一LP 狀態(tài)機(jī)卡死現(xiàn)象接收端一直停在某個 LP 狀態(tài)不響應(yīng)發(fā)送端的跳轉(zhuǎn)。排查思路用示波器看 Dp 和 Dn 的實(shí)際波形確認(rèn)發(fā)送端確實(shí)在發(fā)跳轉(zhuǎn)序列檢查接收端的采樣時鐘是否正常有沒有停振檢查去抖邏輯的閾值是否過大導(dǎo)致快速跳轉(zhuǎn)被濾掉檢查狀態(tài)機(jī)的跳轉(zhuǎn)條件是否覆蓋了所有合法序列我遇到過一次發(fā)送端從 LP-11 到 LP-01 的跳轉(zhuǎn)很快只有 20ns而我的去抖邏輯需要連續(xù) 5 個周期25ns才確認(rèn)結(jié)果跳轉(zhuǎn)被濾掉了。后來把去抖深度降到 3 個周期就正常了。4.3 常見故障二HS 進(jìn)入失敗現(xiàn)象LP 狀態(tài)檢測正常但 HS 數(shù)據(jù)收不到或者收到全是錯。排查思路確認(rèn) HS 進(jìn)入序列的時序是否符合規(guī)范特別是 THS-PREPARE 和 THS-ZERO檢查 HS 接收端的同步序列檢測邏輯同步碼是否正確檢查 ISERDES 的相位對齊可能需要調(diào)整 IDELAY確認(rèn) HS 終端匹配電阻是否正確通常 100 歐姆差分有個實(shí)用的技巧在 HS 進(jìn)入失敗時先把 HS 速率降下來。比如從 1Gbps 降到 500Mbps如果低速能通說明是時序裕量不夠需要調(diào)整采樣相位或改善信號完整性。4.4 常見故障三Escape 模式命令解析錯誤現(xiàn)象ULPS 進(jìn)入或退出異?;蛘?LPDT 數(shù)據(jù)錯亂。排查思路確認(rèn) Escape 模式的進(jìn)入序列檢測正確LP-11 → LP-10 → LP-00 → 保持檢查命令碼的位序LSB First 還是 MSB First確認(rèn)命令碼的采樣時刻應(yīng)該在 LP-00 穩(wěn)定后采樣檢查退出 Escape 模式的序列檢測這里有個容易忽略的點(diǎn)Escape 模式的命令碼之間可能有間隔接收端需要正確區(qū)分命令碼和間隔。通常命令碼是連續(xù)的 8 位間隔是 LP-00 保持。如果間隔檢測錯誤可能會把兩個命令碼拼在一起。4.5 常見問題速查表問題現(xiàn)象可能原因排查方法解決措施LP 狀態(tài)不跳轉(zhuǎn)采樣時鐘異常示波器測時鐘檢查時鐘源和布線LP 狀態(tài)跳轉(zhuǎn)錯誤去抖閾值過大抓波形測跳轉(zhuǎn)時間減小去抖深度HS 進(jìn)入失敗時序裕量不足降速測試調(diào)整采樣相位HS 數(shù)據(jù)錯誤同步碼檢測錯誤抓 HS 波形檢查同步邏輯ULPS 異常命令碼位序錯誤對照手冊調(diào)整位序鏈路不穩(wěn)定信號完整性差測眼圖改善走線和匹配5. 進(jìn)階話題LP RX 在不同平臺上的實(shí)現(xiàn)差異5.1 FPGA 平臺上的 LP RX 實(shí)現(xiàn)要點(diǎn)在 FPGA 上實(shí)現(xiàn) LP RX最大的挑戰(zhàn)是IO 資源的選擇和時序約束。不同廠商的 FPGA 在 IO 結(jié)構(gòu)上有差異比如 Xilinx 的 SelectIO 和紫光同創(chuàng)的 IO 原語就不一樣。以 Xilinx 為例LP 信號可以接到普通 IO用 IDELAY 調(diào)整采樣相位。HS 信號則需要用 ISERDES 或 SelectIO 的差分輸入功能。關(guān)鍵是LP 和 HS 的切換需要在 IO 層面做 MUX或者用兩個獨(dú)立的 IO 分別接 LP 和 HS然后在內(nèi)部切換。紫光同創(chuàng)的 FPGA 在 MIPI 應(yīng)用上也有不少案例他們的 IO 原語和 Xilinx 類似但具體參數(shù)和約束方式不同。調(diào)試時需要參考具體的器件手冊。5.2 嵌入式工業(yè)設(shè)備中的 LP RX 調(diào)試經(jīng)驗(yàn)工業(yè)設(shè)備上的 MIPI 接口通常面臨更惡劣的環(huán)境溫度范圍寬、電磁干擾強(qiáng)、線纜較長。這些因素都會影響 LP RX 的穩(wěn)定性。我的經(jīng)驗(yàn)是增加去抖深度工業(yè)環(huán)境的毛刺更多降低 LP 采樣時鐘頻率提高抗干擾能力增加狀態(tài)跳轉(zhuǎn)的超時檢測避免卡死在 PCB 上增加共模扼流圈抑制共模干擾另外工業(yè)設(shè)備通常需要長時間穩(wěn)定運(yùn)行所以 LP RX 的狀態(tài)機(jī)要有完善的錯誤恢復(fù)機(jī)制。比如檢測到異常狀態(tài)時自動復(fù)位到 LP-11 等待重新握手。5.3 與 LVDS 方案的對比與選型建議MIPI 和 LVDS 都是常見的顯示和攝像頭接口但 LP RX 是 MIPI 特有的。LVDS 沒有 LP 模式它的控制信號通常走單獨(dú)的線。選型時考慮速率需求MIPI HS 可以到幾 GbpsLVDS 通常幾百 Mbps功耗要求MIPI 的 LP 模式在待機(jī)時功耗極低LVDS 待機(jī)功耗較高布線復(fù)雜度MIPI 的 LP 和 HS 復(fù)用同一對線布線更簡單成本LVDS 方案通常更便宜MIPI 需要更復(fù)雜的接收端如果項(xiàng)目對功耗和布線有嚴(yán)格要求MIPI 是更好的選擇如果成本敏感且速率要求不高LVDS 可能更合適。5.4 調(diào)試工具與儀器選擇調(diào)試 LP RX好的工具能省一半時間。我的推薦示波器帶寬至少 1GHz最好有差分探頭和 MIPI 解碼選件協(xié)議分析儀能抓 LP 和 HS 的完整序列比如 Teledyne LeCroy 的 MIPI 分析儀邏輯分析儀用于抓 LP 狀態(tài)跳轉(zhuǎn)采樣率要足夠高萬用表測直流電平和供電如果預(yù)算有限至少要有示波器和邏輯分析儀。協(xié)議分析儀可以租用不一定非要買。6. 幾個讓我印象深刻的調(diào)試案例6.1 案例一ST7701S 屏幕橫向花屏有一次調(diào)一塊 ST7701S 的 MIPI 屏顯示正常但橫向花屏。一開始懷疑是 HS 數(shù)據(jù)錯誤抓波形發(fā)現(xiàn) HS 眼圖很好。后來用邏輯分析儀抓 LP 信號發(fā)現(xiàn) LP 狀態(tài)機(jī)在每幀開始時偶爾會誤判導(dǎo)致 HS 進(jìn)入時序偏移。根因是 LP 去抖邏輯在幀開始時的干擾下誤觸發(fā)。解決辦法是在幀開始前增加一個保護(hù)窗口屏蔽 LP 狀態(tài)跳轉(zhuǎn)檢測。這個案例說明LP RX 的穩(wěn)定性直接影響 HS 數(shù)據(jù)的正確性。6.2 案例二RK3588 輸入 1080i 信號異常RK3588 的 MIPI 輸入支持 1080i 隔行信號但調(diào)試時發(fā)現(xiàn)圖像閃爍。排查后發(fā)現(xiàn)是 LP RX 對場同步信號的解析有問題。1080i 的場同步通過 LP 模式傳輸時序和逐行不同。調(diào)整 LP 狀態(tài)機(jī)的超時參數(shù)后正常。這個案例提醒我不同視頻格式的 LP 時序可能不同調(diào)試時要根據(jù)具體格式調(diào)整參數(shù)。6.3 案例三FPGA 驅(qū)動 MIPI 屏無信號用 FPGA 驅(qū)動一塊 MIPI 屏上電后屏幕無任何反應(yīng)。檢查發(fā)現(xiàn) LP 狀態(tài)機(jī)一直停在 LP-11沒有檢測到發(fā)送端的跳轉(zhuǎn)。用示波器看發(fā)送端波形發(fā)現(xiàn)發(fā)送端根本沒有發(fā) LP 跳轉(zhuǎn)序列。根因是發(fā)送端的初始化配置錯誤沒有正確啟動 MIPI 輸出。這個案例說明調(diào)試 LP RX 時先確認(rèn)發(fā)送端是否正常工作不要一上來就懷疑接收端。7. 寫在最后一些個人體會調(diào) MIPI LP RX 這些年最大的感受是協(xié)議規(guī)范要讀透但實(shí)際調(diào)試中更重要的是對信號的理解。規(guī)范里寫的時序參數(shù)是理想情況下的實(shí)際信號會有各種偏差。用示波器多看波形用邏輯分析儀多抓狀態(tài)跳轉(zhuǎn)比死磕規(guī)范更有效。另外LP RX 雖然只是 MIPI 的一小部分但它直接影響整條鏈路的穩(wěn)定性。很多 HS 數(shù)據(jù)錯誤根因其實(shí)在 LP 握手階段。所以調(diào)試時不要跳過 LP先把 LP 狀態(tài)機(jī)調(diào)穩(wěn)再調(diào) HS。最后分享一個小技巧在 LP 狀態(tài)機(jī)里加一個狀態(tài)跳轉(zhuǎn)的日志用 FPGA 的 IL A 或者邏輯分析儀抓出來能快速定位問題。這個日志不需要太復(fù)雜記錄狀態(tài)碼和時間戳就夠了。我靠這個技巧解決過好幾次疑難問題。