計:從電平差異到實戰(zhàn)解析)
玩硬件這些年串口是繞不開的活。調(diào)試路由器要TTL接工控設(shè)備要RS-232偏偏這兩種接口的電平標(biāo)準(zhǔn)水火不容——前者3.3V/5V后者動不動就正負(fù)12V。手邊只有一根USB轉(zhuǎn)TTL線面對DB9母座設(shè)備時經(jīng)常傻眼。前陣子幫朋友修一臺K2P路由器原生TTL調(diào)試接口手頭卻只有RS-232的調(diào)試工具一咬牙做了個TTL/RS-232切換電路。趁著這次機(jī)會把設(shè)計思路、參數(shù)計算和踩坑記錄完整梳理一遍希望能幫到被同樣問題卡住的同行。1. TTL與RS-232的“八字不合”先看清兩種電平的本質(zhì)1.1 電平定義與邏輯極性差異很多人知道TTL和RS-232不一樣但具體差在哪未必說得清。先看電平標(biāo)準(zhǔn)對比參數(shù)TTL電平RS-232電平邏輯1高電平2.0V~5.5V通常3.3V或5V-3V ~ -15V負(fù)電壓邏輯0低電平0V~0.8V3V ~ 15V正電壓空閑狀態(tài)保持高電平保持負(fù)電平傳輸距離1米以內(nèi)板級通信15米左右設(shè)備級通信參考方式單端共地單端共地典型電壓擺幅0~3.3V 或 0~5V約±5.4V~±12V注意到?jīng)]有RS-232的邏輯極性與TTL正好相反TTL用高電平表示邏輯1RS-232用負(fù)電壓表示邏輯1。這就是為什么網(wǎng)上的“TTL轉(zhuǎn)RS-232模塊”內(nèi)部必然有一顆電平轉(zhuǎn)換芯片MAX3232、SP3232等不能只是簡單接幾根線。另一個關(guān)鍵差異是電壓擺幅。TTL的高電平輸出一般最低也在2.4V以上3.3V供電時更高而RS-232芯片轉(zhuǎn)換后的輸出用內(nèi)部電荷泵產(chǎn)生正負(fù)電源擺幅通常在±5.4V左右。如果直接把TTL的3.3V高電平懟到RS-232接收端即使不考慮極性反轉(zhuǎn)問題3.3V也不一定能被RS-232接收端可靠識別——RS-232接收端的邏輯1需要小于-3V3.3V會被判定成邏輯0數(shù)據(jù)直接錯亂。1.2 為什么一塊板上需要兩種串口這個問題看起來有點(diǎn)“多此一舉”實際場景里卻非常普遍嵌入式開發(fā)板/路由器板級調(diào)試信息通過UART輸出電平直接是TTL方便用USB轉(zhuǎn)TTL線看日志。K2P這類路由器刷breed、救磚就是把TTL排針引出來接調(diào)試工具。工業(yè)儀表/老舊設(shè)備很多設(shè)備已經(jīng)服役十多年接口只有DB9的RS-232電平標(biāo)準(zhǔn)不能改只能適配。一板多用同一塊主控板開發(fā)階段接TTL調(diào)程序交付現(xiàn)場接RS-232連上位機(jī)。如果設(shè)計時只留一種接口后面要么外掛轉(zhuǎn)換模塊要么飛線改板都很狼狽。所以切換電路不是噱頭是實實在在的工程需求。核心目標(biāo)是一個MCU的UART引腳既能直連TTL排針又能經(jīng)過電平轉(zhuǎn)換芯片后輸出RS-232兩種模式互不干擾。2. 手動切換跳線帽與撥碼開關(guān)的取舍2.1 零成本跳線帽方案最簡單的切換方式就是跳線帽。把MCU的UART_TX和UART_RX分別接出兩組排針一組標(biāo)注“TTL”一組標(biāo)注“RS-232”中間用電平轉(zhuǎn)換芯片隔離。結(jié)構(gòu)如下MCU_UART_TX → 排針J1第2腳TTL_TXMCU_UART_TX → MAX3232的DIN1引腳經(jīng)過電平轉(zhuǎn)換后到DB9的Pin3MCU_UART_RX → MAX3232的ROUT1引腳從RS-232電平轉(zhuǎn)為TTL后返回MCUMCU_UART_RX → 排針J1第3腳TTL_RXGND、VCC各自并聯(lián)到兩路接口使用時用跳線帽短接對應(yīng)引腳決定MCU的UART信號走哪條路。這個方案的優(yōu)勢是成本幾乎為零PCB上只是多了兩組排針信號路徑上沒有額外的半導(dǎo)體器件不會引入導(dǎo)通電阻、結(jié)電容等寄生參數(shù)調(diào)試時用萬用表量一下通斷狀態(tài)一目了然。跳線帽方案要特別注意引腳排布。我個人習(xí)慣把VCC、GND、TX、RX做成4Pin排針與市面上常見的USB轉(zhuǎn)TTL模塊排針定義一致。這樣手里任何一根杜邦線都能直接插不用每次翻原理圖。2.2 撥碼開關(guān)方便但別忽視接觸電阻跳線帽雖然可靠但每次切換都要開殼、拔插跳線帽測試階段還行產(chǎn)品交付后用戶操作起來不友好。第二次迭代我就換成了撥碼開關(guān)本質(zhì)是把“機(jī)械短接”換成“開關(guān)短接”。選撥碼開關(guān)時工程上最容易被忽略的參數(shù)是接觸電阻和額定電流。普通撥碼開關(guān)的接觸電阻在50mΩ~200mΩ之間額定電流通常只有100mA左右。串口信號本身電流極小50mΩ的接觸電阻幾乎不會造成壓降所以這個參數(shù)對TTL/RS-232切換沒什么影響。但如果你把撥碼開關(guān)用在電源通斷控制上就要嚴(yán)格核算壓降和載流能力了。真正要留意的是撥碼開關(guān)的機(jī)械壽命和氧化問題。廉價撥碼開關(guān)用久了觸點(diǎn)會氧化出現(xiàn)接觸不良表現(xiàn)就是“前幾天還能通信今天突然亂碼”。排查時用萬用表去量開關(guān)兩端通斷可能一會兒通一會兒斷非常隱蔽。建議選用鍍金觸點(diǎn)的撥碼開關(guān)貴幾毛錢但穩(wěn)定很多。2.3 手動切換的天然痛處手動方案用了大半年我總結(jié)出三個“反人類”之處第一忘記切換。產(chǎn)品給到客戶手里售后反饋“串口沒反應(yīng)”遠(yuǎn)程排查了半天最后發(fā)現(xiàn)是撥碼開關(guān)檔位不對。這類問題占了串口故障的相當(dāng)比例。第二熱插拔時序問題。如果先插上USB轉(zhuǎn)TTL線再撥動撥碼開關(guān)切換到RS-232檔位切換瞬間MCU的TX引腳可能被RS-232接收端的負(fù)電壓灌電流。雖然MCU引腳內(nèi)部通常有鉗位二極管但長期這樣操作有損傷風(fēng)險。第三無法遠(yuǎn)程控制。設(shè)備部署在機(jī)房需要遠(yuǎn)程切換串口模式時就完全沒辦法必須人肉到場撥開關(guān)。這些痛點(diǎn)直接推動我去做自動切換電路。手動方案作為“最后的兜底手段”保留在板上正常使用走自動模式。3. 自動識別如何用負(fù)電平特征判斷總線類型3.1 抓住RS-232空閑負(fù)電平這個核心特征自動切換的關(guān)鍵是找到一種方法讓電路自己判斷“現(xiàn)在外接的是TTL設(shè)備還是RS-232設(shè)備”。TTL和RS-232在工作特征上有一個非常顯著的差異空閑狀態(tài)的電平不同。UART協(xié)議空閑時TX線保持高電平。對TTL來說這個高電平是3.3V或5V對RS-232來說這個“空閑高電平”經(jīng)過電平轉(zhuǎn)換芯片反相后在RS-232側(cè)呈現(xiàn)為負(fù)電壓-5.4V左右。于是判別邏輯就清晰了檢測外部接口上的電平如果持續(xù)為負(fù)判定為RS-232設(shè)備如果為正判定為TTL設(shè)備。實現(xiàn)這個判別最簡單的方式是電壓比較器。以LM393為例把外部信號接到比較器的同相輸入端反相輸入端接一個參考電壓。參考電壓設(shè)為-1V左右當(dāng)輸入電壓低于-1V時比較器輸出低電平標(biāo)記為RS-232模式當(dāng)輸入電壓高于-1V包含TTL高電平3.3V以及TTL低電平0V時輸出高電平標(biāo)記為TTL模式。這里有個細(xì)節(jié)必須處理TTL發(fā)送數(shù)據(jù)時每個字節(jié)的數(shù)據(jù)位會有高低電平變化低電平0V接近參考閾值可能導(dǎo)致比較器抖動。解決辦法是加滯回比較器在正反饋回路里串一個反饋電阻讓閾值分裂成兩個一個用于RS-232判定-2V一個用于TTL判定0.5V。信號電平在0V附近來回跳動時比較器不會反復(fù)翻轉(zhuǎn)。3.2 模擬開關(guān)切換與毛刺問題判定出總線類型之后下一步是切換信號通路。自動切換不能像手動方案那樣直接用機(jī)械開關(guān)得用電子開關(guān)也就是模擬開關(guān)。常用的有CD4052雙4通道、TS5A23157雙通道SPDT等。模擬開關(guān)的關(guān)鍵參數(shù)有三個導(dǎo)通電阻Ron、帶寬、切換時間。TS5A23157的導(dǎo)通電阻約1Ω帶寬約250MHz對于最高1Mbps的UART信號綽綽有余。CD4052的導(dǎo)通電阻較大典型80Ω供電3.3V時可能到120Ω而且Ron會隨輸入電壓變化用在串口上勉強(qiáng)可以但我不推薦因為阻抗不匹配會劣化信號邊沿。模擬開關(guān)切換最怕的是毛刺。切換瞬間如果正好趕上串口數(shù)據(jù)線上的電平翻轉(zhuǎn)輸出端可能出現(xiàn)一個半位元的毛刺接收端直接亂碼。規(guī)避方法有兩個一是選擇**先斷后合Break-Before-Make**類型的模擬開關(guān)切換時先斷開舊通道再接通新通道中間留出納秒級的間隙避免兩路信號短接。二是軟件配合。如果切換動作由MCU控制可以讓MCU檢測TX線空閑后再發(fā)出切換命令。UART空閑時TX線恒為高電平比較器輸出穩(wěn)定此時切換最安全。3.3 三極管判別方案為什么不推薦網(wǎng)上有些電路用三極管做RS-232負(fù)壓檢測思路是RS-232空閑負(fù)電平讓PNP三極管導(dǎo)通從而拉高或拉低一個GPIO電平。實際試過之后會發(fā)現(xiàn)這個方案有天然的矛盾。TTL信號的高電平3.3V對于PNP三極管的發(fā)射結(jié)來說也可能造成誤導(dǎo)通——PNP管的VEB只有0.7V3.3V與基極之間如果沒做好分壓TTL高電平同樣會讓三極管進(jìn)入導(dǎo)通區(qū)。要區(qū)分“負(fù)電平導(dǎo)通”和“正電平不導(dǎo)通”必須把基極電位精確偏置到一個參考電壓電路變得復(fù)雜穩(wěn)定性還比不上一個2毛錢的比較器。所以我最終的方案是LM393比較器判別 TS5A23157模擬開關(guān)切換 MCU GPIO控制。判別電路只需要三個電阻加一個比較器成本不到一塊錢穩(wěn)定性遠(yuǎn)超三極管方案。另外提一句有人會把“TTL/RS-232切換電路”和“28V電源切換電路”“雙電源自動切換電路”放在一起搜索它們都叫“切換電路”但設(shè)計出發(fā)點(diǎn)完全不同。電源切換關(guān)心的是防倒灌、防拉弧、均流信號切換關(guān)心的是阻抗匹配、電平適配、毛刺抑制。不要把電源切換的MOS管方案直接套到串口切換上。4. 一塊板兼容兩代串口的完整實戰(zhàn)設(shè)計4.1 總體信號流向與芯片選型完整電路分成三塊UART源MCU、判別與切換單元、兩種物理接口TTL排針 DB9 RS-232。信號流向如下MCU_UART_TX → 施密特觸發(fā)緩沖器74LVC1G17→ 模擬開關(guān)公共端COM模擬開關(guān)通道1CH1→ TTL排針TX引腳模擬開關(guān)通道2CH2→ MAX3232的DIN1 → 轉(zhuǎn)換后到DB9 Pin3DB9 Pin2 → MAX3232的ROUT1 → 恢復(fù)TTL電平 → 模擬開關(guān)CH2RX通道→ MCU_UART_RXTTL排針RX引腳 → 模擬開關(guān)CH1RX通道→ MCU_UART_RX為什么要在MCU和模擬開關(guān)之間加74LVC1G17緩沖器兩個原因一是MCU的IO驅(qū)動能力有限加了緩沖器后TCK信號邊沿更陡峭長線傳輸不易誤碼二是緩沖器起到隔離作用外部接口的意外短路不會直接沖擊MCU引腳。MAX3232是5V兼容的3.3V供電RS-232收發(fā)器內(nèi)部集成電荷泵只需要外接四個0.1μF電荷泵電容。它的ROUT1輸出RS-232轉(zhuǎn)TTL后的信號電平與VCC相關(guān)3.3V供電時輸出高電平約3.0V左右MCU識別沒問題。4.2 關(guān)鍵參數(shù)計算過程MAX3232的電荷泵輸出估算內(nèi)部振蕩器先把VCC3.3V升壓到兩倍理論上V ≈ 2 × VCC 6.6V扣除內(nèi)部二極管壓降后實際V ≈ 5.5V。反相電荷泵生成V- ≈ -5.5V。因此RS-232輸出端的擺幅約±5.5V滿足RS-232規(guī)范要求的±3V以上。MAX3232輸入門限參數(shù)3.3V供電時DIN引腳輸入高電平VIH最低為2.0V輸入低電平VIL最高為0.8V。MCU的3.3V TTL輸出高電平通?!?.7V負(fù)載較輕時接近3.3V輸出低電平≤0.4V直接連接沒問題。如果MCU是5V TTL電平過壓可能超過MAX3232 DIN的絕對最大額定值需要串聯(lián)分壓電阻。公式R1串接信號路徑R2下拉到地使分壓后高電平約3.0V取R12.2kΩ、R23.3kΩ比較合適。判別比較器的閾值計算LM393方案反相輸入端參考電壓由電阻分壓產(chǎn)生VREF VCC × R2 / (R1 R2)。取R1100kΩR227kΩVCC3.3VVREF ≈ 0.7V。比較器同相輸入端通過100kΩ電阻接外部信號又經(jīng)1MΩ反饋電阻接輸出。當(dāng)外部信號為負(fù)壓RS-232空閑-5.5V時同相端電壓被拉到負(fù)值低于0.7V比較器輸出低電平。當(dāng)外部信號為高電平TTL空閑3.3V時同相端電壓高于0.7V輸出高電平。滯回帶由反饋電阻產(chǎn)生大約±0.1V足以抑制數(shù)據(jù)位的電平抖動。實際測試中當(dāng)外部接的是USB轉(zhuǎn)TTL模塊時比較器穩(wěn)定輸出高電平接的是RS-232設(shè)備時穩(wěn)定輸出低電平。判別響應(yīng)時間在微秒級MCU檢測到模式切換信號后延遲10ms再操作模擬開關(guān)確保總線狀態(tài)穩(wěn)定。4.3 利用MAX3232的SHDN引腳做二次優(yōu)化MAX3232有一個低電平有效的關(guān)斷引腳SHDN#拉低后整個收發(fā)器進(jìn)入關(guān)斷狀態(tài)輸出為高阻。利用這個特性可以在TTL模式下把MAX3232徹底關(guān)掉避免DB9接口上的殘余電荷通過芯片漏電影響信號。完整工作模式有三態(tài)模式SHDN#引腳模擬開關(guān)通道實際通路TTL模式拉低關(guān)斷RS-232CH1MCU ? TTL排針RS-232模式拉高使能CH2MCU ? DB9 RS-232全關(guān)斷拉低斷開兩路接口均隔離這個設(shè)計帶來一個額外好處TTL模式下DB9接口完全與內(nèi)部電路隔離即使DB9上被誤插入220V交流電雖然概率極低也不會直接擊穿MCU——前提是PCB上的爬電距離和絕緣間距達(dá)標(biāo)。這話不是我危言聳聽工業(yè)現(xiàn)場串口被燒的案例里相當(dāng)一部分是220V串入DB9導(dǎo)致的。5. 實測五個坑方向、熱插拔、導(dǎo)通電阻與防呆5.1 串口方向接反兩個“TX”的尷尬第一次打樣回來燒錄程序后在TTL模式下調(diào)通了切到RS-232模式測試串口助手里全是亂碼。排查過程先用示波器量DB9的Pin2和Pin3發(fā)現(xiàn)MCU發(fā)出的數(shù)據(jù)確實出現(xiàn)在DB9 Pin3上波形正常。又量對面設(shè)備的接收端發(fā)現(xiàn)數(shù)據(jù)根本沒進(jìn)去。最后翻了設(shè)備手冊才意識到DB9的RS-232定義里DTE設(shè)備如電腦的Pin2是接收數(shù)據(jù)RxDPin3是發(fā)送數(shù)據(jù)TxD而DCE設(shè)備如調(diào)制解調(diào)器的Pin2是發(fā)送Pin3是接收。我的板子作為DTE設(shè)計但對面設(shè)備也是DTE兩個“發(fā)送端”對接信號自然斷了。解決方案是加一個跳線或旋鈕開關(guān)切換DB9的2/3腳交叉關(guān)系。或者參考路由器K2P刷breed的TTL接口做法——直接在排針旁邊絲印標(biāo)明TX、RX方向杜邦線交叉連接。調(diào)試接口的方向問題永遠(yuǎn)是硬件工程師最容易被絆倒的地方。5.2 熱插拔引起的電平?jīng)_擊自動切換做好之后我習(xí)慣直接帶電插拔DB9頭。某次測試中發(fā)現(xiàn)MAX3232莫名發(fā)熱手摸上去燙手立即斷電檢查。分析后定位到原因DB9插頭插入瞬間未連接的引腳可能懸空電荷積累后產(chǎn)生較高的電位差通過MAX3232的輸入引腳灌入內(nèi)部ESD二極管導(dǎo)致芯片功耗異常增加。處理辦法在DB9的每個信號引腳對地并聯(lián)一個TVS管選SMBJ6.0CA雙向鉗位電壓約6V把瞬態(tài)尖峰鉗位到安全范圍。在MAX3232的DIN/ROUT引腳上各串一個33Ω電阻限制異常灌電流。惡劣環(huán)境下在DB9金屬外殼上接機(jī)殼地并串聯(lián)一個1MΩ電阻加0.1μF電容做橋接防止地環(huán)路。改版后反復(fù)熱插拔幾十次芯片溫度正常。5.3 模擬開關(guān)導(dǎo)通電阻對高速串口的影響TS5A23157的1Ω導(dǎo)通電阻夠不夠我做了對比測試分別用直連和經(jīng)過模擬開關(guān)兩條路徑跑UART115200bps波特率下波形幾乎重合眼圖完全沒問題波特率拉到1Mbps時經(jīng)過模擬開關(guān)的路徑信號邊沿變緩約15%但仍在接收端容忍范圍內(nèi)。不過要注意模擬開關(guān)不僅有導(dǎo)通電阻還有并聯(lián)到地的寄生電容典型值20pF左右。串口波特率越高、線纜越長這個電容的影響越明顯。如果你的產(chǎn)品需要跑3Mbps以上的UART建議把切換電路去掉改用跳線帽方式或者選用超低電容模擬開關(guān)如SGM3157Ron約0.8Ω寄生電容約5pF。5.4 防呆設(shè)計默認(rèn)檔位與絲印規(guī)范產(chǎn)品最終要交付給不熟悉硬件的人使用防呆設(shè)計至關(guān)重要。撥碼開關(guān)/自動切換電路的默認(rèn)檔位設(shè)為TTL模式原因是國內(nèi)嵌入式調(diào)試場景中USB轉(zhuǎn)TTL的使用率遠(yuǎn)高于RS-232避免用戶上電后發(fā)現(xiàn)設(shè)備無響應(yīng)誤以為產(chǎn)品故障。PCB絲印上明確標(biāo)注兩路接口的引腳定義用方框把默認(rèn)檔位圈出來。DB9插座旁邊標(biāo)注“2RX3TX5GND交叉連接”。排針旁邊標(biāo)注“VCC、GND、TX、RX”。這些細(xì)節(jié)不花成本但能省掉大量售后溝通成本。5.5 一個值得借鑒的優(yōu)化方向如果用MCU的GPIO去控制切換還可以在固件里做“自適應(yīng)波特率識別”。上電時MCU先不切換通道往兩個通道各發(fā)一幀0x55等待外部設(shè)備回包。收到回包的通道即為活動通道再鎖定對應(yīng)模式。這個思路比純硬件判別更靈活能應(yīng)對一些不規(guī)范的設(shè)備——比如某些設(shè)備空閑時TX引腳雖然是TTL高電平但在上電瞬間會有一個短暫的低電平脈沖純硬件比較器可能誤判而固件邏輯可以加軟件濾波忽略小于1ms的毛刺。這個固件方案我沒有完全落地因為當(dāng)前產(chǎn)品的硬件判別已經(jīng)夠用但如果你在設(shè)計一套通用性很強(qiáng)的串口切換板建議把MCU預(yù)留幾個GPIO出來為后續(xù)升級留條路。串口這東西看起來是幾十年前的“老古董”但真正做產(chǎn)品集成時電平適配、方向匹配、熱插拔防護(hù)每一環(huán)都有細(xì)節(jié)。這一次TTL/RS-232切換電路做完我自己最大的體會是切換電路的重點(diǎn)不在“切換”本身而在“切換前后信號完整性是否被破壞”。把這些細(xì)節(jié)逐個驗證到位這塊板子才算真正能用、耐用。