2023年3月11日 星期六

USB to UART (RS232/RS485) 故事與應用(二)

我發現我已經很少寫關於技術的文章了,尤其是 USB DIY 的文章。

之前第一篇也將近一年前的事了,而那一篇也沒講技術內容,就只是打混哈拉一下。

當然不寫深入的技術文章,一方面覺得科技日新月異,要寫也寫不完,更何況

現在網路發達,開源平台也多,有些東西我們也未必能寫得完整與詳細。

另一方面也是年紀大了,不想讓別人覺得我們都是倚老賣老的賣弄技術。

現在很多基礎的技術都已經成熟到可以打包成標準程式庫,是有些領域的基礎應用

底層也都可以完善到不需要人家還要辛苦地去鑽研...坦白講:科技技術就是如此。

所有的科技新知與應用都是建立在前人的成果基礎上的,就像我們以前念書時,

還需要每個人都去研究微積分、工程數學的所有原理嗎?知道怎麼用比較實際吧。

我相信現在的 USB 也已經走過我近二十年前寫的那些基本概念歲月了。現在只要懂得

怎麼用就好了。所以也就是我已經也沒那麼多動力再寫這些的原因了。

所以或許我們可以換個角度來想這些問題:就是這樣的技術在產品應用概念上或是

產品市場行銷上有那些值得我們回到技術開發面上可以重新檢視與思考的

戲法與手段人人都會變,但要如何變?才能贏過別人,創造產品與市場機會呢?

我們就拿這個案例(產品)來試試看,看能不能帶給你從技術分析角度來看產品與市場吧。

USB 轉UART (串口) 這個東西在現在系統上,已經是非常成熟的概念了。

反正現在電腦與相關主機平台也都不支援 RS232 ,但偏偏在許多產品應用介面使用

UART 卻是割捨不了的基礎應用介面,所以這種東西就永不退流行啊。

在市面上大家所公認最佳的 USB 轉 UART 方案就是 Silabs 的 CP2102 及 FTDI 的晶片。

但其實這兩種方案一開始都不支援USB 所謂 CDC (Communication Device Class) 標準。

這個在微軟作業系統上所對應的驅動程式為:Virtual Com Port (VCP ) Driver。

因為他們在微軟的作業系統上都需要另外安裝他們所提供的驅動程式。

(後來當然也有支援了啦,但好像大家還是習慣安裝原廠所提供的驅動程式)

我們就來看看這些有那些技術內容與差異性吧。

我們先來看 Silabs 的 CP2102 吧:(如果看不清楚,可以自行點選圖片,另存或另開視窗檢視)


他在Class 裝置描述就是 0x00 ,不屬於任何Class ,就是他自訂,需要安裝驅動程式的。


他在使用上很簡單:就是用自己定義的USB 介面(interface),也只用兩個Endpoints ,

而且都是 Bulk 傳輸,一個 Bulk-in,另一個就是 Bulk-Out 既簡單又明瞭。也用一般

很基本的64 Bytes 傳輸,反正現在USB 傳輸速率遠遠超出原來的RS232 標準。

不用講求太有效率傳輸封包架構。用個範例來看:


我就一個 byte 一個 byte 慢慢傳,你管我。

----

至於另一家 FTDI 的呢?


也是一樣:USB 裝置描述宣告class 為 0x00 ,自訂USB介面,也是要安裝自己的驅動程式。


一樣也只用兩個Endpoints ,而且都是 Bulk 傳輸,一個 Bulk-in,另一個就是 Bulk-Out 既簡單

又明瞭。如果是我的話,我也是會如此設計的。不要搞得太複雜的搞死自己。


在傳輸上,用自己看得懂的Payload 架構與內容,上傳 UART 資料內容。

很明顯的:0x01 0x60 這個資料傳輸的檔頭,就只有FTDI 他們自己底層驅動程式看得懂而已。

----

你說自己用這樣子屬於自己的介面架構來做產品開發好不好?對不對?其實...

這樣的技術概念不用問別人,自己簡單想一下就可以了,只是你自己要下去寫自己的

驅動程式就未必簡單容易了,因為這種東西可不是一下子就可以做到完全相容而不會

出錯的,因為你真的也不知道作業系統底層的東西(架構),人家微軟也不一定會跟你配合的。

所以只能透過市場上不同應用與客戶使用情況回饋來不斷精進與改良修正。

這兩家之所以能成功,就是一來做得早,二來真的完全掌握自己底層驅動程式核心。

如果你當初想靠配合微軟號稱符合的 CDC 的 VCP 驅動程式來做產品,不知道你會不會

