2011年10月28日 星期五

USB 轉RS232/I2C/SPI ?!

其實很巧的是,我原本最近有用到USB 來做一些信號資料轉換,

而好友這兩天也發表了一篇關於MODBus 的文章,就在昨天還有通路商的

FAE 也問我一個問題:可不可以把一般Keil C 語言中的 printf() 轉換成USB 介面?!

(註:一般Keil  C 中的 printf() 是把相對應的字元透過UART 之Tx 傳送出去的。)

之前也一直有人問我關於USB 轉 I2C 或SPI 的問題。

所以,我才想到說:關於這一種簡單的介面轉換似乎還是許多人經常會碰到的,

尤其是之前我都會勸大家為了簡單、省去麻煩,就直接買一條USB 轉RS232 的

線回來就好了。但是實際應用卻又常常不需要這麼麻煩的接線方式。

譬如來說:之前我有寫了一篇關於園區RD 最夯的一塊PCB 版子。其實大家會用到的

RS232 也都只是用到 Tx 與Rx 而已,但實際一般USB 轉RS232 是要真正做到

標準RS232 的所有接線規格的:(如下圖)

-----

所以,不免就得先在我們系統應用版子上先用一棵UART 轉RS232 的IC ...先轉成

RS232 再轉回一般TTL 的Rx/Tx 給我們的USB 控制IC...簡直就是脫褲子放屁。

而實際上要真正做到RS232 的規格...上圖的每一支RS232 的定義腳都要做到很精準。

所以,其實USB 轉RS232 的IC 也不好搞,也是會有相容性的問題。

像SiLabs 的USB 轉RS232 也是拿一棵標準USB 控制IC 來寫韌體的,搞了老半天

還是都會有一些相容性或水土不服的問題。您不知道?!可能您也只是用到Tx/Rx 而已吧!

據說後來大家公認比較好的USB 轉RS232 的控制IC是 FTDI 的...

----

但是基本問題是什麼?!我說了也不過為了 Tx/Rx 兩隻腳而已,更重要的其實還是

在資料傳輸中的資料內容/封包...或是像上述那個MODBus 的命令列的支援。

所以,我認為還是自己辛苦一點:與其用別人的USB 轉RS232 控制IC,

還不如自己拿標準USB 控制IC 來自己寫一個應用轉換功能。這個道理跟所謂的

USB 轉I2C 、USB 轉 SPI、USB 轉 JTAG 或是USB 轉DMX512 等道理是一樣的啦。

像我所說的:I2C 、SPI 、JTAG或是DMX512 等,他的電器規格或是一般

UART 的BaudRate 等其實他們基本電器規格都很簡單的,他們這些介面

最複雜的是來自於他們本身所處的系統應用環境與條件,譬如:您要用I2C /SPI 

來下命令?讀寫資料?!或是有其他的特殊功能目的?!這些都跟您的系統應用息息相關。

譬如我上回提到的

USB HID 技術散記(三) --- 系統干擾問題

他就是得在USB 控制IC 的韌體上,處理與解決資料傳輸的問題,而讓系統更穩定。

當然啊...USB 的傳輸速率與這些I2C、SPI 或是JTAG 等的頻寬一定是不一樣的,

您的USB 控制IC 的韌體得一定要同時處理USB 傳輸管理韌體,也得要兼顧

I2C、SPI 或是JTAG 的資料傳輸或記憶體FIFO 的管理控制,如何最到資料傳輸

同步問題,的確是一大考驗。

很多人問我這一個問題該如何?!其實這些都需要一定的系統經驗的累積與許多

周邊輔助工具協助的,譬如示波器或是USB 分析儀等,甚至還要在PC 端寫一些

簡單的應用程式來測試與驗證結果。---所以,要有效率的搞好這些東西,

基本上,最好可能要自己能掌握韌體,軟體與驅動程式的初步雛形。

至少我自己本身也都是如此的,否則,您會因許多不確定因素,

造成自己心理上的障礙與瓶頸....也間接影響到您自己對工程問題解決的自信心。

---

那您會跟我說:本公司講求專業分工,管韌體的不必管驅動程式,而上層應用軟體

還有另人專業處理...是的,既然貴公司的人力規模這麼優,那應該就不用來問我了。

或是您跟我說:我只懂得寫PC 軟體,或是我只會寫單晶片韌體...那怎麼辦?!

那您就是走錯公司了,您應該到剛剛那一家公司才對,這麼命苦幹嘛?!

但是事實上就猶如賈伯斯所堅持的軟體與硬體相對應整合還是需要的啦。

這一點就得從您自己做起吧!...

------

像SiLabs 的USB 控制IC 譬如:C8051F320/F321 或是C8051F340 都有整合

I2C/SPI/UART_Tx_Rx,乃至於 PWM 都有...您的應用又不是要做到像標準

的RS232 每一隻腳為的精準控制...還是自己辛苦一點,自己開發USB 韌體程式吧。

(備註:如何將Keil C 的printf() 導到 USB ?!這個問題,其實很簡單,

在韌體上,但如果在系統整合上,其實沒那麼容易,因為您根本不知道

人家在 printf() 函數的引數裡會用多少字串長度?!您怎麼擔保這些

字元字串可以有效的、精準的傳送出去呢?!而您PC 端的接收程式

又該如何處理這些FIFO 呢?!....這些都系統整合的小細節,

就像Godspeedlee 小老弟的文章所述:

"假如我們要傳送的封包是可見文字與二進位的混合時該怎麼辦?"

做起來都是不簡單的故事。

 

  

 

 

沒有留言:

張貼留言