R20190525 FTDI 高速UART的應用(1) 2019-05-25 黎煥欣
在所有 PC 控制週邊設備時, 當開始考慮每秒穜要幾個資料時, 就是我們要考慮資料流量 (Throught put), 或用另外一個說法, 資料頻寬 (Data Bandwidth). 這其實與我們現在常說的手機可以多少下載一部影片之類的意思是一樣的. 也就是單位時間內能接收或傳送多少筆資料, 這裡有非常多種單位, 常常會搞混. 我個人覺得最實際的單位是 Bytes/sec 或 MB/sec (注意 B 是大寫表示 byte), 直接表示一秒鐘傳送了幾個 “英文字母”, 而在描述傳送媒介的時候, 常用的是 bits/sec (每秒傳送幾個位元) 及 baud (每秒可轉態次數). 這些數字常常混淆.
回到 PC 控制週邊的課題, 最早的是用 ISA BUS, 它是 8-16 bits 的平行界面, 也就是一次轉態就可以傳送 1-2 bytes 的資料, 它的轉態速度是 8 – 10MHz, 也就是有 8 – 20Mbytes/sec 的頻寬, 以經相當有用了. 但它的古老, 要拆機箱, 資源有限及手動設定等問題, 在現在使用者無法管那麼多的情況下, 就轉到在機箱外可以熱插拔, 自動組態的USB 了, 也順帶解周邊供弱電的issue, 現在成了大多數週邊最常使用的界面. 而它的傳輸速度從 ver1.x 的 1.5Mbps (Mega bits/sec) (Low speed), 12Mbps(Full Speed), USB 2.0 加入了 480Mbps (High Speed), High speed 是 USB 可以接儲存及影音設備的原因, 因為大受歡迎, 所以下一代更高速的 USB 3.x 也推出來, 可以到 5Gbps, 但結構其實是 “曡” 上去的, 所以真要用到它的超高速功能, 所有的硬體要完全搭配才行, 這也是 USB 3.0 裝置常出問題或自動降速的原因, 所以這裡就先不管 USB 3.0 了.
USB 的硬體非常簡單, 兩條電源線及兩條雙向差分資料線, 它的功能完全建立在極為複雜的傳輸協定上, 複雜到它的手冊印出成本可以 K 人. 所以早期USB 的操作要作為開發對像對 RD 人員來說有障礙.
再說到 RS-232, 這個在早期PC 中都有的界面, 原始是在1960 年代電傳打字機用的界面, 從 25pin 的大型接頭, 後來挑出真的會用到的信號, 變成9pin 接頭, 但在傳輸資料時, 真正重要的只有輸出入兩條線及地線, 其它的信號原則上是 GPIO, 而現代的 RS232 週邊再減到至只有三條線, 統稱 3 線式RS232. 傳輸的位準是 +-5~12V, 與一般的 TTL 5V 或 3.3V 不合, 必須要轉來轉去, 現在就很多人不轉換位準了, 直接拿 TTL 位準傳送, 而原來RS232 的傳輸協定, 被稱之 “通用非同步傳輸協定 Universal Asynchronous receiver-transmitter UART” 套到TTL 上, 就變成了 TTL-UART, 現在成為最常用的傳輸方式與界面, 而在這個基礎上, 再發展出RS485, RS422 (PHY level), RS485 再發展出 CanBUS, ModBus , DMX (傳輸協定第二層), RS-422 再發展出SSI (編碼器傳輸協定) 以及UART 變型為 1-LINE 等. 可以說是串列傳輸的大祖先. 但最容易使用與了解.
UART 的傳輸就是兩邊先說好傳輸的速度, 就著就以一方變成L 電位一個 baud 的時候開始, 接著傳輸資料, 再來是一個或兩個 “結束” 的高電位結束一個位元組的傳輸, 如圖
簡單易懂. 所以 UART 變成界面傳輸中一個基本的標準, 而各個語言, 也直接提供操作它的軟體界面. 像 VB 中的 serialport object. 這使得 UART 變成PC 外控週邊的軟硬體開發的首選. 而且因為它的本質設計, 它也有有限的 “Hot plug” 能力.
時至今日, D-9pin 也變成太大了, USB 本身的特質使得它可以 “變身” 為多種週邊, UART 或 RS232 就成為它變身的主要項目. 而 USB 轉 UART 晶片把一切USB 的複雜轉成UART 的簡單信號. 也有很多晶片商開發了這種晶片, 在這些晶片組中, 最貴卻也是相容性最好的就是 FTDI 公司生產的各晶片. 相較其它公司的晶片, 它的軟硬體整合度最好, 雖然它是最貴的, 但在相容性及可靠性上, 一直都是掛保證的.
在早期的 RS232 儀器界面上, 資料的傳輸速度一般取最快是 9600 baud = 9600bps (在這個場合, bps 與baud 是同值, 在無線傳輸中它們不一定同值). 它最快的傳送率是 9600/(1start + 8data + 1stop) = 960 Bytes/sec = 960Bps. 在讀取 DMM 或溫度計之類的一秒幾個數字還可以, 但要做高速即時的控制或讀取, 這樣的速度是遠遠不夠的. 於是在不改動傳協定的基礎上, baud 變快就是增快速度的辨法, 9600 的倍數 19.2K, 38.4K, 57.6K, 115.2K 就定義出來了. 在用傳統的 RS232 位準 +-5~15V 的操作中, 115.2K 是它的極限, 再快功率消秏及正確率就會出問題了. 但在 TTL UART 這個問題就比較少, 所以再上去就有 230.4K, 460.8K 及最後面的 921.6K, 以及非標準9600 倍數的 128K 及 256K (DMK 及 CanBus 用的 baud). 在921.6K 上最快的傳輸速度大約為 90K bytes/sec. 對很應用, 這樣是可以了, 所以很多晶片商的 USB-UART 轉換晶片的上限就到此為止.
FTDI 開發最高市佔的晶片 FT232R USB-UART 晶片用起來非常簡單, 如下圖由它的 datasheet 中的接線圖, 接個電源, 幾乎沒有什麼外部元件, 就直接有TXD, RXD 及其它 DB9 RS232中可以用來做 GPIO 的信號就出來了, 外帶兩個可以做為 TX, RX 指示 LED 的信號. 我就用它做我的計劃中與週邊傳送資料給 PC 時我就用 921.6K 做為傳輸速度. 而在 PC 端的程式, 它的 VCPI Driver 就會把它變成一個 serial port, 將它的 baud rate 設為 921600 就可以了.
但在仔細研究它的 datasheet 後, 發現 FT232RL (RQ, 不同包裝) 的 UART IC, 發現它的最高 baud 可以到 3Mbaud, 而且也有 1M 可以選. 3Mbaud 表示一秒中可以傳送 300Kbytes/sec 的資料了. 就這在絕大多數的應用中就夠了. 而且它與我後來選用的單晶片的 UART port 最高 baud 剛好配合, 於是 3M baud 就變成我的 I/O 開發板與 PC 之間的標準速度. 下圖是用 3Mbaud由 PC 送出一個命令, 而由單晶片回復資料在邏輯分析儀上的波形, 可以看出整個動作傳送了 18 個字元, 包含傳送及單晶片執行命令, 花的時間小於 100us
所以 FT232RL 就變成我用的單晶片開發板上的基礎元件了. 而用 3Mbaud 操作 I/O 變成我標準操作模式.
但 3Mbaud 當然也有它的限制, 也沒有到 USB2.0 Full Speed 的限制, FTDI 又陸續開後一些後續的晶片, FT4232H 是變出4 個 UART. 一個主要的變化是 FT245, 它是平行 8bits界面輸入, 而後轉成 USB ,而在PC 端虛擬成一個 serial port. 按照規格書可以達成1Mbytes/sec 的傳輸, 這相當於 10Mbps 傳輸的速度, 而後來的 FT2232H 及 FT232H, 在UART 模式下, 可以到 12Mbps, 另外還有3M, 6M, 8Mbps 可用, 不過我沒看到有什麼 MCU 支援. 而它們的 245Async 平行界面, 可以到達 8Mbytes/sec, 這己經到達 ~100Mbps 的速度了. 而 PC 端的程式還是可以用 serialport 的程式去操作它. 這是一大進步.
留言列表