被微軟出賣了?😀😂😂... 微軟在軟體(尤其是底層架構)改版時是未必要通知你或昭告

天下的,是你們的產品要配他們的作業系統,而不是要微軟配合你的

或許現在最新系統下可能已經很穩定了,但這家公司的產品作法也完全回不去了吧。

但這樣子作法還有一個非常好的面向:就是可以透過自訂的介面與命令語法,來支援一些

特殊使用環境與個案,譬如:FTDI 的驅動程式不只可以做 USB 轉 UART ,他還可以拿來

做作一些所謂的USB 轉 IO ,甚至是 USB 轉 並列埠的。這部分以後有機會再來分享。

另外一點就是:其實他們都是埋了一顆 MCU 來處理這些介面傳輸與應用的。只要能透過

自己的驅動程式來操作的話,其實也是可以拿來做為本身系統的系統更新升級的

因為你真的不知道你的產品未來在市場上會不會再碰到一些你所沒遇過的情況?

雖然這種機會會隨著時間的演進,系統更新的機會會慢慢的變少。但在過去剛開始的

那幾年或那些階段日子裡,已經更新多少次了,我們也不知道啊。

但這一種在系統上保留的做法肯定是不會少的啦。沒有一個系統工程師或團隊,有這麼

自信的說:我可以一次搞定所有介面相容性問題。尤其這一種千百種應用介面與環境的。

---

好了,以上兩種就是我們常看到的產品情況,當然啊~現在 32 位元 MCU 效能又好,

又方便,所以有些MCU 原廠就會直接提供所謂的標準支援Virtual COM port 驅動程式的

USB CDC 韌體程式給你,讓你在MCU 應用上,不需要再透過這一種 USB 轉 UART 的

方式,就可以直接透過MCU 上的 USB 與電腦以串列埠方式直接連線了。

我們也來玩玩看吧。我是用最普遍一般的 stm32F103 的小板子,也來做一顆屬於自己

的 USB 轉 UART 介面晶片方案吧。


 上圖照片是我實驗的環境平台。當然還是要用USB 分析儀外加示波器。

你說只要用原廠標準參考的程式庫,架起來就可以馬上跑起來嗎?別騙人了吧。

沒有這些周邊輔助的工具儀器設備,怎麼會簡單呢?至於要如何進行除錯與完成?

那就是需要時間的,等你有機會自己玩到一個程度能力就可以了,這都不難:

我說過,只要老闆有薪水付給你,又願意給你時間鑽研多摸摸就可以了


我用的是原廠 STM32_USB41 這一版的底下:Virtual COM Port 範例程式來改的。

他跟 4.0 略有不同,但基本上是大同小異的。要用 4.0 版也可以。

為了開發除錯,我們可以另外 stm32 上另一組 USART2 來當我們printf 介面,再透過

上述Silabs 的 CP2102 來把printf 內容傳出到超級終端機上。我們也可以從系統初始化,

可以看到有兩組串列埠:COM5 (CP2102) 及 COM6 (USB 串列裝置) --- 這個就是我們在

stm32 USB 系統平台上完成的 Virtual COM port 了。我們可以先把這個串列埠上的TX/RX

短路再一起,就可以看到:當我發出"A" 時,同時也可以收到"A"。(右下角那個SSCOM

軟體操作內容)。

我們就來看看USB CDC 的裝置描述:


我們可以看到分析儀裡看到的就跟我們韌體程式所宣告的一致的。這部分你也可以參考

USB CDC 規格書裡的第四章節。Rev 1.2 (2007)版的就可以了。你想這肯定比Silabs 或

FTDI 產品時間還早,但他們還是採用了自己撰寫驅動程式...我們可能推論的在上述中。


基本上 USB CDC 有兩組 class 的 Interface。第一組其實在我們一般USB 轉UART 也沒用的。



這組Interface 只用到一組 Endpoint, 而且還是 Interrupt。 為什麼沒用到?稍後會跟你解釋。

第二組 interface 有兩組Endpoints :分別為 Bulk Out(Tx) 的 Endpoint 3 及 Bulk In(Rx) 的

Endpoint 1。看起來是不是跟人家Silabs 及FTDI 的作法一樣?

很簡單:USB 傳輸的觀念就是如此。規格就是白紙黑字--- 無庸置疑!

我們再回頭檢視一下我們韌體程式裡的寫法:


程式就只有對應的 EP1_IN_CallBack (Rx) 及 EP3_OUT_Callback (Tx) (方向是以主機(Host)為主)

