2021年8月28日 星期六

STM32_USB_DIY(七)---MSDC 介面系列二:Enumeration

來講講關於 USB 中 MSDC(隨身碟)的系統應用問題---Enumeration。

一般我們在系統上會支持USB MSDC 的話,就是希望我們的系統檔案

與 HOST (PC)端能夠兼容共用,這樣子的話,我們就不用再管傳輸介面

與系統應用軟體(因為可以直接用PC 上作業系統的檔案管理員)。

但如果針對USB MSDC 介面來說:可以不用管所謂的FATFS 的。

原因可以參考前一篇的圖示說明。而實際上,我們Device 端在實際上

就還是要整合 FATFS 的,除非你是單純搞USB 隨身碟或讀卡機。這樣子

你就知道市面上這些產品在開發成本上多便宜了吧。

以前沒有 32 bits MCU ,搞一個FATFS 是很辛苦的,就算現在用一般

32 bits MCU 也不一定就很強了,因為這些File system 說起來也是很吃

系統資源的,譬如:到底是支援 FAT32 呢?還是其他的?還有要不要支援

多個檔案同時開啟使用?等等,所以在實際應用上,我們還是會依據我們

系統應用的條件,給這些 FATFS 作一些某種限制條件的。這當然也會限制

我們在USB MSDC 在系統應用上的考量。而其中有一個看似簡單卻是讓

許多搞USB 的人搞得不清楚的地方。那就是 USB enumeration 過程

一般當USB 裝置一插入Host (PC) 上之後,Host 就幾乎就馬上接手你的FATFS。

這時候,你根本沒機會在系統上管理你的FATFS 了。這往往會造成資料流失

或是造成你系統上 FATFS 錯亂。舉一個簡單的例子:以前我在IC 設計公司搞

MP3 隨身錄音撥放器時,如果你正在錄音存檔時,偏偏這時候:你的客人把

你的MP3 隨身錄音撥放器插入電腦時,如果你沒有完成那個錄音檔案的 

Close File 動作時,一來你的錄音檔案資料會流失之外,也會造成FATFS 的

不完整性。只要客人手賤的玩你的產品幾次,你的FATFS 肯定就掛了。

所以當這種情形發生時,你的USB 管理程序就非常重要了。

當USB MSDC 裝置插入PC Host 時,你一定要先檢查及完成系統(尤其是FATFS)

檢查與管理之後,你才可以允許USB 裝置進行 Enumeration

這一部分就是會牽涉到硬體上的支持,所以一般如果你只是單純搞軟體的人,

你就得多了解一下囉。我之前在

"Hinet 網頁系列 --- USB DIY 系列(七)---USB DIY 講座 (五) Enumeration"

這一篇文章中也有稍微提到這一點,當然這是十幾年前寫的東西,但你覺得

這一部分經過十幾年有任何改變或改善嗎?



這是我十幾年前貼的照片。我們就得另外找兩隻 GPIO 來完成這件事。

接下來這是我準備在這 MSDC 介面系列所要採用的示範硬體板子:


這是非常常見 stm32 Blue pill,一般人是拿這個玩 Arduino 啦,但我們不是那一種

不懂電子系統的人,只拿這個東西玩玩 Arduino,我們就只好藉由這個容易取得

的硬體搞一些測試驗證平台。所以在上圖中,我已經在外部加了一顆 Serial Flash

拿來當作我們USB MSDC 的儲存裝置空間。但這一塊板子在USB 硬體介面並沒有

考慮到我們上述的USB 插拔問題:


我們可以看到他在 USB+ 上直接接了pull high 電阻,這個就會讓USB 一插入

PC 時,就馬上就會進行 Enumeration 了。當然啊,如果你是一般USB 裝置,

又是Bus Power 系統來說:這是沒問題的。但我們要講的例子不是。

(其實這個pull High 電阻也不對啊,一般在USB 硬體規格裡,應該是 1.5K才對)

而在 stm32 原廠所提供的USB 範例程式呢:


我們就可以發現:他還是得用額外的 GPIO 來控制這個啟動 Enumeration 過程。

但在這之前呢?你還是得偵測 USB 在硬體上的插拔動作,那要不要用一個

硬體中斷?還是 GPIO polling 方式?就看你的系統應用需求。就連他家自己

的開發工具:ST link 的USB 的系統應用電路也是長這樣子的:


你看到沒:他Net Name 就是取 USB_RENUMn... 控制及啟動Enumeration用的。

其實,這一種USB 應用是非常常見,而且在系統上真的有這樣的考量與需求的。

而在USB 控制IC ,要不要在硬體架構上支援這樣子的系統應用需求,就顯得

IC 設計者在與系統開發者之間的種種良好互動與考量。

我最早開始使用外面市售標準 USB MCU 是 Silicon labs 的 C8051F32x 系列,

我就發現他這一點就做得非常好,也難怪這一顆IC 在系統應用上,創造了

一顆在市場非常優異且有非常高市佔率的 USB 轉 UART 的 CP210x 系列。

他不只整合了上述所需的GPIO 之外,他就連USB 的 5V 轉 3.3V 的穩壓IC 

也幫你搞定了:






這樣的USB 系統在硬體上多精簡啊。

而在IC 的內部設計上也有相對應的設定與調整:


就是這一項暫存器值,可以處理上述那個GPIO 幫你 Pull-High 1.5K 的問題,

至於USB 插拔的偵測,他也提供了一個特別中斷向量位置給你:

--

所以呢,這家公司在後來出了 ARM Based 32 bit MCU 也承襲了這個設計概念:



-- 

不過,不管如何,不是每一種USB 系統都是當 USB 一插入 PC (host) 時,

你就得趕快執行USB 的相關韌體工作,有時候,你系統真的需要先執行

一些系統上所必須先完成的工作,再來執行USB Enumeration 工作。

所以在系統上你就得搭配以上文章所提到的幾個 I/O 控制來完成這一件事,

當然除了這個以外,其實USB Device 也是可以做到所謂的軟體插拔,

(Soft Connect/Disconnect)。他們靠的也就是這些 I/O 的搭配使用,而這一部分

最常見的就是系統韌體程式是透過USB 介面來完成系統韌體程式更新升級,

(IAP/ISP 功能),當我們完成系統韌體更新時,我們就可以透過這種方式

重新進行系統重置(reset) 及 USB Enumeration 工作。

---

USB 系統應用雖然大致上都是那幾種基本的 Class 應用層次,但實際上,

在真正的系統使用環境上與應用上還是有許多千變萬化的技巧與手法,

往後我會陸續整理撰文說明的。

下回我會實際在 stm32 blue pill 上完善一個簡單的USB MSDC,就是一個

隨身碟裝置,然後也可以在這個環境條件下,透過PC APP  軟體,以USB 

特殊命令來控制這個USB 裝置的IO 等功能。下回見。

(待續) 

沒有留言:

張貼留言