也真的沒有Interface 0 中的那個 Interrupt (EP2) 對應程式碼。所以是用不到的。

而在 USB CDC 裡常用也只有三組Class Command :(在規格書裡的第六章)

SET_LINE_CODING/GET_LINE_CODING/SET_CONTROL_LIN_STATE。

為什麼?也沒為什麼,就是看微軟作業系統VCP 驅動程式怎麼定義或執行而定的。

他們還會埋什麼地雷?不知道,等碰到了再說。怎麼用?很簡單:


當我們在主機上要更改RS232 的傳輸協定時,

VCP 就會先下一組 SET_CONTROL_LINE_STATE。用來將RTS/DTR 的狀態解除。

然後再下Get Line Coding,來檢視一下目前的傳輸協定是什麼?


然後就可以透過 Set Line Coding 來修改更新傳輸協定,然後再讀回確認一下。

至於在這兩個命令的資料內容格視為何?如下圖所示:


那你說:Silabs 或FTDI 怎麼做的?他們既然都是用自己的驅動程式,那肯定就是用自己

定義的 Vendor Command 了,不用看想也知道的。

那我們緊接著就用同樣的傳輸方式來檢視一下結果:



它在 Bulk-In 的Endpoint1 裡就真的純粹就是你 Rx 的內容資料而已。

好了,我們簡單的實驗完成了。

-----

從這樣的產品技術分析完之後,你可以想到怎麼樣的產品規劃與市場應用了。

好,你說我可不可以利用 VCP 來做個標準的USB 轉 UART 的產品來賣?

個人覺得很難,第一:市場已經被那兩大品牌 Silabs 及 FTDI 所瓜分了,剩下的就是

你跟其他小廠對賭了。而這些小廠都是以拚量、拚個價格為主的,你的成本怎麼拿捏?

況且我們從技術面來看:人家提供這個 USB CDC 範例給你用,也只不過提供一個

技術選項給你使用(可以在系統上省去那顆USB 轉UART 晶片成本),但並不代表

它就完全沒有提到的任何相容性問題,我們剛剛範例中有提到關於RS232 中的 RTS/DTR 

等其他訊號的控制方式嗎?你以為USB 轉RS232 就只有 Tx/Rx 而已嗎?當然不是的。

你以為我當然剛開始做USB 時,IC 設計公司的老闆沒有想到這個?在旺玖(PL230x) 之前

我們公司也有投入相關產品企劃與人力資源...但最終因為一直搞不定相容性問題。

就在VCP 與完善自己的驅動程式技術之猶豫與掙扎。而最終告吹了。(約 2002 年 左右)

另外一點:我們之前也描述過了,如果你的產品就只是單純應付VCP 來完成串列埠的

Tx/Rx 的話,也太小看市場應用範圍了吧?人家除了基本的這些市場以外,還有許多

透過這樣子的驅動程式架構,同時也支援 USB轉 I/O、 USB 轉 I2C 、USB 轉 SPI 或

USB 轉 並列埠等等相關應用市場。而且還不一定全由原廠提供完整方案,像 FTDI 

就提供簡單的 USB 轉 IO 的標準範例,讓你透過他的驅動程式來控制它IC 的IO 來

做任何 USB 轉換應用,你就可以自行寫上層 APP 應用程式就可以了。

這部分有機會我也可以寫一些文章來示範給你看,技術可以讓你玩的東西太多了啦。

---

這部分又牽涉到公司在技術人力上的考量了,一般人尤其是台灣科技公司都比較喜歡

找寫韌體、弄硬體的工程師,因為這樣子可以很快地看到硬體產品的產出與價值。

老闆可以馬上製造銷售換業務績效與現金營收。搞應用軟體?還要聽你一天到晚解釋

為什麼老是有相容性,不穩定的軟體問題。你覺得老闆有那個耐心嗎?你不能怪老闆,

你應該更擔心自己的飯碗還保不保得住啊?😂😂😂

所以同樣的道理:台灣工程師的想法就會跟著市場需求走:連我那個工作過回學校念

資工軟體的兒子都說:如果工作時,公司要他去寫嵌入式系統或韌體,也是可以的。😄

---

你自己想想:網路上當然充斥著許多標準範例程式給你抄襲與應用,對我們來說

要很快的架構出我們所需要的東西很快,但要真正的達到老闆或業務的產品需求

與規格樣貌時,其實還都有一些細部調整的空間存在,但往往就會造成老闆或業務

跟工程部門在認知上的落差:你都已經明明從標準範例裡都說沒問題了,為什麼

要導入量產出貨時,還搞不定呢?這個問題要算誰的?這個成本要算誰的?

所以我才開玩笑說:玩技術真的不難,但人家付你薪水的老闆或客人願意給你多少

時間或多少資源搞技術?

從公司經營績效或市場需求來說:到底是你玩(搞)技術?還是技術玩(搞)你?

所以我才從經驗裡,很務實地告訴你:有很多新產品、新技術,為什麼許多公司

或許多新創團隊搶著做?因為這個階段是允許你學習犯錯的,我學USB 時,就是那個

時空背景。而當整個市場成長穩定之後,你學習成長的空間就會被壓縮了

---

簡單結論:我們要來談技術,一行一行的交代程式碼的內容與意義,真的不難,你也

不用在我的部落格或文章裡去期待這些。因為這些都屬於你我在工程師職場生涯裡所

必須歷練成長的過程。更何況在浩瀚的網路世界裡要找到這些東西也不難。重點還是

在於如何轉換成屬於你自己的技能或優勢。但之後,你也不可能一輩子永遠在追求這樣

的技術學習成長,而最終最佳的就是把這些技能與優勢轉換成真正可以為你工程師職場

後半生的日子帶來簡易輕鬆的技術人生。陪你在工作與生活中取得一個平衡點。

每個人工作到中年之後,都會多多少少幻想著自己未來的退休生活,那很簡單的

去思考一下:你現在做的跟未來有什麼關聯性?

 這些都是我常常在文章所透露的訊息,拿技術出來說嘴,或許也只不過想賺賺別人

按讚數而已,去追求肯定自己的成就感而已,這把年紀(快六十了)真的不需要了。

我想的就只是能不能把自已辛苦走過的工程師歲月與經驗分享給年輕人,

讓他們也有個參考依據,早做安排準備。

至於我個人呢?我的技術所能做的已經夠我未來十年內享用了。我都已經告訴我自己:

過了六十幾之後,能儘量不要開車就不要再開車了(現在全家出門的時候,我們兩個

老人家都是陪著我們家的狗坐在後座的。)


當然要找到一些可以做的產品還是可以的。畢竟經歷這麼多年的經驗,

客人也一直希望我能開發一些小玩意兒給他們銷售,這一點應該也沒什麼問題的。

有客人通路市場願意買單就可以了。

現在年紀我的人生哲學是:多一點感恩,少一點抱怨。人生可以更輕鬆精彩的。

分享給各位吧。

8 則留言:

  1. https://unjavascripter.github.io/web-serial-example/
    可以用來測試是不是有連上,STM32內建的VCP是可以看到。
    原先我想在家建個server,別人就可以用VCP連上去通信。後來架站要用https我就不會用了。不然可以將發展環境放家裏,或是測試輸出丟出去。只是沒有時間去弄出來。

    回覆刪除
    回覆
    1. 以我目前的年紀,或看過、經歷過的產品開發,
      個人認為許多一般的技術內容都沒有太大的挑戰度。
      只要一般人有心、有時間...應該都沒問題的。

      只是這些技術或他的Know-How ...未來怎麼整合成變現的要素?
      就真的要花一點心思了,不是技術,而是從市場行銷看這些東西。
      IoT 叫得滿天飛...或許都是隱含在新的市場產品中。
      所代表的可能就是整合這些小玩意兒的東西而已吧。

      刪除
    2. MCU經USB連到網站這技術我在數年前就將資料交給某人去做。但某人自己設計新的MCU核心,設計完成後又去設計自己的網站,經過三年後告知我網站設計快好了,但他不知要如何測試,因為個人工作室省錢沒有租網路。除了MCU核心外他還設計自己的高階語言,聽說相容於數語言,C, assembly還有其他,都是一人做。我曾對他說,計畫太遠大不是一人可以做的,但他說這一輩子他只想將這些都做完,並不想經手他人。
      工程師都很死腦袋。沒有去網路上看看,就想用自己的方法做。
      這件事使得我去推導智能是什麼? 想了數年對於AI及靈魂都有可以解釋的方法。AI和靈魂本質是不同,但就計算理論來說是相同功能的東西。若是,植物其實也有智慧,只是它要解決的東西和我們想的不同。

      刪除
    3. 三年多不容易啊。
      我們就簡單算一下:算你一個人所有工程技術都你包,
      一個月薪水要算多少才合算?如果沒有後續的商機與營收在未來一兩年
      加倍回收的話,還要拖多少?
      好,換個方式討論:就算今天有慧眼的投資者欣賞你的技術或產品。
      你覺得這三年的代價要跟投資者收多少錢?(先不要談技術股這種
      你可能都還搞不清楚怎麼算耶~)...沒有後續的資源協助你的技術轉入
      商轉。那做這麼多的技術研究開發的目的是什麼?
      自己爽就好?...
      講一句難聽一點的技術分析好了:你辛苦的做這麼多,如果真的有
      那麼好賺的話,你認為人家公司聚集研發人員團隊,要花多少時間
      就可以追上你呢?(更何況還你所描述的:自己設計高階語言?有比較
      厲害或必要嗎?...)
      一輩子就只想將這些做完?那你的家人(父母、妻小等...),他們算什麼?
      不要看到李安導演那個老婆養你六年的故事。就以為天下的女人都是
      那樣的,更何況:人家是美國那個開放的社會...
      ---
      搞了老半天,都還不知道怎麼驗證測試?
      我之前文章說過了:如果產品或技術,只有研究開發,沒有驗證測試,
      那就是學術研究、實驗室裡的東西。離商業產品還有一段很長的路要走,
      而且還要花更多金錢、物力、人力與資源。這幾年我也做了不少 ISO17025(針對測試與校正實驗室能力的一般要求)相關工作。
      這種測正與校正實驗室的認證工作,著重的就是人員素質與儀器操作
      流程等等。就算你要擺在網路上的量測數據資料庫,你怎麼說服人家
      相信你上傳的資料數據是有所依據與具有公信力的?

      真的~有空也勸勸你朋友:有那個工程研究精神很好,但有空還是要
      多想想技術以外的人事物吧。不過,當你這麼誠意地跟他建言的話,
      他可能以為你在唱衰他,小心他會封鎖你的。

      AI可能會取代你的工作,但取代不了你的靈魂。
      但如果搞產品技術開發都只有滿腦子技術邏輯,沒有策略思考的話,
      小心下一個先會被取代的就是你了。

      刪除
    4. 現在創業也和以前不同。環境不同可以用的招式也不同。我那個朋友以為上市就要是完美產品,他的技術很好,所以看不下別人的設計。
      但現在網頁是成長式的,公司創業也可以是成長式的。東西做一半可以先用CG做一個宣傳,有工程樣品,就上眾籌開始先賣看看。這些我都說過,但他說網路太毒會污染人心,他從不上網做事很專心。MCU從寫FPGA,組合語言到高階語言以及整合式開發都做出來,這個過程就花了十年。然後發現沒上網很難賣(他去過很多賣MCU的公司賣他的IP,沒人買單),又花了三年自己寫網站。他很年輕就開工作室,對我來說早已進入退休模式。我也是看到他才去思考公司是什麼,怎會有人這樣開公司?才對公司的功能去了解。

      刪除
    5. 自古文人相輕。
      看不下別人的設計或聽不進別人的建言,最大的損失是誰?

      現在環境真的跟以前差很多了。別的不說:就以現在房地產來說:
      在大都會市區內的蛋黃區。動輒兩、三千萬的房子起跳。
      你跟我說:不要說你領薪水的怎麼買?
      那要開公司來創造機會,你還可以容忍不賺錢的給他燒個N 年嗎?
      --
      你在描述這個情形,我似乎好像有碰過這位...在一些社群論壇中,
      也一直鼓吹MCU 設計多簡單,他有甚麼偉大的想法與創意...
      但你我都很清楚:MCU 要成功就指光靠架構就可以嗎?

      不用管開發工具平台?市場行銷推廣?我們就當他是唐吉軻德看看
      就好了啦。說服不了群眾,也沒辦法培養出廣大的信徒...
      不管你技術有多好啦,你怎麼當個改革革命家?pioneer ?
      講難聽一點:你還比不過最近新聞很紅(Netflex紀錄片裡)的那個韓國
      那個攝理教教主。
      記得我說的:你想創業,就不要先講技術,你可以先闡述發表一些
      主義或教條,看看有沒有多少信徒相信?過不了這一關:你未來
      也就沒辦法找到奧援的金主或說服市場消費大眾(行銷手法)。
      至少你也要先說服一位行銷業務夥伴吧。
      耶穌沒有信徒、孫中山沒有擁護的信眾、媽祖沒有虔誠的香客等,
      你怎麼會有影響力呢?道理都是一樣的啦。

      刪除
  2. 透過自己的驅動程式更新,還能封鎖盜版晶片

    回覆刪除
    回覆
    1. 防盜(防仿製)晶片,對這些晶片商來說:也是不用其極啊。
      透過軟體支持防盜方式也是一種。

      謝謝你提供的意見與看法。

      刪除